当前位置: 首页 > 知识库问答 >
问题:

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

刘嘉木
2023-03-14

我用的是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。ClosedChannel异常,可能是因为套接字已关闭。但是Netty中没有api,我可以使用它断开与服务器的连接,并且仍然保留套接字,以便通过再次连接将其重新用于相同的远程地址。

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

共有1个答案

葛鸿轩
2023-03-14

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

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

 类似资料:
  • 我正在开发一个与许多客户端连接的服务器。我需要知道客户端何时与服务器断开连接。因此,每个客户端都向服务器发送一个特定的字符。如果两秒钟后没有收到字符,那么我应该断开服务器与客户端的连接(释放为此客户端分配的资源)。 这是我的服务器的主要代码: 第一个问题是,我用来识别在线客户端的方式(每秒发送特定消息)是否是一种好方法? 如果它是好的,我如何使用检测与女巫客户端相关,然后如何断开密钥与服务器的连接

  • 我正在用Java编写一个简单的TCP客户机/服务器程序对,如果客户机在10秒内还没有发送任何东西,服务器必须断开连接。socket.setsoTimeout()使我得到了这一点,服务器就可以很好地断开连接。问题是--我如何让客户端确定服务器是否关闭?目前,我使用DataOutputStream向服务器写入数据,这里的一些答案表明,向封闭套接字写入数据将引发IOException,但这不会发生。 编

  • 我正在制作满足以下条件的Netty服务器: null 在我的情况下,既没有发生“通道不活动”事件,也没有发生“连接被对等方重置”异常。 这是我使用的Netty测试客户端代码的部分。 如何在要回复时注意到断开连接?

  • 问题内容: 我有一个RMI服务器和一个桌面RMI客户端。重新启动服务器时,客户端出现错误。是否可以在不重新启动客户端的情况下重新启动RMI连接? [编辑]这是堆栈跟踪: 问题答案: 服务器终止后,您将收到一个ConnectException。之后,您可以使用Naming.lookup获取新的服务器对象。

  • 问题内容: 我使用和创建一个实时Web应用程序。我将为用户提供对套接字连接的完全控制,例如手动断开连接和(重新)连接。 在客户端启动时,该功能可以正常运行,但是在使用之后,不会启动新连接。 问题答案: 现在可以使用socket.socket.reconnect() 相关:https : //github.com/LearnBoost/socket.io- client/issues/251

  • 我试图了解服务器-客户端网络如何为实时多人游戏工作。 假设我正在构建一个实时多人游戏,比如FPS。 如果玩家A向玩家B开枪,后端< code >服务器需要告诉玩家B他们被击中了。 我知道如何让玩家 A 告诉后端服务器他开了一枪,只是向服务器发送请求,但是如何让后端告诉玩家 他们被枪杀了? 玩家B是否必须每0.1秒检查一次后端以查看是否发生了什么事情,或者是否有更有效的方法?