我正在尝试通过通道发送序列化对象。这个想法是用方法构造函数扩展SocketChannel,该方法构造函数保存要发送的Object并添加方法
writeObj(),以便发送序列化对象的大小,然后发送序列化对象。

使用私有字段,我试图以非阻塞模式管理所有过程,因此构造函数将对象保存为序列化为ByteBuffer src字段,并使用writeObj()将对象写入super.write(ByteBuffer src)。 (如果没有完全接收到Object,则分别返回Object readObj(),如果super.read()返回-1,则分别返回super.read()

问题在于SocketChannel是抽象类,因此不允许使用super.write(..)SocketChannelImpl

我应该扩展还是有其他正确的方法来做到这一点?

最佳答案

经典XY问题。


  扩展SocketChannel


你不能


  添加自定义读写


你不能


  我正在尝试通过通道发送序列化对象。这个想法是用方法构造函数扩展SocketChannel的,该方法构造函数保存要发送的对象,并添加方法writeObj()以便发送序列化对象大小,然后发送序列化对象。


你不能不用了您可以将任何Serializable对象序列化为ByteArrayOutputStream,获取其字节,然后通过与发送任何其他字节相同的技术来发送这些字节。


  使用私有字段,我试图以非阻塞模式管理所有过程,因此在构造函数中,将对象保存为序列化到ByteBuffer src字段中,并使用super.write(ByteBuffer src)将writeObj()写入对象。


我不理解“使用私有字段”与这一切有什么关系,因为实际上您不能首先扩展SocketChannel;我也不明白为什么为什么需要私有字段,或者为什么你会这样想。


  (相应的Object readObj(),如果未完全接收到Object,则返回null;如果未完全接收到Object,则返回null
  super.read()返回-1)


这已经是两个主要的设计错误。如果未完全接收到对象,则应继续接收,如果在完全接收到对象之前发生EOS,则应引发异常,而不返回任何内容。


  问题在于SocketChannel是抽象类,因此不允许super.read()和super.write(..)。


问题在于(a)您的设计方法和(b)您的设计细节都(c)根本上有缺陷,并且(d)完全没有必要。除了在非阻塞模式下接收任何应用程序协议消息所需要的代码之外,您不需要任何其他代码。这很复杂,因为您必须在接收方处理流的部分读取和流过早结束,并在发送方处理部分写入,但是它不需要扩展SocketChannel或您提到的其他措施。


  我应该扩展SocketChannelImpl


没有。


  还是有其他正确的方法来做到这一点?


这里有很多关于如何处理这两种情况的文章。

关于java - 扩展SocketChannel以添加自定义读写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37098600/

10-09 13:28