TCPClient没有网卡能用吗?
Is TCPClient usable without a network card?
我正在使用 TCPClient
和 TCPListener
在同一台计算机上向应用程序 运行ning 发送数据。我的目标是 Framework 4.5,因此 运行 上的应用程序 Windows Vista SP2 及更高版本(如果我没记错的话)。
我为此使用了非常简单的代码:
客户:
Try
Using c = New Net.Sockets.TcpClient()
c.Connect("localhost", 7643)
If c.Connected Then
Dim Specs As New List(Of Spectrum)
' Generating some data here to send
Using stream = c.GetStream
Dim xml As New Xml.Serialization.XmlSerializer(GetType(List(Of Spectrum)))
xml.Serialize(stream, specs)
End Using
End If
End Using
Catch sEx As Net.Sockets.SocketException
MessageBox.Show("Could not send the data." & vbCrLf & _
"This can have multiple reasons:" & vbCrLf & _
"(i) The receiver is not running" & vbCrLf & _
"(ii) A firewall is blocking the connection")
Catch ex As Exception
MessageBox.Show("An unexpected exception occured while sending the data: " & vbCrLf & _
ex.Message)
End Try
服务器:
Private Async Sub DoListen()
Do
Dim client = Await datagrabber.AcceptTcpClientAsync
If client IsNot Nothing AndAlso client.Connected Then
Dim t = Task.Run(Sub() HandleClient(client, Date.Now))
End If
Loop
End Sub
Private Sub HandleClient(client As Net.Sockets.TcpClient)
Dim specs As New List(Of RelaxIS_Shared.CSSpectrum)
Using stream = client.GetStream
Dim ser As New System.Xml.Serialization.XmlSerializer(GetType(List(Of RelaxIS_Shared.CSSpectrum)))
specs = CType(ser.Deserialize(stream), List(Of RelaxIS_Shared.CSSpectrum))
client.Close()
End Using
' Do stuff with data
End Sub
这很好用,但我开始怀疑这是否真的是一种在应用程序之间发送数据的聪明方法。例如,这是否总是在现代 Windows 机器上工作,或者如果有问题的计算机没有网卡怎么办? TCP 连接是否以某种方式虚拟化以在本地主机 IP 上工作,而不考虑系统中的实际硬件?
我找了很多关于多网卡的资料,但是关于没有网卡的资料真的一无所知。
我已经尝试 停用 Windows 中的所有网络 卡。在这种情况下,它仍然有效,但情况是否总是如此,或者是否存在不允许使用 TCPClient 连接的 hardware/software 配置?
我喜欢这个原理,因为它工作起来非常流畅,而且比共享文件等方式更简单。我对 Windows 通信框架之类的东西没有经验,因此坚持使用我首先知道的方法。
如果需要代码,非常感谢 C# 或 VB.NET 中的两个答案。
简短更新:根据下面我们接受的答案,我已经使用命名管道实现了通信。它基本上是相同的代码,它工作完美,绝对值得任何可能发现自己处于与我相同位置的人看一看。您也不能 运行 遇到防火墙问题,这在商用 PC 上尤其猖獗。
还有一个更新:usr 更正确。命名管道非常好,但是阅读 WCF 是非常值得的。乍一看似乎让人不知所措,但在您的应用程序之间实现一个小型数据传输接口是非常简单和容易的。一旦它启动并 运行ning 就能够 "call a method in the other application" 需要很多英里。没有类型转换,没有以任何方式序列化数据......这很棒,值得学习。
TCP 始终适用于本地连接。这些称为环回连接。您无需将以太网电缆两次插入计算机即可让它与自己对话...
对于仅限本地的通信,命名管道是一个不错的选择。它们更简单,速度更快。 .NET 很好地支持它们。
如果可能,放弃 TCP 和任何其他基于流的接口。使用更高级别的 RPC 机制,例如 .NET 远程处理(非常简单,在命名管道上工作)或 WCF。 WCF 不需要托管网站项目。
基本上什么都比自己写个RPC机制好
我正在使用 TCPClient
和 TCPListener
在同一台计算机上向应用程序 运行ning 发送数据。我的目标是 Framework 4.5,因此 运行 上的应用程序 Windows Vista SP2 及更高版本(如果我没记错的话)。
我为此使用了非常简单的代码:
客户:
Try
Using c = New Net.Sockets.TcpClient()
c.Connect("localhost", 7643)
If c.Connected Then
Dim Specs As New List(Of Spectrum)
' Generating some data here to send
Using stream = c.GetStream
Dim xml As New Xml.Serialization.XmlSerializer(GetType(List(Of Spectrum)))
xml.Serialize(stream, specs)
End Using
End If
End Using
Catch sEx As Net.Sockets.SocketException
MessageBox.Show("Could not send the data." & vbCrLf & _
"This can have multiple reasons:" & vbCrLf & _
"(i) The receiver is not running" & vbCrLf & _
"(ii) A firewall is blocking the connection")
Catch ex As Exception
MessageBox.Show("An unexpected exception occured while sending the data: " & vbCrLf & _
ex.Message)
End Try
服务器:
Private Async Sub DoListen()
Do
Dim client = Await datagrabber.AcceptTcpClientAsync
If client IsNot Nothing AndAlso client.Connected Then
Dim t = Task.Run(Sub() HandleClient(client, Date.Now))
End If
Loop
End Sub
Private Sub HandleClient(client As Net.Sockets.TcpClient)
Dim specs As New List(Of RelaxIS_Shared.CSSpectrum)
Using stream = client.GetStream
Dim ser As New System.Xml.Serialization.XmlSerializer(GetType(List(Of RelaxIS_Shared.CSSpectrum)))
specs = CType(ser.Deserialize(stream), List(Of RelaxIS_Shared.CSSpectrum))
client.Close()
End Using
' Do stuff with data
End Sub
这很好用,但我开始怀疑这是否真的是一种在应用程序之间发送数据的聪明方法。例如,这是否总是在现代 Windows 机器上工作,或者如果有问题的计算机没有网卡怎么办? TCP 连接是否以某种方式虚拟化以在本地主机 IP 上工作,而不考虑系统中的实际硬件?
我找了很多关于多网卡的资料,但是关于没有网卡的资料真的一无所知。
我已经尝试 停用 Windows 中的所有网络 卡。在这种情况下,它仍然有效,但情况是否总是如此,或者是否存在不允许使用 TCPClient 连接的 hardware/software 配置?
我喜欢这个原理,因为它工作起来非常流畅,而且比共享文件等方式更简单。我对 Windows 通信框架之类的东西没有经验,因此坚持使用我首先知道的方法。
如果需要代码,非常感谢 C# 或 VB.NET 中的两个答案。
简短更新:根据下面我们接受的答案,我已经使用命名管道实现了通信。它基本上是相同的代码,它工作完美,绝对值得任何可能发现自己处于与我相同位置的人看一看。您也不能 运行 遇到防火墙问题,这在商用 PC 上尤其猖獗。
还有一个更新:usr 更正确。命名管道非常好,但是阅读 WCF 是非常值得的。乍一看似乎让人不知所措,但在您的应用程序之间实现一个小型数据传输接口是非常简单和容易的。一旦它启动并 运行ning 就能够 "call a method in the other application" 需要很多英里。没有类型转换,没有以任何方式序列化数据......这很棒,值得学习。
TCP 始终适用于本地连接。这些称为环回连接。您无需将以太网电缆两次插入计算机即可让它与自己对话...
对于仅限本地的通信,命名管道是一个不错的选择。它们更简单,速度更快。 .NET 很好地支持它们。
如果可能,放弃 TCP 和任何其他基于流的接口。使用更高级别的 RPC 机制,例如 .NET 远程处理(非常简单,在命名管道上工作)或 WCF。 WCF 不需要托管网站项目。
基本上什么都比自己写个RPC机制好