2012-07-18 67 views
1

我有一個小型服務器應用程序,它接收來自多個客戶端的連接。 客戶端將連接,發送消息並斷開連接,沒有響應發回。Java nio在選擇器上讀取SocketChannel

我正在使用ServerSocketChannel來偵聽連接。 我開始使用一個選擇通知新的連接,當發生這種情況我註冊的SocketChannel與選擇的SelectionKey.OP_READ

我不確定的部分是,當我得到通知的數據可用於閱讀。 我的SocketChannel處於非阻塞模式。 我在SocketChannel上調用channel.read(buffer)來讀取字節緩衝區 從javadoc中讀取,我應該重複調用這個函數,直到我得到-1表示流的結束。但是,我不確定是否應該等待選擇器再次通知我,然後再次調用讀取。 即:

  • 我收到選擇器通知數據可用。
  • 我調用read
  • 我應該然後再次調用返回,直到-1或閱讀我應該讓選擇通知我然後調用再次讀取

非常感謝

回答

3

從的Javadoc讀,我應該重複調用這個,直到我得到一個-1指示流的結束。

它沒有說任何這樣的事情。

如果您處於非阻塞模式,您可以閱讀,直到它返回-1 或零。如果它返回零,則在套接字接收緩衝區中沒有更多數據掛起,所以應該返回到選擇循環。如果它返回-1,就是這樣,完成,完成,finito,關閉套接字通道並相應地繼續。

+0

謝謝,是的,javadoc並沒有這樣說,但網上的一些教程呢。你寫的很有道理。 – jasg 2012-07-18 11:02:42

+0

@jasg網上的大多數教程都是垃圾,尤其是NIO。堅持在Oracle網站上的。他們並不完美,但至少他們已被QA和審查;他們來自正確的來源;並有一個錯誤報告系統。 IBM的一般也是一流的。避免博客,採訪問題網站,以及任何未經審查和未經評論的瘟疫。 – EJP 2012-07-18 23:38:02