繁体   English   中英

Java非阻塞IO ObjectStream

[英]Java Non-Blocking IO ObjectStream

我已经看到有关此主题的一些问题,但是它们都已经存在了两年,或者不够详尽。

我一直在将应用程序的旧Socket实现迁移到新的NIO SocketChannel ,因为它工作不稳定,我将再次做这部分(作为代码审查的一部分)。 所以现在我正在使用Non-Blocking SocketChannel ,并且发现我不能只使用ObjectInputStreamObjectOutputStream因为...嗯,它是非阻塞的。 显然,SocketChannel需要具有传输数据的大小。

是否存在有关此问题的已知解决方案? 是否有可能可以使用的模板,或者通常被认为是最佳实践( 模式 )的解决方案? 我可以利用ObjectInputStreamObjectOutputStream的事实使一切变得容易ObjectOutputStream 如果必须创建自己的实现,则可能需要太多时间,并且会在我试图使其更稳定的应用程序中破坏很多事情。

总结中的问题:

  • 有没有在非阻塞SocketChannel使用ObjectInputStreamObjectOutputStream的通用解决方案?
  • 我什至可以做一个混合体,例如在非阻塞模式下接受传入的连接,当选择器发现有要读取的内容时,它会变为阻塞模式? (我知道这听起来很糟糕,但我有些绝望。)

PS:使用Java 8,它是一个TCP流。

我正在使用Non-Blocking SocketChannel,只是发现我不能只使用ObjectInputStream和ObjectOutputStream,因为...嗯,它是非阻塞的。

默认情况下,SocketChannel处于阻止状态。 如果您不想非阻塞,请不要那样配置。

ObjectInputStream和ObjectOutputStream与纯Java IO一起使用要简单得多。

显然,SocketChannel需要具有传输数据的大小。

您不必这样做,但是如果使用的是Object * Stream,它会更简单。

是否存在有关此问题的已知解决方案?

部分原因是使用普通IO,或者使用一定长度的数据块,再使用NIO。

如果要提高性能,建议使用另一个序列化库。 内置的是最慢的选项之一。 有几十种选择(实际上我已经写了两个;)

可能有一个可以使用的模板,还是一种通常被认为是最佳实践(模式)的解决方案?

使用普通IO和更快的串行器。

我可以利用ObjectInputStream和ObjectOutputStream的事实使一切变得容易得多。

在这种情况下,您不希望使用NIO,因为它将使事情变得困难十倍,特别是如果您使用非阻塞IO和选择器。

如果必须创建自己的实现,则可能需要太多时间,并且会在我试图使其更稳定的应用程序中破坏很多事情。

同意,尤其是在有很多选择可供选择时。

有没有在非阻塞SocketChannel中使用ObjectInputStream和ObjectOutputStream的通用解决方案?

一点也不。

我什至可以做一个混合体,例如在非阻塞模式下接受传入的连接,当选择器发现有要读取的内容时,它会变为阻塞模式? (我知道这听起来很糟糕,但我有些绝望。)

当然,就像我说的那样,默认情况下SocketChannel处于阻塞状态,因此您无需执行任何操作。 我也会使受体阻塞。

PS:使用Java 8,它是一个TCP流。

没问题,如果您使用的是Java 1.4,那将是相同的。 这些库在过去12年中并没有发生太大变化。

使用包装有ByteArrayOutputStreamObjectOutputStream序列化您的对象,然后获取生成的byte[]缓冲区。 通过SocketChannel发送缓冲区。

在另一端,从您的SocketChannel提取byte[]缓冲区,构造一个ByteArrayInputStreamObjectInputStream ,然后读取您的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM