Программирование сокетов Java - сколько времени соединение сокетов живо? И как я могу это контролировать? - PullRequest
1 голос
/ 28 октября 2011

Знаете ли вы, как я могу сохранить соединение с сокетом, если я не выполняю никаких действий с сокетом? Я только что заметил, что если мое соединение находится в фоновом режиме, и я не работаю с ним, я получаю это:

java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.DataOutputStream.writeInt(Unknown Source)

Итак, как я могу контролировать, что соединение не будет потеряно после некоторого времени простоя и через сколько времени по умолчанию это происходит?

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Эта проблема не имеет общего решения.Вполне вероятно, что удаленный сервер / служба, которая решила сбросить / закрыть соединение TCP / IP.Как и почему он решает, зависит от конкретного приложения.Для предотвращения этого потребуется решение для конкретного приложения.

FWIW, механизм SO_KEEP_ALIVE заставляет стек протоколов время от времени обмениваться сообщениями при неактивном соединении TCP / IP.Это может помочь, если вы испытываете сбросы на подключении через NAT из-за повторного использования порта.Соответствующий метод Java: Socket.setKeepAlive.

1 голос
/ 29 октября 2011

Сброс соединения по пиру: ошибка записи в сокет

Это обычно вызывается записью в соединение, которое уже было закрыто узлом. Это ошибка протокола приложения. Прежде чем беспокоиться о времени жизни соединения, вам следует это выяснить.

...