我正在使用 TCPClientTCPListener 在同一台计算机上运行的应用程序之间发送数据。我的目标是 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 通信框架之类的东西没有经验,因此坚持使用我首先知道的方法。

如果需要代码,非常感谢 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/

10-13 07:46
查看更多