【问题标题】:Netty TCP Client async messagesNetty TCP 客户端异步消息
【发布时间】:2017-04-07 19:22:55
【问题描述】:

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

在hander中我存储了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 方法,所以它需要异步工作。”这不一定是后果。你能详细说明预期的工作流程吗?
  • @davidxxx 你是对的。它不必异步工作。我唯一要做的就是从不同的线程调用 send 方法。

标签: java tcp netty tcpclient


【解决方案1】:

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

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

还要注意,大多数情况下最好使用writeAndFlush() 而不是write()

查看this presentation了解更多详情。

【讨论】:

    猜你喜欢
    • 2013-01-06
    • 2015-11-05
    • 2019-09-09
    • 2012-05-16
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    相关资源
    最近更新 更多