比方说,我有一个服务器,有许多通过 TCP 连接的客户端,每个客户端都有一个套接字,每个客户端都有一个发送和接收线程。是否安全且可以同时调用发送函数,因为它不会为同一个套接字调用发送函数。
如果安全且没问题,我可以同时将数据流式传输到客户端而不阻塞其他客户端的发送功能吗?
非常感谢您的回答。
是的,这是可能的并且是线程安全的。你可以测试它,或者自己弄清楚如果不是这样,IS、IIS、SQL Server 等就不能很好地工作。
假设这是来自“Winsock”标签的 Windows。
这种设计(每个连接的客户端都有一个发送/接收线程)总体上不会扩展。希望您意识到这一点,并且您知道您的客户数量非常有限(即使那样,我也不会这样写)。
您不需要为每个客户端都有一个线程对。
您可以使用非阻塞 IO 和读/写就绪通知(使用 select() 或重叠 IO 的一种,例如完成例程或完成端口)为大量客户端提供服务。如果您使用完成端口,您可以设置一个线程池来处理套接字 IO,并为您自己的工作线程或线程/线程池排队工作。
是的,您可以同时从不同的线程发送和接收多个套接字;但是您不应该需要那些额外的线程,因为您根本不应该对 send/recv 进行阻塞调用。当您进行非阻塞调用时,可以立即写入的数量被写入并且函数返回,然后您注意发送了多少,并在套接字下一次可写时请求通知。
我认为您可能需要考虑一种不同的方法,因为这不是简单的事情;如果您使用.Net,您可能会通过使用 TcpListener 或 HttpListener 构建它(两者都为您使用完成端口),但请注意,您无法轻松禁用 Nagle 算法,因此如果您需要交互性(想想Google 搜索页面上的自动完成功能),那么您可能无法获得您想要的性能。