客户端持久套接字

时间:2012-04-02 18:49:03

标签: netty

有人能指出在netty中重用客户端创建的套接字连接需要做些什么?如果我在netty的客户端创建一个通道,多个并发线程可以使用相同的通道而不同步吗?在netty 3.2中处理这种情况的正确方法是什么?

-TK

2 个答案:

答案 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());
        }
    }