【发布时间】:2018-02-08 04:20:41
【问题描述】:
我有一个连接的客户端列表,例如 SimpleChannelHandler:
List<ChannelHandler> clients = new ArrayList<ChannelHandler>();
我想向他们发送诸如“Hello”字符串之类的数据。我正在创建一个包含此数据的新 ChannelBuffer:
ChannelBuffer cb = ChannelBuffers.buffer(1024);
cb.writeBytes("Hello".getBytes());
然后我想将此数据发送给所有连接的客户端。问题是 - 我可以只使用这个通道缓冲区将这些数据发送给所有客户端,还是应该为每个客户端创建一个新的通道缓冲区? 我问是因为据我所知,在调用 channel.write(cb) 操作之后 - ChannelBuffer 写入索引会改变,我怀疑相同的缓冲区是否会正确发送到下一个客户端。
所以,有两种方法。第一个,只向所有客户端发送一个 ChannelBuffer:
ChannelBuffer cb = ChannelBuffers.buffer(1024);
cb.writeBytes("Hello".getBytes());
for(ChannelHandler ch : clients)
ch.write(cb)
第二个,为每个客户端创建一个新的ChannelBuffer:
for(ChannelHandler ch : clients) {
ChannelBuffer cb = ChannelBuffers.buffer(1024);
cb.writeBytes("Hello".getBytes());
ch.write(cb)
}
哪种方式正确?
更新:
我做了一些测试,可以说第一种方法行不通。在第一次发送 ChannelBuffer 后,channel.write 操作会将 writerIndex 重置为零,所有下一个客户端都不会得到任何信息。 要在不使用第二种方式的情况下解决此问题,需要做一些变通方法:
ChannelBuffer cb = ChannelBuffers.buffer(1024); cb.writeBytes("Hello".getBytes()); cb.markWriterIndex(); for(ChannelHandler ch : clients) { cb.resetWriterIndex(); ch.write(cb); }
第二种方式也可以,但它会在每次写入之前创建一个新的 ChannelBuffer 对象。
【问题讨论】: