#java #sockets #callback #event-handling #serversocket
#java #сокеты #обратный вызов #обработка событий #serversocket
Вопрос:
Требование: Я пишу Java-приложение, в котором мне нужно, чтобы мое приложение действовало как сервер, прослушивающий определенный порт ‘xxxx’ для входящих подключений по TCP. После подключения к клиенту от клиента будет отправлен поток байтов, который мое приложение обработает и соответствующим образом сохранит информацию в базе данных. До сих пор мне удавалось реализовать эту функциональность.
Сценарий для обработки: мне нужно обработать один конкретный сценарий (который может быть редким, но все же). Временами соединение клиент-сервер может прерываться из-за сетевых условий. В этом случае мне нужно, чтобы мое приложение дождалось восстановления соединения и возобновило чтение потока байтов от клиента.
Я относительно новичок в программировании сокетов на Java и ищу жизнеспособные решения. Мне пришло в голову два возможных решения (которые могут быть, а могут и не быть технически осуществимыми):
- Настройка обратного вызова — я мог бы настроить обратный вызов таким образом, чтобы метод readFromClient() инициировался, как только соединение (повторно) установлено. Я не знаю, как это сделать.
- Добавление прослушивателя событий — Если соединение с клиентом считается событием, я мог бы зарегистрировать прослушиватель событий и запустить метод readFromClient(), как только соединение будет (повторно) установлено. У меня есть основная идея о том, как это сделать, и я также пытаюсь ее реализовать. Но был бы признателен, если кто-нибудь сможет предложить чистый подход.
Я не знаю, думаю ли я в правильном направлении. Но я думаю, что это могли бы быть возможные решения. Будем признательны за любую помощь.
Комментарии:
1. Используете ли вы tcp или udp?
2. @Wufo — Извините, что я не упомянул эту деталь. Я использую TCP.
Ответ №1:
…восстановите и возобновите чтение потока…
Суть в том (в моем понимании): восстановления не происходит. Если соединение пропало (возникает исключение IOException), восстанавливать больше нечего.
Используя TCP, вам не нужно (или меньше) заботиться о состоянии сети.
Если вы хотите знать, является ли соединение активным, вы должны использовать heartbeats.
Если вы хотите повторно подключиться к клиенту, он должен предоставить вам такую возможность.
Возможно, я не понял, о чем вы говорите, но вы могли бы опубликовать некоторый код и показать ситуацию с ошибкой (возможно, некоторые ошибки).