我正在尝试编写 ac# 服务器/客户端,它们将同时通过 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 上有一个新连接,那么您也会收到一个读取事件,您可以调用接受。