如何重新使用 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 字节的块写入套接字?的主要内容,如果未能解决你的问题,请参考以下文章