有人能指出在netty中重用客户端创建的套接字连接需要做些什么?如果我在netty的客户端创建一个通道,多个并发线程可以使用相同的通道而不同步吗?在netty 3.2中处理这种情况的正确方法是什么?
-TK
答案 0 :(得分:1)
是的,不同的线程可以使用相同的Channel,因为所有方法都是线程安全的。
答案 1 :(得分:0)
从不同的线程调用channel.write()没有问题。 通过处理自定义处理程序中的事件来完成读取,因此不存在多线程问题。当您触发messageReceived事件时,决定做什么是您的事。
获取频道的基本方法是使用ClientBootStrap并执行此操作:
ClientBootstrap bootstrap = new ClientBootstrap(factory);
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("LOGGER", new LoggingHandler("CLIENT", true));
return pipeline;
}
});
// Connect to the server, wait for the connection and get back the channel
ChannelFuture connectFuture = bootstrap.connect(new InetSocketAddress(host, port));
// Wait until the connection attempt succeeds or fails.
Channel channel = connectFuture.awaitUninterruptibly().getChannel();
另一种方法是实现这样的处理程序,并将处理程序添加到工厂中的管道。然后你可以随时访问频道,但第一个解决方案似乎是最好的方法!
public class PublicChannelHandler extends SimpleChannelUpstreamHandler {
Channel channel;
public Channel getChannel(){
if (channel == null) {
throw new IllegalStateException("No underlying Channel is associated with this handler at the moment.");
}
return this.channel;
}
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
this.channel=ctx.getChannel());
}
}