gpt4 book ai didi

java - Netty:我应该创建新的 ChannelBuffer 来向每个客户端发送数据吗?

转载 作者:太空宇宙 更新时间:2023-11-04 10:43:32 26 4
gpt4 key购买 nike

我有一个已连接客户端的列表,例如 SimpleChannelHandler:

List<ChannelHandler> clients = new ArrayList<ChannelHandler>();

我想向他们发送“Hello”字符串等数据。我正在创建一个新的 ChannelBuffer,其中包含以下数据:

ChannelBuffer cb = ChannelBuffers.buffer(1024);
cb.writeBytes("Hello".getBytes());

然后我想将此数据发送给所有连接的客户端。问题是 - 我可以仅使用此 channel 缓冲区将此数据发送到所有客户端,还是应该为每个客户端创建一个新的 channel 缓冲区?我这么问是因为据我所知,在调用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 对象。

最佳答案

两种方式都是正确的。您还可以复制 ChannelBuffer,这样就不必每次都 cb.writeBytes

但是,我建议您使用 StringEncoder,这样您就可以直接将 String 写入 channel ,这样您就不必考虑 ChannelBuffer

关于java - Netty:我应该创建新的 ChannelBuffer 来向每个客户端发送数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com