我正在构建一个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方法。 最好的方法是什么?
提前致谢。
答案 0 :(得分:2)
ChannelHandlerContext
和Channel
都是线程安全的,因此您可以从任何线程编写而无需担心。
如果您使用Channel.write()
,则消息必须通过整个管道。但是如果使用ChannelHandlerContext.write()
,它只需要通过管道中的上游处理程序。因此,写入ChannelHandlerContext
更有效。
另请注意,大部分时间使用writeAndFlush()
代替write()
更好。
有关详细信息,请查看this presentation。