[英]Java Non-Blocking IO ObjectStream
我已经看到有关此主题的一些问题,但是它们都已经存在了两年,或者不够详尽。
我一直在将应用程序的旧Socket
实现迁移到新的NIO SocketChannel
,因为它工作不稳定,我将再次做这部分(作为代码审查的一部分)。 所以现在我正在使用Non-Blocking SocketChannel
,并且发现我不能只使用ObjectInputStream
和ObjectOutputStream
因为...嗯,它是非阻塞的。 显然,SocketChannel需要具有传输数据的大小。
是否存在有关此问题的已知解决方案? 是否有可能可以使用的模板,或者通常被认为是最佳实践( 模式 )的解决方案? 我可以利用ObjectInputStream
和ObjectOutputStream
的事实使一切变得容易ObjectOutputStream
。 如果必须创建自己的实现,则可能需要太多时间,并且会在我试图使其更稳定的应用程序中破坏很多事情。
总结中的问题:
SocketChannel
使用ObjectInputStream
和ObjectOutputStream
的通用解决方案? 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年中并没有发生太大变化。
使用包装有ByteArrayOutputStream
的ObjectOutputStream
序列化您的对象,然后获取生成的byte[]
缓冲区。 通过SocketChannel发送缓冲区。
在另一端,从您的SocketChannel
提取byte[]
缓冲区,构造一个ByteArrayInputStream
和ObjectInputStream
,然后读取您的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.