- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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 连接是否以某种方式虚拟化以在本地主机 IP 上工作,而不考虑系统中的实际硬件?
我找到了很多关于多网卡的信息,但关于没有网卡的信息却一无所获。
我已经尝试在 Windows 中停用所有网卡。在这种情况下,它仍然有效,但情况是否总是如此,或者是否存在不允许使用 TCPClient 连接的硬件/软件配置?
我喜欢这个原则,因为它工作起来非常顺畅,而且比共享文件更简单。我对 Windows Communication Framework 之类的东西没有经验,因此坚持使用我首先知道的方法。
如果需要代码,非常感谢 C# 或 VB.NET 中的两个答案。
一个简短的更新:根据下面 usr 接受的答案,我已经使用命名管道实现了通信。它基本上是相同的代码,它工作完美,绝对值得任何可能发现自己处于与我相同位置的人看一看。您也不会遇到防火墙问题,这在商用 PC 上尤其猖獗。
还有一个更新:usr 更正确。命名管道非常好,但是阅读 WCF 是非常值得的。乍一看似乎让人不知所措,但在您的应用程序之间实现一个小型数据传输接口(interface)是非常简单和容易的。一旦它启动并运行,就能够“调用另一个应用程序中的方法”还有很长的路要走。没有类型转换,没有以任何方式序列化数据......这很棒,值得学习。
最佳答案
TCP 始终适用于本地连接。这些称为环回连接。您无需将以太网电缆两次插入计算机即可让它与自己对话...
对于仅限本地的通信,命名管道是一个不错的选择。它们更简单,速度更快。 .NET 很好地支持它们。
如果可能,放弃 TCP 和任何其他基于流的接口(interface)。使用更高级别的 RPC 机制,例如 .NET 远程处理(非常简单,在命名管道上工作)或 WCF。 WCF 不需要托管网站项目。
基本上,任何都比自己编写 RPC 机制要好。
关于c# - TCPClient没有网卡能用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29328378/
代码如下: //获取电脑的CPU信息 function OnlyU(){ $a = ''; $b = array(); if(function_
我是一名优秀的程序员,十分优秀!