我正在建立一个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方法。
最好的方法是什么?
提前致谢。
最佳答案
ChannelHandlerContext
和Channel
都是线程安全的,因此您可以从任何线程进行写而不必担心。
如果使用Channel.write()
,则消息将必须通过整个管道。但是,如果使用ChannelHandlerContext.write()
,则只需在管道中通过上游处理程序。因此,写入ChannelHandlerContext
效率更高。
还要注意,大多数时候最好使用writeAndFlush()
代替write()
。
有关更多详细信息,请参见this presentation。