【发布时间】:2013-09-14 05:23:38
【问题描述】:
我正在尝试编写一个 c# 服务器/客户端,它将同时通过 TCP 相互发送字节数组。我正试图围绕如何实现这一点。我看到的所有示例都等待消息,然后发送响应。我需要同时进行沟通。
我是否需要为服务器和客户端的传入和传出创建 2 个单独的 TCP 套接字连接?我可以以“全双工”方式同时通过 1 个连接传递数据吗?任何帮助表示赞赏。
【问题讨论】:
我正在尝试编写一个 c# 服务器/客户端,它将同时通过 TCP 相互发送字节数组。我正试图围绕如何实现这一点。我看到的所有示例都等待消息,然后发送响应。我需要同时进行沟通。
我是否需要为服务器和客户端的传入和传出创建 2 个单独的 TCP 套接字连接?我可以以“全双工”方式同时通过 1 个连接传递数据吗?任何帮助表示赞赏。
【问题讨论】:
我建议您查看异步套接字。原因是它们在接收或发送数据时不会阻塞线程。
Socket.BeginReceive(buffer, offset, size, endReceiveMethod);
endreceive 方法将在收到字节时调用。 (在另一个线程上) 发送也是如此。
Socket.BeginSend(buffer, offset, size, endSendMethod);
我记得在早期我担心在同一个线程上读写,创建具有读取超时等的困难结构以及每个客户端都有自己的线程。
异步套接字不需要这样做。它不为每个客户端使用单个线程。它使用 I/O 完成端口 http://msdn.microsoft.com/en-us/library/windows/desktop/aa365198(v=vs.85).aspx 而不是阻塞线程。
【讨论】:
您应该考虑使用 select() 方法来侦听服务器和客户端文件描述符(或 fd)。 http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.select.aspx
基本上,如果你有一个 TCP 服务器,比如说 fd0,如果客户端发送一个连接,那么服务器 fd 会为新连接创建一个新的 fd,我们称之为 fd1。现在,您需要用这些来做三件事:(a) 在 fd0 上侦听新的传入连接,(b) 在 fd1 上等待接收数据,以及 (c) 在 fd1 上发送数据。发送数据通常是非阻塞的,所以你不必担心。但是,对于 (a) 和 (b),您可以使用 select.. 如果 fd1 上有要读取的数据,那么您将收到一个读取事件。同样,如果 fd0 上有一个新连接,那么您也会收到一个读取事件,您可以调用 accept。
【讨论】: