我有一個小型服務器應用程序,它接收來自多個客戶端的連接。 客戶端將連接,發送消息並斷開連接,沒有響應發回。Java nio在選擇器上讀取SocketChannel
我正在使用ServerSocketChannel來偵聽連接。 我開始使用一個選擇通知新的連接,當發生這種情況我註冊的SocketChannel與選擇的SelectionKey.OP_READ
我不確定的部分是,當我得到通知的數據可用於閱讀。 我的SocketChannel處於非阻塞模式。 我在SocketChannel上調用channel.read(buffer)
來讀取字節緩衝區 從javadoc中讀取,我應該重複調用這個函數,直到我得到-1表示流的結束。但是,我不確定是否應該等待選擇器再次通知我,然後再次調用讀取。 即:
- 我收到選擇器通知數據可用。
- 我調用read
- 我應該然後再次調用返回,直到-1或閱讀我應該讓選擇通知我然後調用再次讀取
非常感謝
謝謝,是的,javadoc並沒有這樣說,但網上的一些教程呢。你寫的很有道理。 – jasg 2012-07-18 11:02:42
@jasg網上的大多數教程都是垃圾,尤其是NIO。堅持在Oracle網站上的。他們並不完美,但至少他們已被QA和審查;他們來自正確的來源;並有一個錯誤報告系統。 IBM的一般也是一流的。避免博客,採訪問題網站,以及任何未經審查和未經評論的瘟疫。 – EJP 2012-07-18 23:38:02