我使用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。乍一看似乎让人有些不知所措,但是在应用程序之间实现小型数据传输接口非常简单,容易。一旦启动并运行它,就能够“在另一个应用程序中调用方法”要走很多路。没有类型转换,也没有以任何方式序列化数据……这很棒,值得学习。
TCP始终适用于本地连接。这些称为回送连接。您无需将以太网电缆插入计算机两次即可使其自言自语...
对于仅本地通信,命名管道是一个不错的选择。它们更简单,速度更快。.NET对它们的支持很好。
如果可能的话,放弃TCP和任何其他基于流的接口。使用更高级别的RPC机制,例如.NET远程处理(非常简单,可以在命名管道上运行)或WCF。WCF不需要托管网站项目。
基本上,任何事情都比自己编写RPC机制要好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句