当前位置: 首页 > 知识库问答 >
问题:

Netty TCP客户端异步消息

锺离德庸
2023-03-14

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

在hander中,我存储了< code > 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个答案

曾珂
2023-03-14
匿名用户

< code > ChannelHandlerContext 和< code>Channel都是线程安全的,因此您可以从任何线程编写,而不必担心。

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

还要注意,大多数时候最好使用writeAndFlush()而不是write()

请查看此演示以了解更多详细信息。

 类似资料:
  • 异步Mysql客户端 AsyncMysql::query($sql, $usePool = true) 第二个参数设为false将不会使用连接池中的资源,默认都会从连接池中取,配置连接池数量 => config/database.php 具体使用 use AsyncMysql; //设置超时时间 AsyncMysql::setTimeout(2); $res = (

  • 异步Redis客户端 连接池(连接池默认开启) use AsyncRedis; //关闭连接池 AsyncRedis::enablePool(false); //开启连接池 AsyncRedis::enablePool(true); 使用AsyncRedis use AsyncRedis; //设置超时时间 AsyncRedis::s

  • 异步Http客户端 Get方式 1.使用域名形式 use AsyncHttp; //直接使用域名, get方式 $http = new AsyncHttp('http://groupco.com'); //设置2s超时 $http->setTimeout(2); //$http->setCookies(['token' => 'xxxx']);

  • 异步Tcp客户端 串行发包 use AsyncTcp; $tcp = new AsyncTcp('127.0.0.1', 9501); $tcp->setTimeout(2); //串行发送 $res = (yield $tcp->call('hello server!')); $res = (yield $tcp->call('hello serv

  • 我正在使用Android异步Http客户端。我的代码看起来像这样,并且运行良好。 我实现了一个静态HTTP客户端。我的服务器返回这个JSON数据。我不想将其视为字符串并将其转换回JSON。但是当我将其更改为eclipse告诉我 new AsyncHttpResponseHandler(){}类型的onSuccess(JSONObject)方法必须重写或实现超类型方法

  • 为方便测试,我们以RPC中的例子来实现服务端,具体请看文档RPC章节。 纯原生异步 public static function mainServerCreate(ServerManager $server,EventRegister $register): void { // TODO: Implement mainServerCreate() method.