【问题标题】:Extend SocketChannel to add custom read and write扩展 SocketChannel 以添加自定义读写
【发布时间】:2016-05-08 10:07:03
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java nio socketchannel


    【解决方案1】:

    经典的 XY 问题。

    扩展 SocketChannel

    你不能。

    添加自定义读写

    你不能。

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

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

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

    我不明白“使用私有字段”与这些有什么关系,因为您实际上不能首先扩展 SocketChannel:我也不明白为什么私有字段会是必要的,或者你为什么会这样认为。

    (如果没有完全接收到 Object,则返回 null 或 Object if super.read() 返回 -1)

    这已经是两个主要的设计错误。如果对象没有被完全接收,你应该继续接收,如果在对象完全接收之前发生了EOS,你应该抛出异常而不是返回任何东西。

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

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

    我应该扩展 SocketChannelImpl

    没有。

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多