2017-02-17 88 views
0

我是新來的Socket編程,我正在嘗試編寫一個簡單的聊天應用程序。我的服務器利用字符串HashSet來存儲用戶名信息,我想通過HashSet從服務器到客戶端。我可以在ObjectOutputStreamObjectInputStream之前通過常規套接字進行此操作。不過,現在我使用SocketChannel並不允許這樣做,我得到以下異常:通過Java編寫和讀取對象NIO非阻塞SocketChannels

java.nio.channels.IllegalBlockingModeException 

所以我搜索瞭如何做到這一點,大家說了什麼不同的網絡,大多數走的方式在我的頭上。有沒有簡單的方法來做到這一點,而不是完全覆蓋自己的writeObjectreadObject方法?

謝謝您提前。

+0

有可能:這也太難了。堅持阻塞模式。 – EJP

+0

@EJP洛爾謝謝,我需要做到這一點在非阻塞作爲我的網絡編程類的一部分。 – mks

回答

1

我建議你不要使用非阻塞模式或不要使用序列化。

如果您需要,您需要序列化爲ByteArrayOutputStream,獲取長度,發送長度,發送字節,接收長度,繼續讀取,累積數據,直到您獲得正確的數據長度,並將其放入一個ByteArrayInputStream,並從中反序列化。不容易,特別是圍繞「繼續閱讀」的揮手。浪費時間和空間。

+0

謝謝,沒有人有寫在某處的通用模板?你會認爲這是一個普遍問題。 – mks

+0

這個問題之前已經在這裏問過。 – EJP

+0

我的意思是某種使用Java泛型來處理這個問題的類或方法。 – mks