0

我正在开发 netty tcp 客户端服务。

我的问题

在我的服务调用 channel.close() 之后,有没有办法知道服务器是否也调用了 channel.close()?换句话说,有没有办法知道 4 次关闭握手是否完成?

背景

我的服务与一个目标设备(服务器端)进行通信,该设备具有以下一些限制

  • 它只允许一个客户端连接。
  • 如果已经存在连接,请立即关闭新连接。
  • 即使连接处于半关闭状态,它也会将先前的连接视为活动连接。

我的代码大致如下运行。

while(...) {
   channel = bootstrap.connect(...).sync().channel(); // 1 line 
   channel.writeAndFlush(command); // 2 line
   answer = waitForAnswer(); // 3 line
   channel.close().sync(); // 4 line
}

当第二次循环建立新连接时,服务器关闭新连接,因为第一次循环使用的连接仍处于半关闭状态。

如果看下面的抓包,可以看到(1)处于Half Closed状态,(2)建立了新的连接,(3)服务器通知bad connection state并强行关闭新的连接。

他

因此,我们可以通过添加 sleep 来简单地等到 4 次握手完成,如下所示。

while(...) {
   channel = bootstrap.connect(...).sync().channel(); // 1 line 
   channel.writeAndFlush(command); // 2 line
   answer = waitForAnswer(); // 3 line
   channel.close().sync(); // 4 line
   Thread.sleep(100); // 5 line 
}

但我想要一个更好的方法。

4

0 回答 0