Java套接字:我可以用一个线程编写TCP服务器吗?
从我读到的关于Java NIO和非阻塞[Server]Socketchannes的内容来看,应该可以编写一个只使用一个线程支持多个连接的TCP服务器——我会制作一个选择器,等待服务器循环中的所有相关通道 是这样,还是我遗漏了一些重要的细节?我会遇到什么问题Java套接字:我可以用一个线程编写TCP服务器吗?,java,sockets,nio,Java,Sockets,Nio,从我读到的关于Java NIO和非阻塞[Server]Socketchannes的内容来看,应该可以编写一个只使用一个线程支持多个连接的TCP服务器——我会制作一个选择器,等待服务器循环中的所有相关通道 是这样,还是我遗漏了一些重要的细节?我会遇到什么问题 (背景:TCP通信将用于小型多人游戏,因此最多可同时连接10-20次。消息将每隔几秒钟发送一次。)是的,你说得对。您可能遇到的问题是处理的持续时间太长。在这种情况下,您必须将处理封装在另一个线程中,这样它就不会干扰网络线程,并防止明显的延迟
(背景:TCP通信将用于小型多人游戏,因此最多可同时连接10-20次。消息将每隔几秒钟发送一次。)是的,你说得对。您可能遇到的问题是处理的持续时间太长。在这种情况下,您必须将处理封装在另一个线程中,这样它就不会干扰网络线程,并防止明显的延迟 另一个细节;频道都是关于“移动”数据的。如果您希望发送的数据已准备就绪,则可以将此数据移动到网络通道。复制/缓冲等都是由NIO实现完成的。
您的单线程“网络线程”只是控制连接,而不是限制连接(阅读:与汽车的奇怪类比) 基本的多线程方法比单线程NIO更容易设计和实现。在小型多人游戏服务器/客户端中,性能提升并不明显,特别是当消息仅每隔几秒钟发送一次时。是的,您可以。有关如何执行此操作的图示,请参见 重要的部分是:
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();
}
当每个客户机的服务器端处理可以忽略不计时,这一切都可以很好地工作。不过,多线程方法的可扩展性会更好。Brian Agnew说:
当服务器端处理
对于每一个客户来说都是微不足道的。然而,多线程
这种方法可以更好地扩展
我不敢苟同。一个客户机一个线程的方法将比每个线程处理多个客户机更快地耗尽内存,因为您不需要每个客户机都有一个完整的堆栈。有关此主题的更多信息,请参阅C10K论文:
无论如何,如果客户机不超过20个,只需使用最容易编码和调试的程序即可。好吧。。。看起来对swing编程非常熟悉。。如果您有一个主事件调度线程,但对于服务器,名称应该是“请求调度线程”。还有一个很好的做法,就是将那些需要一些处理的事件/请求委托给其他线程,这些处理可能需要一秒钟以上才能释放轮询线程。你们说的有道理吗?或者我只是在说胡话?是的,你们说的有道理。您所描述的是典型的事件处理器。请求作为事件处理,数据可用或将写入的通道由不同于接受程序的线程处理。请注意,对于原始的I/O模型,通常假定服务器为每个客户机生成一个新线程,但这种具有固定线程数的基于事件的模型同样有用。