我需要一些建议如何实现从某些源(例如文件)获取数据的netty服务器,然后将其作为字符串发送到所有连接的客户端。我想在这个类的对象上有类Server和invoke方法广播。它应该像这样使用:
Server server = new Server();
String message;
while (true) {
message = getMessage();
server.broadcast(message);
}
我知道为此我可以使用ChannelGroup但是我不知道如何防止超出通道写入缓冲区(我不知道如何使用channel.isWritable())。
ChannelGroup broadcast = new DefaultChannelGroup("broadcast");
...
public void broadcast(String message) {
for (Channel channel : broadcast) {
if (channel.isWritable())
channel.write(message);
}
}
以上解决方案是错误的,因为我希望将每条消息传递给每个客户端。我很感激如何解决我的问题。
答案 0 :(得分:1)
如果通过传递给每个客户端,则意味着您需要将其发送给每个客户端,那么最简单的方法是使用ChannelGroup本身的方法。 writeAndFlush方法(写入方法,如果netty 3.x)返回一个未来,当消息被刷新到组中的所有通道时将发出信号。
ChannelGroupFuture future = broadcast.writeAndFlush(message);
future.awaitUninterruptibly();
您可以使用ChannelGroupFuture的方法来确定邮件是否已写入所有频道,并确定哪些频道失败。
这会限制您使用最慢频道的效果,但您的示例代码暗示可以。让各个频道全速运行,或者知道信息实际上已经传递,会大大增加范围。