отключение от сокета в java - PullRequest
5 голосов
/ 26 апреля 2011

Привет Я строю небольшую P2P-программу, реализующую как на стороне сервера, так и на стороне клиента. Когда я запускаю программу на стороне клиента, сначала думаю, что она подключается к каждому серверу в своем списке, отправляет данные (о стороне клиента) и отключается. Когда клиент в следующий раз подключится к одному из этих серверов, он будет распознан.

Моя проблема - когда я говорю стороне клиента отключиться, я получаю это исключение

java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at oop.ex3.nameserver.NameServerThread.run(NameServerThread.java:24)

для отключения я просто написал:

 finally {
        out.close();
        in.close();
        socket.close();
    }

Итак, как мне избежать этого исключения? спасибо!

Ответы [ 3 ]

10 голосов
/ 26 апреля 2011

JavaDoc для Socket.close () четко гласит:

Закрытие этого сокета также закроет InputStream сокета и OutputStream.

, который сгенерирует исключение, поскольку вы уже закрыли их!

0 голосов
/ 06 октября 2012

Правильно ли делать сброс перед закрытием выходных потоков?:

finally {
    //this is the DataOutputStream
    if(dout != null){
        dout.flush();
        dout.close();
    }
    //and this the OutputStream
    if(out != null){
        out.flush();
        out.close();
    }
    if (din != null){
        din.close();
    }
    if (in != null){
        in.close();
    }
    if (socket != null){
        socket.close();
    }
}
0 голосов
/ 26 апреля 2011

Когда вы закрываете клиентскую часть, что вы ожидаете от серверной части?

Чтобы избежать этого исключения, вам необходимо реализовать собственный метод readUnsignedShort (), например.

public int readUnsignedShort() {
   int ch1 = in.read();
   int ch2 = in.read();
   if ((ch1 | ch2) < 0)
//     don't throw new EOFException(); 
       return -1; // EOF marker.

   return (ch1 << 8) + (ch2 << 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...