除了java.nio之外,java中有哪些async io(基于套接字)的选项?java.nio也使用backround中的线程(因为我认为.NET的async-socket-library确实如此,可能它已经被更改了)或者使用正确的select调用它是"真正的"async io吗?
Java的NIO包(从Java6开始)仅通过Selector提供对非阻塞I/O的支持.希望Java7能够附带NIO.2,其中包括异步I/O支持.今天,你最好的办法就是利用一个框架.ARMistice提到了Mina.这是其他一些.
灰熊.这是Sun GlassFish服务器的I/O核心.Grizzly提供了进行异步读/写(通过队列模型)的工具.它支持TCP和UDP.我在几个项目中使用了Grizzly.有些东西我喜欢和不喜欢这个框架,但要详细说明这是另一个话题.我会说很容易让事情发生并且Grizzly为你做了很多繁重的工作.
Netty.该项目来自Mina项目的原作者之一.我没有使用过这个,所以我不知道它对异步I/O的支持.你应该看看.
现在,关于有关线程的问题,NIO选择器不会将线程用于非阻塞I/O. 在JDK6中,他们在Windows下使用select(),在新的Linux内核上使用epoll工具.对于异步I/O,线程细节取决于框架.
JAVA 7到了,所以新答案是NIO.2和Future类.示例:
在服务器端:
final AsynchronousServerSocketChannel serverSocket= AsynchronousServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.1", 2587)); // Listening on port 2587 for client connection Futurefuture= serverSocket.accept(); final AsynchronousSocketChannel clientSocket= future.get(); // now it's blocking, useful: future.isDone() and .isCancelled() //Do whatever you want .. InputStream stream = Channels.newInputStream(clientSocket) (...)
在客户端:
AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open(); Future connected = localSocket.connect(ourServerSocketAddress); // later: if(future.isDone()) connected.get(); //Send something OutputStream os = Channels.newOutputStream(clientChannel ); os.write (...)
更新: 如果你可以使用actor模型,那么AKKA TCP IO会更好.
关于libs的另一个建议是Naga(http://naga.googlecode.com).它有点像框架,更像是一个库.它试图看起来更像普通的Java套接字,如果这是你的一杯茶.与Grizzly,Mina和Netty相比,它很简约.
java.nio
只是一个包 - 一个"哑"类的集合 - 它本身不使用任何线程.如果使用得当,例如在Reactor设计模式中,您可以实现适当的,完全可扩展的异步I/O.
如果您有兴趣将它用于网络资料.一个非常好的选择是:
http://mina.apache.org/
看看那里它易于使用,非常强大.