我正在建立一个TCP客户端来接收和发送消息。
我按照Netty user guide上的步骤进行操作,并编写了一个带有扩展ChannelInboundHandlerAdapter的自定义处理程序的简单tcp客户端。

在处理程序中,我存储ChannelHandlerContext

 @Override
 public void channelActive (ChannelHandlerContext ctx) throws Exception {
   super.channelActive (ctx);
   this.ctx = ctx;
 }


然后,我有一个使用ChannelHandlerContext发送消息的send方法:

 public void sendMessage (String msg) {
  if (ctx == null) {
    return;
  }
  ChannelFuture cf = ctx.write (Unpooled.copiedBuffer (msg, CharsetUtil.UTF_8));
  ctx.flush ();
}


我发现的另一个选择是在客户端类中使用Channel对象

 channel.writeAndFlush (msg);


我需要从其他线程调用send方法。
最好的方法是什么?

提前致谢。

最佳答案

ChannelHandlerContextChannel都是线程安全的,因此您可以从任何线程进行写而不必担心。

如果使用Channel.write(),则消息将必须通过整个管道。但是,如果使用ChannelHandlerContext.write(),则只需在管道中通过上游处理程序。因此,写入ChannelHandlerContext效率更高。

还要注意,大多数时候最好使用writeAndFlush()代替write()

有关更多详细信息,请参见this presentation

09-11 19:32