2010-04-09 6 views
2

У меня есть этот код:Как проверить, закрыт ли выходной поток сокета?

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

Где декларация о выходе? Как это инициализируется? Исключением, которое должен сделать ваш код, является не NullPointerException, а IOException. –

+0

Я добавил код, который я использую для инициализации сокета. Андреа, ты говоришь, что нужно исключить IOException. Но это не брошено. Зачем? – Roman

+0

Не знаю. Из источника PrintWriter это должно быть. Единственная проблема, о которой я могу думать, это какая-то проблема синхронизации (вы закрываете автора в потоке и используете его в другом, возможно, исполняете в другом ядре), но я не очень разбираюсь в этой области. EDITED: попытайтесь переместить создание PintWriter внутри потока. –

ответ

7

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

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

3

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

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

Смежные вопросы