【问题标题】:Netty write to all connected channelsNetty 写入所有连接的通道
【发布时间】:2014-10-24 22:48:49
【问题描述】:

我需要一些建议,如何实现一个 netty 服务器,该服务器从某些源(例如文件)获取数据,然后将其作为字符串发送给所有连接的客户端。我想要类 Server 并在此类的对象上调用方法广播。应该这样使用:

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);
    }
}

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

【问题讨论】:

    标签: java netty


    【解决方案1】:

    如果交付给每个客户是指您需要将其发送给每个客户,那么最简单的技术是使用ChannelGroup 本身的方法。 writeAndFlush 方法(如果是 netty 3.x 则为 write 方法)返回一个 future,当消息被刷新到组中的所有通道时将发出信号。

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

    您可以使用ChannelGroupFuture的方法来判断消息是否写入所有通道,并找出哪些通道失败。

    这将限制您使用最慢通道的性能,但您的示例代码暗示这没关系。让各个渠道全速运行,或者知道消息已实际传递,可以显着扩大范围。

    【讨论】:

    • 没错,我应该更具体一些。通过交付给每个客户端,我的意思是每个客户端和每个消息 channel.write(message) 都会被调用。您的解决方案是正确的,但它会很慢。我希望每个频道都全速运行,当频道太慢时,我希望将其断开。我的示例代码只是一个示例,如果可以做得更好,我会非常乐意这样做。你能告诉我你将如何解决这个问题吗?
    • 粗略的选项类似于您的原始代码。创建通道后,将写入高水位标记设置为允许通道落后的最大字节数。如果 channel.isWritable 返回 false,则通道太慢,应该关闭。低水位线无关紧要。对于积压的消息,而不是字节,可能是一个管道处理程序,它检查它是否正在等待写入完成,并将消息排队。它侦听写入未来以发送下一条消息。如果队列太大,它会关闭通道。
    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2018-12-05
    相关资源
    最近更新 更多