Netty 3.9:如何在断开与服务器的连接后重新使用客户端通道

时间:2015-08-05 10:11:34

标签: netty

我正在使用Netty 3.9

我有一个客户端场景,我必须按此顺序进行操作

  1. connect
  2. 发送1个消息
  3. recv 1 msg
  4. 断开
  5. 由于连接和断开连接是一项代价高昂的操作,我希望尽可能多地重用Netty级别的对象。

    所以我做以下

    ClientBootStrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory);
    
    bootstrap.setPipelineFactory(new MyPipeLineFactory());
    // set options : soLinger, keepAlive, tcpNoDelay, 
    ChannelFuture f = bootstrap.connect(remoteAddr,localAddr);
    f.awaitUninterruptibly();
    Channel ch = f.getChannel();
    
    // use the Channel, send/recv message
    
    // disconnect the channel
    ch.disconnect().awaitUninterruptibly();
    // save the 'ch' in a map
    
    // Now reuse the same Channel Object
    // retreive 'ch'
    ch.connect(remoteAddr)
    

    上面的行导致java.nio.channels.ClosedChannelException,可能是因为套接字已关闭。但在Netty中没有api我可以用来断开与服务器的连接,并且仍然保持套接字与我一起通过再次连接将它重用于同一个远程地址。

    是否可以这种方式重用Netty Channel?如果有,怎么样?我需要在bootsrtap中设置任何选项吗?

1 个答案:

答案 0 :(得分:0)

在Netty 3中断开连接后,频道将关闭,无法重新打开。你必须创建一个新的。

另一种选择是保持连接开放(不要忘记保持连接机制),而从协议的角度来看几乎是关闭的,因此实现了一种连接池。