扩展SocketChannel以添加自定义读写

时间:2016-05-08 10:07:03

标签: java nio socketchannel

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

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

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

我应该延长SocketChannelImpl还是有其他正确的方法来执行此操作?

1 个答案:

答案 0 :(得分:2)

经典XY问题。

  

扩展SocketChannel

你不能。

  

添加自定义读写

你不能。

  

我试图通过频道发送序列化对象。我们的想法是使用保存Object的方法构造函数扩展SocketChannel,并添加方法writeObj()以发送序列化对象大小,后跟序列化对象。

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

  

使用私有字段,我试图以非阻塞模式管理所有过程,所以构造函数将对象序列化为ByteBuffer src字段,使用super.write(ByteBuffer src)将writeObj()写入对象。 / p>

我不明白使用私人领域&#39;考虑到你在实践中不能首先扩展SocketChannel:我也不明白为什么私人领域是必要的,或者为什么你会这么想。< / p>

  

(各个Object readObj()如果没有完全接收到Object,则返回null;如果是,则返回Object   super.read()返回-1)

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

  

问题是SocketChannel是抽象类,所以不允许使用super.read()和super.write(..)。

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

  

我应该扩展SocketChannelImpl

没有

  

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

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