Netty写入所有连接的频道

时间:2014-10-23 11:38:33

标签: java netty

我需要一些建议如何实现从某些源(例如文件)获取数据的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);
    }
}

以上解决方案是错误的,因为我希望将每条消息传递给每个客户端。我很感激如何解决我的问题。

1 个答案:

答案 0 :(得分:1)

如果通过传递给每个客户端,则意味着您需要将其发送给每个客户端,那么最简单的方法是使用ChannelGroup本身的方法。 writeAndFlush方法(写入方法,如果netty 3.x)返回一个未来,当消息被刷新到组中的所有通道时将发出信号。

ChannelGroupFuture future = broadcast.writeAndFlush(message);
future.awaitUninterruptibly();

您可以使用ChannelGroupFuture的方法来确定邮件是否已写入所有频道,并确定哪些频道失败。

这会限制您使用最慢频道的效果,但您的示例代码暗示可以。让各个频道全速运行,或者知道信息实际上已经传递,会大大增加范围。