Java套接字:我可以用一个线程写一个TCP服务器吗?
从我读到的有关Java NIO和非阻塞[Server] SocketChannels的内容中,应该可以编写一个只使用一个线程来维持多个连接的TCP服务器 - 我将创建一个Selector来等待服务器循环中的所有相关通道。
这是对的,还是我错过了一些重要的细节? 我可以遇到什么问题?
(背景:TCP通信适用于小型多人游戏,因此最多可同时连接10-20个连接消息,每隔几秒会发送一次消息。)
你是对的。 您可能遇到的问题是处理持续时间过长。 在这种情况下,你必须将处理包装在另一个线程中,这样它才不会干扰网络线程,并防止明显的延迟。
另一个细节; 频道都是关于“移动”数据的。 如果您希望发送的数据已准备就绪,那么您可以将此数据移至联网频道。 复制/缓冲等。 都是由NIO实施完成的。
你的单线程“网络线程”只是指导连接,而不是限制它(阅读:与汽车奇怪的比喻)。
基本的多线程方法比单线程NIO更容易设计和实现。 在小型多人游戏服务器/客户端中,性能增益并不明显,特别是如果每隔几秒发送一次消息。
布赖恩阿格纽说:
当每个客户端的服务器端处理可以忽略不计时,这一切都可以正常工作。 然而,多线程方法可以扩展得更好。
我恳求不同意。 一个客户端一线程的方法会比每个线程处理多个客户端的速度快得多,因为您不需要每个客户端都有一个完整的堆栈。 有关以下主题的更多信息,请参见C10K论文:http://www.kegel.com/c10k.html
无论如何,如果不会有超过20个客户端,只需使用最简单的代码和调试即可。
是的你可以。 有关如何执行此操作的说明,请参阅此示例。
重要的部分是这样的:
for (;;) { // Loop forever, processing client connections
// Wait for a client to connect
SocketChannel client = server.accept();
// Build response string, wrap, and encode to bytes (elided)
client.write(response);
client.close();
}
当每个客户端的服务器端处理可以忽略不计时,这一切都可以正常工作。 然而,多线程方法可以扩展得更好。
链接地址: http://www.djcxy.com/p/64081.html上一篇: Java sockets: can I write a TCP server with one thread?