我正在开发 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
}
但我想要一个更好的方法。