Можно ли переопределить занятый порт?

У меня есть игровой сервер, который является java-приложением. Этот сервер прослушивает порт 25565. Клиенты подключаются к этому серверу, соединения могут длиться до нескольких часов.

Передо мной стала проблема деплоймента новых версий этого сервера. Чтобы запустить новую версию сервера, старый необходимо выключить. Но это приводит к закрытию соединений с клиентами. Даже в 4 часа утра имеется довольно много клиентов.

Я хотел бы запускать новую версию сервера, но при этом старую версию не выключать до тех пор, пока там имеются соединения клиентов. Но в таком случае новый сервер не включится, потому что он не сможет занять порт 25565, который все еще будет занимать старое приложение.

Можно ли как-то новому серверу переопределить порт 25565?
Чтобы новые соединения поступали на новый сервер, но при этом оставшиеся соединения с старым сервером не закрылись.

У меня сервера работают на debian 9.


Ответы (2 шт):

Автор решения: eri

Переносишь основной порт сервера на порт 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().

→ Ссылка