2013-03-04 18 views
0

我想用Android編寫一個服務器,使用NIO。 我的ServerChannel被接受後,我已經註冊了OP_READ,OP_WRITE。Java nio在OP_WRITE存在時,OP_READ是否在Android中不執行?

但是,有線的事情是... while循環,之後我做的:

SelectionKey key = (SelectionKey) iterator.next(); 
iterator.remove(); 

在:

if(key.isReadable()){ 
} else if(key.isWritable()){ 

看來,isReadable再也沒有回來真。

我的客戶端代碼是兩個線程,一個線程用於讀取,另一個線程用於寫入。 我不知道爲什麼這麼.. ..?我認爲如果有人能夠給我一些參考資料,說明在Java NIO中處理客戶端會有幫助。

非常感謝,

回答

3

您通常不應該註冊OP_WRITE。它幾乎總是準備好。您應該只在獲得短寫入結果時使用它,這表明發送緩衝區已滿。另一方面,OP_READ只在發送緩衝區中有數據時才準備好。在你回答的時候沒有什麼可以表明在當時有問題。我想知道你是否沒有將這些國家以某種方式置於腦後。

+0

啊......我明白你的意思了。最後我發現了這個問題,雖然這是上面的原因,但是你的建議非常有用(謝謝:)。 – songyy 2013-03-05 09:20:51

0

我犯了一個錯誤理解.register方法,正確的方法:

client.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE); 

,而我所做的是:

client.register(selector, SelectionKey.OP_READ); 
client.register(selector, SelectionKey.OP_WRITE); 

因此,後來換成了前者。

+0

不,不是。你很少需要同時需要OP_READ和OP_WRITE。看到我的答案。 – EJP 2017-09-30 06:33:19

相關問題