好的,我已经疯了。我一直在为我的服务器重写NIO代码,并遇到了一些真正的头痛问题。底线是,正确使用NIO非常困难。有些人指向了Rox教程,网址为http://rox-xmlrpc.sourceforge.net/niotut/,这似乎是一个好的方向,但不够完整。例如,我需要知道如何在排队的传出ByteBuffer发送后仅在服务器端关闭连接。SocketChannel.close()是突然的,如果过早关闭可能会丢失数据。我还需要发送比读取ByteBuffer更大的大数据包。Rox代码(以及其他任何我看过的代码)都没有处理这个问题。还有许多地方似乎未正确处理未捕获的异常。在我的测试中存在一些错误,鉴于NIO的复杂性,不清楚如何正确处理它们。
无论如何,当我试图解决这些问题时,越来越多的棘手细节显现出来,变得非常复杂。因此,我正在考虑完全不同的方法。许多人说NIO非常容易出错,令人困惑和复杂。他们主张使用“每个连接一个线程”的模型,其中每个套接字连接都在自己的线程上运行,使用阻塞IO。这似乎是一个好主意,并且通过为所有连接(如NIO中)使用一个选择器线程来减少前端瓶颈,但代价是更高的开销(用于线程)。这种情绪在帖子中反映出来,例如http://paultyma.blogspot.com/2008/03/writing-java-multithreaded-servers.html和http://mailinator.blogspot.com/2008/02/kill-myth-please-nio-is-not-faster-than.html
与NIO相比,代码应该更简单,但我真的想看一些示例代码。我似乎找不到任何东西。问题在于,我认为这个“每个连接一个线程的阻塞I/O”策略没有更好的名称,我实际上可以获得良好的Google结果。有人能链接我到一些教程或简单的示例,以解释使用这种“旧”的I/O方法并使用线程池扩展它吗?还是有其他的智慧之言?非常感谢!
SocketChannel.close()
不是“突然”的,也不会“丢失数据”,除非您的应用程序尚未发送该数据。离题了。 - user207421