Можно ли переопределить занятый порт?
У меня есть игровой сервер, который является java-приложением. Этот сервер прослушивает порт 25565. Клиенты подключаются к этому серверу, соединения могут длиться до нескольких часов.
Передо мной стала проблема деплоймента новых версий этого сервера. Чтобы запустить новую версию сервера, старый необходимо выключить. Но это приводит к закрытию соединений с клиентами. Даже в 4 часа утра имеется довольно много клиентов.
Я хотел бы запускать новую версию сервера, но при этом старую версию не выключать до тех пор, пока там имеются соединения клиентов. Но в таком случае новый сервер не включится, потому что он не сможет занять порт 25565, который все еще будет занимать старое приложение.
Можно ли как-то новому серверу переопределить порт 25565?
Чтобы новые соединения поступали на новый сервер, но при этом оставшиеся соединения с старым сервером не закрылись.
У меня сервера работают на debian 9.
Ответы (2 шт):
Переносишь основной порт сервера на порт 25560
Фаерволом делаем проброс
iptables -t nat -A -p tcp --dport 25565 -j REDIRECT --to-port 25560
Второй сервер запускай на порту 25561
Добавляем проброс на новый порт и удаляем проброс на старый
iptables -t nat -A -p tcp --dport 25565 -j REDIRECT --to-port 25561
iptables -t nat -D -p tcp --dport 25565 -j REDIRECT --to-port 25560
Притом установленные соединения остаются там где были. Проблем не будет если клиент держит одно соединение на игру.
Оказывается, что это возможно в java.
Если создать сервер, получить клиента и закрыть сервер, тогда соединение с клиентом останется открытым:
ServerSocket server = new ServerSocket(4004);
Socket clientSocket = server.accept();
server.close();
Thread.sleep(1000);
System.out.println(clientSocket.isConnected());
Я проверил, по соединению clientSocket можно передавать данные.
Порт сервера освобождается после server.close().