Как проверить, закрыт ли выходной поток сокета? - PullRequest
3 голосов
/ 09 апреля 2010

У меня есть этот код:

public void post(String message) {
    output.close();
    final String mess = message;
    (new Thread() {
        public void run() {
            while (true) {
                try {
                    output.println(mess);
                    System.out.println("The following message was successfully sent:");
                    System.out.println(mess);
                    break;
                } catch (NullPointerException e) {
                    try {Thread.sleep(1000);} catch (InterruptedException ie) {}
                }
            }
        }
    }).start();
}

Как видите, я закрываю сокет в самом начале кода, а затем try, чтобы использовать его для отправки некоторой информации на другой компьютер. Программа пишет мне «Следующее сообщение было успешно отправлено». Это означает, что исключение NullPointerException не было выдано.

Итак, Java не выдает никаких исключений, если пытается использовать закрытый поток вывода сокета? Есть ли способ проверить, закрыт или открыт сокет?

ДОБАВЛЕНО

Я инициализирую сокет следующим образом:

clientSideSocket = new Socket(hostname,port);
PrintWriter out = new PrintWriter(clientSideSocket.getOutputStream(), true);
browser.output = out;

Ответы [ 2 ]

7 голосов
/ 09 апреля 2010

Я должен был выглядеть лучше.Из javadoc PrintWriter:

Методы в этом классе никогда не выдают исключения ввода-вывода, хотя некоторые из его конструкторов могут.Клиент может узнать, возникли ли какие-либо ошибки, вызвав {@link #checkError checkError ()}.

3 голосов
/ 10 апреля 2010

(a) Не используйте PrintStream или PrintWriter по сети, поскольку они подавляют исключения. Они действительно предназначены только для файлов журналов или консоли, где вам все равно. По сети вы используете протокол и вам нужно сразу же узнать о сбоях.

(b) Socket.isClosed () возвращает true, если вы закрыли либо его ввод, либо вывод. Обратите внимание, что не говорит вам, закрыл ли другой парень соединение - это не его функция. Только чтение EOS может сказать вам это.

...