确定一个 netty 客户端。 ctx.Write(obj) 和 ctx.channel().Write(obj) 的区别

Posted

技术标签:

【中文标题】确定一个 netty 客户端。 ctx.Write(obj) 和 ctx.channel().Write(obj) 的区别【英文标题】:Identify a netty client. Differences between ctx.Write(obj) and ctx.channel().Write(obj) 【发布时间】:2014-12-07 05:04:41 【问题描述】:

我想知道它是否相同(在 MyHandler.messageReceived(ChannelHandlerContext ctx, object msg) 中调用它们)。

如果相同,我可以这样做吗:

1) 将 Channel 添加到 hashmap

@Override
protected void messageReceived(ChannelHandlerContext ctx, ByteBuf msg) throws Exception 
    //In this handler we add the client to a hashmap
    short id = msg.readShort();
    AllClients.addClient(id, ctx.channel());

2)在另一个客户端的其他处理程序中,向最后一个客户端发送消息:

protected void messageReceived(ChannelHandlerContext ctx, Message msg) throws Exception 
    //In this handler we send a message to other client
    short id = msg.readShort();
    AllClients.getClient(id)
            .getChannel()
            .WriteAndFlush(id + "->" + Message.readString());

对不起,如果我表达不好,我不是英国人。感谢您的帮助:)

【问题讨论】:

【参考方案1】:

不同之处在于 ctx.write(...) 将在上下文中开始写入,这意味着只有它前面的 ChannelOutboundHandler 会看到写入,而 channel.write(...) 将从尾部开始ChannelPipeline 等所有 ChannelOutboundHandler 都会看到写入。您最有可能使用前者。

【讨论】:

好吧,就我而言,我对使用 channel.write(..) 很感兴趣。感谢您的回答,它清楚而准确:)

以上是关于确定一个 netty 客户端。 ctx.Write(obj) 和 ctx.channel().Write(obj) 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Netty 不关闭频道

关于Netty4怎么实现服务发送数据之后等待返回结果

Netty源码 新连接处理

Netty之路(二)TCP拆包/粘包问题

怎么用netty搭建一个websocket的java客户端

netty中一个客户端可以连接(监听)多个服务端并且可以正常发送给不同服务端数据以及接受服务端的数据?