2011-09-23 26 views
0

我正在尝试用于非阻塞通信的Java.nio包。所以我在Selector中获得了我的ServerSocketChannel和所有连接的客户端(SocketChannel),并使用Selector.select()等待数据(OP_ACCEPT/OP_READ)。在SocketChannel/ServerSocketChannel中使用底层的Socket/ServerSocket?

我的问题是:我可以 - 而不是使用ByteBuffer并直接读取SocketChannel.read() - 使用底层套接字,获取InputStream并使用该流读取?或者这会搞砸选择的东西?

+0

read()是一个阻塞操作。只有NIO可以用于阻塞或非阻塞模式。 IO只是阻塞。 –

回答

0

你不能。

http://download.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#getInputStream%28%29

如果此插座具有然后相关联的信道所得到的输入数据流代表其所有操作的信道。如果通道处于非阻塞模式,则输入流的读操作将抛出IllegalBlockingModeException。

+0

啊 - okey。我真的不喜欢SocketChannel和ByteBuffer的工作原理。我只想读取n个字节,但是SocketChannel.read()只读取,直到ByteBuffer已满,或者直到SocketChannel中没有更多数据。有没有简单的方法来读取n个字节? – Simon

+0

@Simon不处于非阻塞模式。 – EJP