Netty TCP客户端异步消息

时间:2017-04-07 08:01:22

标签: java tcp netty tcpclient

我正在构建一个tcp客户端来接收和发送消息。 我按照Netty user guide上的步骤编写了一个简单的tcp客户端,其中包含一个扩展ChannelInboundHandlerAdapter的自定义处理程序。

在汉德中我存储了ChannelHandlerContext

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

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

 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方法。 最好的方法是什么?

提前致谢。

1 个答案:

答案 0 :(得分:2)

ChannelHandlerContextChannel都是线程安全的,因此您可以从任何线程编写而无需担心。

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

另请注意,大部分时间使用writeAndFlush()代替write()更好。

有关详细信息,请查看this presentation