如何重新使用 ByteBuffer 将几个 512 字节的块写入套接字?

Posted

技术标签:

【中文标题】如何重新使用 ByteBuffer 将几个 512 字节的块写入套接字?【英文标题】:How do I re-use a ByteBuffer to write several 512-byte chunks to a socket? 【发布时间】:2013-08-27 09:05:36 【问题描述】:

这就是我的意思:

put 512 bytes
SocketChannel#write(this data)
start at the beginning and put 512 bytes again
rinse & repeat

我仍在尝试掌握 ByteBuffers,并且我尝试过使用 ByteBuffer#reset(),但我总是收到 InvalidMarkException,即使这似乎是正确的解决方案(除非我错了,我不会感到惊讶! )

谢谢!

编辑:具体来说,我正在尝试实现同样的效果,除了我想以 512 字节的块而不是批量发送它。 http://privatepaste.com/1fb0e6df07

【问题讨论】:

【参考方案1】:

不,reset() 不是正确的方法。它用于“回滚”流或缓冲区,并不是所有的都支持它(在大多数情况下它不是很有用)。来自 javadoc:

将此缓冲区的位置重置为先前标记的位置。

您可以使用clear() 方法完全清除缓冲区(即将位置设置为零并开始在其中写入更多数据)。

【讨论】:

哪里说不是所有的ByteBuffers都支持reset()?您是否对 InputStream.reset() 感到困惑? @EJP 确实我在考虑 InputStreams。他收到了 InvalidMarkException,因为他没有设置标记。 这是奇怪的事情。我已经尝试过了:in.flip() ... channel.write(in) ... in.clear() 已经没有运气了。 @connergdavis 发布一些您的实际代码,看看发生了什么。您使用的是阻塞模式还是非阻塞模式? @Kayaman 诚然,过去一小时的大部分时间里,我都在尝试将所有内容作为一个缓冲区发送。这工作得很好,但唯一的问题是,如果我让它将数据全部作为一个大块发送,它似乎会逐渐消耗我的 CPU 直到 100%……当然,这很糟糕。我处于阻塞模式,这是一个简单的每个客户端线程模型。这就是我遇到这个问题的地方。 privatepaste.com/1fb0e6df07注意别处,缓冲区返回,翻转,数据正常发送到通道。

以上是关于如何重新使用 ByteBuffer 将几个 512 字节的块写入套接字?的主要内容,如果未能解决你的问题,请参考以下文章

将几个依赖库链接到我的“裸机”C 应用程序中

如何使用从views.py发送的变量将几个参数传递给url模板标签

如何用python将几个列表转换成树形结构?

如何将几个 UIBarButtonItem 添加到导航栏?

如何将几个 EXTJS Grids 数据写入一个请求?

你如何将几个学生比作一列?