从服务器(tcplistener)向客户端(tcpclient)发送消息

Posted

技术标签:

【中文标题】从服务器(tcplistener)向客户端(tcpclient)发送消息【英文标题】:Send message from server (tcplistener) to client (tcpclient) 【发布时间】:2014-03-16 22:34:56 【问题描述】:

我现在对 C# 中的客户端-服务器连接的理解:

TCPListener = 服务器 TCPClient = 客户端

除此之外,还有一个“Socket”类,它可以用作客户端和服务器,但最后两种变体做同样的事情吗?!

我了解 TCPClient。它有一个 getStream() 方法,该方法返回一个 NetWorkStream,该方法具有从流中读取和写入流的方法。

我的问题是服务器端的 TCPListener。 TCPListener 没有 getStream() 方法,也没有读/写方法。我如何从 TCPListener 读取/写入流?

【问题讨论】:

while(true) var tcpClient = tcpListener.AcceptTcpClient(); /*use tcpClient*/ 【参考方案1】:

TCP 支持双向流。一旦建立连接,客户端和服务器端没有太大区别。

您将使用TcpListener.AcceptTcpClient 建立连接并为服务器端提供TcpClient 实例。

您在问题标题中提到发送消息。需要记住的一件重要事情是,如果您使用 TCP 在这个低级别工作,则没有固有的“消息传递”层 - 一端对 Send 的调用 匹配 1 -1 在另一端调用Receive。如果您想要消息传递,您必须自己在这些原语之上构建,或者切换到自动隐藏此级别详细信息的更高级别的网络库(例如 WCF)。


基本上,TcpListener 类的行为是“我打算让人们与我联系” - 并且调用 Accept* 之类的方法是在说“如果有人目前要求与我联系,让我们现在建立连接并开始交谈”

【讨论】:

【参考方案2】:

TcpListener 允许您使用例如接受传入连接。 AcceptTcpClient 方法。这将返回一个TcpClient 实例,您可以使用它与客户端进行双向通信。

TCP 是一种围绕连接构建的协议,因此如果不先建立连接,您就无法真正发送或接收数据 - 这适用于客户端和服务器。

【讨论】:

【参考方案3】:

您可以使用 TcpClient 的流从客户端接收和发送数据 TcpListener 只监听请求,它不能与它们交互。

【讨论】:

以上是关于从服务器(tcplistener)向客户端(tcpclient)发送消息的主要内容,如果未能解决你的问题,请参考以下文章

C# 在客户端和服务器上使用 TcpListener

socket长连接,心跳包怎么实现

C#网络编程的服务器类TcpListener

使用 async/await 的异步 TcpListener 的正确方法

c#_TcpListener&TcpClient

c#_TcpListener&TcpClient