2011-09-23 58 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