2011-11-20 32 views
0

ServerSocketChannel被這樣使用:的SocketChannel讀()行爲 - 短讀取

ServerSocketChannel srv = ServerSocketChannel.open(); 
srv.socket().bind(new java.net.InetSocketAddress(8112)); 
SocketChannel client = srv.accept(); 

當接收到一個連接,數據被讀出這種方式:

ByteBuffer data = ByteBuffer.allocate(2000); 
data.order(ByteOrder.LITTLE_ENDIAN); 
client.read(data); 
logger.debug("Position: {} bytes read!", data.position()); 

它打印:

位置:讀取16個字節!

爲什麼SocketChannel不會阻塞,直到緩衝區被填滿?
ServerSocketChannel.accept() API(爪哇7):

通過此方法返回的套接字通道,如果有的話,將在 不管該通道的阻斷模式的阻塞模式。

SocketChannel塊的write(ByteBuffer buffer)?我怎麼測試呢?

謝謝你的時間!

回答

3

阻塞模式意味着它阻塞,直到收到任何數據。它不必是一個完整的緩衝區。

如果你想確保你已經收到了整個緩衝區的數據,你應該循環使用read(),直到你填滿了你的緩衝區。

+0

寫入(ByteBuffer緩衝區)操作會發生什麼? – AndrewBourgeois

+0

另外,任何人都可以解釋哪個用例返回0爲讀(...)或寫(...)?如果它保持讀取0字節,我可能想在某個時間點進行一些睡眠(10)。但在我這樣做之前,我想明白。 ;-) – AndrewBourgeois

+2

@AndrewBourgeois阻塞模式寫入將阻塞,直到所有數據傳輸完畢。非阻塞寫入可能會傳輸零個或多個字節。只有非阻塞讀取可以返回零,這意味着沒有數據存在。它與Selector和OP_READ結合使用。 – EJP