gpt4 book ai didi

java - 停止接受新的 TCP 连接而不丢弃任何现有连接

转载 作者:可可西里 更新时间:2023-11-01 02:30:32 24 4
gpt4 key购买 nike

我有两台服务器监听负载均衡器后面的 TCP 端口。负载平衡器可以检测来自客户端的 TCP 连接尝试是否不成功,并在不断开该连接的情况下重试到第二个服务器。我希望能够在不删除单个客户端集合的情况下关闭这两个服务器中的任何一个进行维护。

我的服务器使用这段代码来处理客户端请求:

ServerSocketFactory ssf = ...
ServerSocket serverSocket = ssf.createServerSocket(60000);
try {
while (true) {
Socket socket = serverSocket.accept();
...// Do the processing
}
} catch (IOException e) {
...
}
...

我最初的想法是添加一个将在应用程序关闭时设置的 boolean 值,并在等待处理和关闭所有现有连接时阻止新的 serverSocket.accept() 调用。但是,甚至在调用 serverSocket.accept() 之前就已经建立了新的连接。如果我在该调用之前放置一个断点,这就是我在 Wireshark 中看到的内容。 enter image description here问题是在我调用 serverSocket.close() 时,所有此类客户端连接都会断开。我想要实现的是通过某种方式告诉 ServerSocket 停止接受所有新连接(即只为新连接发送 RST 或让它们超时),这样负载均衡器就可以将它们重新路由到另一台服务器,但同时不会丢弃任何已经建立的连接。

编辑:我正在寻找一些自动化解决方案,它不需要我在每次更新应用程序时更改任何负载平衡器或操作系统设置。

最佳答案

您可以在服务器上添加防火墙规则,这将阻止新连接但保持旧连接处于 Activity 状态。我想服务器是基于 Linux 的?如果是这样,您可以尝试:

iptables -A INPUT -p tcp --syn --destination-port <port> -j REJECT --reject-with icmp-host-prohibited

之后,您可以使用 netstat 检查是否有任何 Activity 连接,并在没有任何连接时关闭应用程序:

netstat -ant|grep <port>|grep EST

完成维护后,您可以删除防火墙规则。首先,列出所有的规则来找到它:

iptables -L -n

并删除它:

iptables -D INPUT <rule number>

关于java - 停止接受新的 TCP 连接而不丢弃任何现有连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44464617/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com