我正在尝试通过通道发送序列化对象。这个想法是用方法构造函数扩展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/