ServerSocket: обработка отключений от клиента

#java #sockets #callback #event-handling #serversocket

#java #сокеты #обратный вызов #обработка событий #serversocket

Вопрос:

Требование: Я пишу Java-приложение, в котором мне нужно, чтобы мое приложение действовало как сервер, прослушивающий определенный порт ‘xxxx’ для входящих подключений по TCP. После подключения к клиенту от клиента будет отправлен поток байтов, который мое приложение обработает и соответствующим образом сохранит информацию в базе данных. До сих пор мне удавалось реализовать эту функциональность.

Сценарий для обработки: мне нужно обработать один конкретный сценарий (который может быть редким, но все же). Временами соединение клиент-сервер может прерываться из-за сетевых условий. В этом случае мне нужно, чтобы мое приложение дождалось восстановления соединения и возобновило чтение потока байтов от клиента.

Я относительно новичок в программировании сокетов на Java и ищу жизнеспособные решения. Мне пришло в голову два возможных решения (которые могут быть, а могут и не быть технически осуществимыми):

  1. Настройка обратного вызова — я мог бы настроить обратный вызов таким образом, чтобы метод readFromClient() инициировался, как только соединение (повторно) установлено. Я не знаю, как это сделать.
  2. Добавление прослушивателя событий — Если соединение с клиентом считается событием, я мог бы зарегистрировать прослушиватель событий и запустить метод readFromClient(), как только соединение будет (повторно) установлено. У меня есть основная идея о том, как это сделать, и я также пытаюсь ее реализовать. Но был бы признателен, если кто-нибудь сможет предложить чистый подход.

Я не знаю, думаю ли я в правильном направлении. Но я думаю, что это могли бы быть возможные решения. Будем признательны за любую помощь.

Комментарии:

1. Используете ли вы tcp или udp?

2. @Wufo — Извините, что я не упомянул эту деталь. Я использую TCP.

Ответ №1:

восстановите и возобновите чтение потока…

Суть в том (в моем понимании): восстановления не происходит. Если соединение пропало (возникает исключение IOException), восстанавливать больше нечего.

Используя TCP, вам не нужно (или меньше) заботиться о состоянии сети.

Если вы хотите знать, является ли соединение активным, вы должны использовать heartbeats.

Если вы хотите повторно подключиться к клиенту, он должен предоставить вам такую возможность.

Возможно, я не понял, о чем вы говорите, но вы могли бы опубликовать некоторый код и показать ситуацию с ошибкой (возможно, некоторые ошибки).