通过Java NIO非阻塞套接字发送对象

时间:2011-04-12 16:15:11

标签: java sockets serialization nio

我在尝试使用时遇到异常:

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

这引发了例外:

java.nio.channels.IllegalBlockingModeException

是否无法在非阻塞套接字中传递对象? 如果是,我该如何继续通过套接字通道传递消息对象?

我在其他地方寻找这个答案,却找不到一个......

2 个答案:

答案 0 :(得分:2)

您可能希望编写自己的ObjectOutputStream实现,将ByteBufferwrite()构建到频道。

使用非阻塞套接字,您无法直接使用通道的套接字;您需要使用频道的read()write()方法。

当您编写自己的ObjectOutputStream时,您将主要需要覆盖write()方法来缓冲输出,并使用flush()方法将缓冲区写入通道。然后,覆盖writeObject()方法,如下所示:

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

确保在每个对象写入后写入数据。

答案 1 :(得分:0)

我在这个领域工作已经有一段时间,但它似乎比简单地包装writeObject更复杂。 java.nio通常需要固定大小的缓冲区(尽管您可以动态地分配它们,我相信),并且您的远程端点需要知道在线路上任意Object读取多少内容。我最终做的是发送一个初始的int标题告诉另一端有多少数据可以预期,然后将对象序列化为一个字节数组并将其发送到网络中。

got an example of this可能仍有一些错误,因此请自担风险。需要PendingDataBufferS来处理大于最初分配的固定大小缓冲区的对象。