закрытие канала сокета асинхронно - PullRequest
4 голосов
/ 26 октября 2010

У меня есть однопоточный неблокирующий сервер ввода-вывода сокетов, написанный на Java с использованием nio.

Когда я завершу запись в соединение, я хочу закрыть его.

закрытие канала означает блокирование до тех пор, пока все буферизованные записи не будут подтверждены получателем?

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

Есть ли способ настроить это, например, с помощью setSoLinger() (и какие настройки будут уместны?)

(За рамками Java было бы полезно обсудить Linux и другие ОС в этом отношении)

Ответы [ 2 ]

3 голосов
/ 29 октября 2010

Закрытие в неблокирующем режиме неблокирующее.

Вы можете перевести канал в режим блокировки, установить положительное время ожидания задержки и закрыть его, и это будет блокировать на время ожидания задержки, пока очищается буфер отправки сокета, но, увы, Java не выдает исключения, если истечение времени ожидания истекло, поэтому вы не можете знать, все ли данные исчезли. Я сообщил об этой ошибке десять или более лет назад, и она вернулась «не будет исправлена» из-за проблем совместимости. Если вы можете подождать, пока выйдет Java 7, я считаю, что в nio2 это исправлено, я, конечно, просил об этом, но кто знает, когда это будет?

И даже если у вас есть все это, все, что вы знаете, это то, что данные были отправлены. Вы ничего не знаете о том, что оно было получено или обработано приложением получателя. Если вам это нужно, вы должны встроить его в протокол приложения.

1 голос
/ 26 октября 2010

Я не уверен, что на самом деле происходит, но я знаю, что close() включает flush() (кроме PrintStream и PrintWriter ...).

Таким образом, мой подход заключается в добавлении соединений для закрытия очереди и обработке этой очереди во втором потоке (включая обработку ошибок).

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

...