2011-04-12 85 views
1

我正在嘗試使用時異常:發送對象

oos = new ObjectOutputStream(socketChannel.socket().getOutputStream()); 
oos.writeObject(o); 

這引發異常:

java.nio.channels.IllegalBlockingModeException 

它是不可能通過非對象 - 阻塞插座? 如果是這樣,我應該如何繼續通過套接字通道傳遞消息對象?

我看其他地方這個答案,但無法找到一個...

回答

2

您可能需要編寫自己的ObjectOutputStream實現,構建了一個ByteBufferwrite()這跟渠道。

使用非阻塞套接字時,不能直接使用該通道的套接字;您需要使用頻道的read()write()方法。

當你寫你自己的ObjectOutputStream,你主要是需要重寫write()方法來緩衝輸出,並使用flush()方法寫入緩衝區的通道。然後,覆蓋writeObject()方法是這樣的:

public void writeObject(Object o) throws IOException { 
    super.writeObject(o); 
    flush(); 
} 

,以確保數據得到每個對象寫入之後寫的。

+0

所以基本上,我會做我自己的輸出流,只是改變它與ByteBuffer而不是字節[],但我不明白我將如何使用這個輸出流,如果我不能得到套接字的流。對不起,我從來沒有在java中使用過這種低層次的通信。一個例子會很棒。 – Draiken 2011-04-12 17:35:51

+0

如果我不清楚,我很抱歉。我的意思是這個新的輸出流將使用通道的write()方法而不是通道的套接字的write()方法來封裝通道。 – Jonathan 2011-04-12 19:56:10

0

自從我在這方面工作已經有一段時間了,但它似乎比簡單地包裝writeObject更復雜。 java.nio通常需要固定大小的緩衝區(儘管您可以動態分配它們,但我相信),您的遠程端點需要知道在線路上出現的任意Object需要讀多少個緩衝區。我最終做的是發送一個初始的int標題,告訴另一端需要多少數據,然後將該對象序列化爲一個字節數組,然後將其發送出去。

我已經got an example of this,可能仍然有一些錯誤,所以使用您自己的風險。需要PendingDataBufferS來處理大於最初分配的固定大小緩衝區的對象。