【问题标题】:Netty 3.9: How to Reuse a Client Channel after disconnecting from serverNetty 3.9:与服务器断开连接后如何重用客户端通道
【发布时间】:2015-08-05 10:11:33
【问题描述】:

我使用的是 Netty 3.9

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

  1. 连接
  2. 发送 1 条消息
  3. 接收 1 条消息
  4. 断开连接

由于连接和断开连接是一项昂贵的操作,我想尽可能地重用 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 中设置任何选项吗?

【问题讨论】:

    标签: netty


    【解决方案1】:

    一旦在 Netty 3 中断开连接,通道就会关闭并且无法重新打开。你必须创建一个新的。

    另一种选择是保持连接打开(不要忘记拥有keepalive机制),同时从协议的角度来看实际上是关闭的,因此实现了一种连接池。

    【讨论】:

    • 我的要求是实现短连接,即通道应该在一个请求响应后关闭。所以活动连接的连接池不符合我的要求。
    • 我没有打电话给ch.close(),我打电话给'ch.disconnect`所以应该可以ch.connect
    • 所以你别无选择。您必须重新创建它,而恕我直言,重新连接主要是需要所有延迟,无论您重新连接或创建新频道...
    • 正如我所写:在 Netty 3 中断开连接会导致以下关闭,所以没有区别......
    猜你喜欢
    • 2018-02-20
    • 2017-03-07
    • 2015-05-17
    • 2011-02-22
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多