TCPClient是否可以在没有网卡的情况下使用?

詹斯

我使用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连接以在localhost IP上工作,而不管系统中的实际硬件是什么?

我发现了很多有关多个网卡的信息,但实际上没有关于没有网卡的信息。

我已经尝试停用Windows中的所有网卡。在这种情况下,它仍然有效,但是是否总是这样?是否可以存在不允许使用TCPClient连接的硬件/软件配置?

我喜欢这个原理,因为它比起共享文件来说非常顺畅,而且不那么笨拙。我没有Windows Communication Framework之类的经验,因此坚持使用我首先知道的方法。

如果需要代码,则非常感谢C#或VB.NET中的两个答案。


一个简短的更新:基于下面usr可接受的答案,我已经使用命名管道实现了通信。它基本上是相同的代码,它的工作原理完美无缺,对于任何可能与我处于同一位置的人来说,绝对值得一看。您也不会遇到防火墙的问题,在企业PC上尤其如此。


还有一个更新:usr更加正确。命名管道很好,但值得一读的是WCF。乍一看似乎让人有些不知所措,但是在应用程序之间实现小型数据传输接口非常简单,容易。一旦启动并运行它,就能够“在另一个应用程序中调用方法”要走很多路。没有类型转换,也没有以任何方式序列化数据……这很棒,值得学习。

usr

TCP始终适用于本地连接。这些称为回送连接。您无需将以太网电缆插入计算机两次即可使其自言自语...

对于仅本地通信,命名管道是一个不错的选择。它们更简单,速度更快。.NET对它们的支持很好。

如果可能的话,放弃TCP和任何其他基于流的接口。使用更高级别的RPC机制,例如.NET远程处理(非常简单,可以在命名管道上运行)或WCF。WCF不需要托管网站项目。

基本上,任何事情都比自己编写RPC机制要好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以在没有 Groovy 的情况下使用 Jenkins

是否可以在没有 sudo 的情况下使用 docker?

是否可以在没有 Anaconda 的情况下使用 scrapy?

是否可以在没有ReactJS的情况下使用RelayJS和GraphQL?

是否可以在没有文件输入的情况下使用ActiveStorage?

是否可以在没有 DI 容器的情况下使用 Jersey?

是否可以在没有Redis的情况下使用Spring Boot会话?

是否可以在没有平方矩阵(R)的情况下使用chorddiag创建和弦图?

使用RabbitMQ是否可以在没有出队操作的情况下查看队列内容?

是否可以在没有“ look_up”字段的情况下使用“ RetrieveUpdateAPIView”?

是否可以在没有JNI的情况下使用sun.misc.Unsafe调用C函数?

是否可以在没有服务器的情况下使用实体类和EntityManager?

是否可以在没有Node.js的情况下使用Ember.js框架?

Play 2.3.x是否可以在没有激活器(和maven)的情况下使用?

Zuul Edge Server是否可以在没有Eureka / Ribbon的情况下使用

PJSIP(PJSUA2)是否可以在没有音频设备的情况下使用?

是否可以在OCaml中没有中间模块的情况下打开或使用函子?

是否可以在没有Asp.net页面的情况下使用MVC?

是否可以在没有war文件的情况下使用JBoss Rewrite?

是否可以在没有kubernetes或docker的情况下使用Istio?

是否可以在没有Swift或Objective-C的情况下使用Go创建iOS应用?

是否可以在没有PropTypes的情况下使用React的上下文?

Mapbox Geocoder API是否可以在没有地图的情况下使用?

是否可以在没有Tableau Desktop的情况下使用Tableau Server?

是否可以在没有模板消息的情况下使用NLog的结构化日志记录?

是否可以在没有Windows 10专业版的情况下使用Docker?

是否可以在没有浏览器检测的情况下使用关键帧?

是否可以在没有QApplication的情况下使用QML和QtQuick?

我是否可以在没有运行服务器的情况下使用React Routes