Отправка данных клиенту через SocketChannel после того, как он закрыл

У меня есть клиентское и серверное приложение, где клиент отправляет байт данных, который сигнализирует о том, что пользователь закрыл окно клиента и завершил работу клиентской программы. Проблема в том, что сервер может отправить одно последнее уведомление этому клиенту перед тем, как его отменить. Если сервер использует метод записи SocketChannel в режиме блокировки, будет ли он блокироваться бесконечно или он просто игнорируется? Должен ли я заставить клиента ждать "подтверждения отключения" перед его отключением?

2 ответа

Решение

Это не будет блокировать вечно, и это не игнорируется. Вполне возможно, что он вообще не будет блокироваться, если в буфере отправки сокета будет место для данных. Если он блокируется, он может вызвать IOException: "сброс соединения по пиру", или он может просто разблокироваться и вернуться нормально. Там нет предсказания этого. Ситуация неправильная и не должна допускаться. Вы можете добраться до согласованной точки взаимного закрытия, отключив оба сокета для вывода и затем считывая, пока не получите EOS; тогда обе стороны находятся в одной точке и могут закрыться.

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

Другие вопросы по тегам