Закрытие BufferedReader/PrintWriter закрывают сокетное соединение?

У меня есть приложение, которое использует простые сокеты для передачи некоторых символов между двумя системами. У меня есть свое JAVA-приложение, работающее как сервер. Я устанавливаю прекрасное соединение, и даже передаю одно сообщение. Однако после того, как одно сообщение было отправлено мои завершения соединения.

Из того, что я могу сказать, что это появляется как будто при закрытии printWriter и bufferedReader сам сокет закрывается?! Это плохо, поскольку у меня есть несколько сообщений для отправки на том же соединении.

printWriter = new PrintWriter(theServer.getClientSocket().getOutputStream());
bufferedReader = new BufferedReader(new InputStreamReader(theServer.getClientSocket().getInputStream()));


printWriter.println("the line");

printWriter.close(); //Closing on these lines?
bufferedReader.close(); //Closing on these lines?

Действительно ли я полон его? Как я поддерживаю это соединение в Java?

16
задан palacsint 26 August 2012 в 17:38
поделиться

4 ответа

Да, закрытие любого Устройства записи/Читателя закроет все другие Устройства записи и Средства чтения, которые они переносят. Не закрывайте его, пока Вы не будете готовы закрыть базовый сокет.

16
ответ дан 30 November 2019 в 17:40
поделиться

Как @Eddie сказал (за секунды до меня! :)), закрытие устройства записи и/или средства чтения закроет базовые потоки сокета и сам сокет : Однако, я верю самому сокету, не будет закрыт .

Закрытие возвращенного InputStream закроет связанный сокет.

Вы не должны закрывать устройство записи, ни средство чтения. Просто сбросьте устройство записи, чтобы удостовериться, что Ваши сообщения прибудут вовремя. Закрытие сокета позже закроет соответствующие потоки, таким образом, Вы не должны будете закрывать их сами. Просто оставьте свои объекты читателя/устройства записи GC.

9
ответ дан 30 November 2019 в 17:40
поделиться

Другая альтернатива должна создать себя фильтры NoCloseInputStream и NoCloseOutputStream, которые просто ничего не делают на завершении; затем используйте их для обертывания потоков сокета приложения (перед любым приложением wrappering как буфер).

Примечание, что, если бы необходимо было сделать это, необходимо было бы сохранить ссылку на сокет (или перенесенные потоки) так, чтобы можно было закрыть сокет, когда Вы на самом деле сделаны с ним.

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

4
ответ дан 30 November 2019 в 17:40
поделиться

Необходимо закрыть сокет после закрытия потоков.

2
ответ дан 30 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: