【发布时间】:2015-06-02 09:58:56
【问题描述】:
我正在使用TCPClient 和TCPListener 在同一台计算机上运行的应用程序之间发送数据。我的目标是 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 连接是否以某种方式虚拟化以在 localhost IP 上工作?
我找到了很多关于多个网卡的信息,但实际上没有关于没有网卡的信息。
我已经尝试在 Windows 中停用所有网络卡。在这种情况下它仍然有效,但是否总是如此,或者是否存在不允许使用 TCPClient 连接的硬件/软件配置?
我喜欢这个原理,因为它运行起来非常流畅,而且比共享文件更简洁。我对 Windows Communication Framework 之类的东西没有经验,因此坚持使用我最初知道的方法。
如果需要代码,我们非常感谢 C# 或 VB.NET 中的两个答案。
简短更新:根据下面 usr 接受的答案,我已经使用命名管道实现了通信。它基本上是相同的代码,它工作完美无瑕,绝对值得任何可能发现自己与我处于相同位置的人看看。您也不会遇到防火墙问题,这在商用 PC 上尤其猖獗。
还有一个更新:usr 更正确。命名管道非常好,但是阅读 WCF 是非常值得的。一开始可能看起来很费力,但在应用程序之间实现一个小型数据传输接口非常简单和容易。一旦它启动并运行,它就能够“在另一个应用程序中调用一个方法”需要很长的时间。没有类型转换,没有以任何方式序列化数据......这很棒,值得学习。
【问题讨论】:
标签: c# vb.net network-programming tcpclient tcplistener