我在尝试使用时遇到异常:
oos = new ObjectOutputStream(socketChannel.socket().getOutputStream());
oos.writeObject(o);
这引发了例外:
java.nio.channels.IllegalBlockingModeException
是否无法在非阻塞套接字中传递对象? 如果是,我该如何继续通过套接字通道传递消息对象?
我在其他地方寻找这个答案,却找不到一个......
答案 0 :(得分:2)
您可能希望编写自己的ObjectOutputStream
实现,将ByteBuffer
和write()
构建到频道。
使用非阻塞套接字,您无法直接使用通道的套接字;您需要使用频道的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
来处理大于最初分配的固定大小缓冲区的对象。