Закрытие разъемов подключения - PullRequest
0 голосов
/ 20 января 2012

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

поскольку сокет потока, в котором была нажата кнопка «Выход», асинхронно закрывается, в то время как другой сокет пытается прочитать данные, сокет чтения в потоке / living нарушается замыканием и выдает ошибку mssg, в то время как вызывается правильно закрой свою розетку и умри спокойно.

Мне нужны предложения, чтобы прийти сюда ...

это ошибка, которую я получаю:

java.net.SocketException: socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at java.io.BufferedReader.readLine(Unknown Source)
    at chatSockets.ChatClient.run(ChatClient.java:56)
    at java.lang.Thread.run(Unknown Source)

и это код:

public void run() {
    try {
        if (type==Type.CLIENT) {
            socket = new Socket(HOST, PORT);
        } else {
            ServerSocket ss = new ServerSocket(PORT);
            socket = ss.accept();
        }
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));

        while (!socket.isInputShutdown()) {
            chat.append(in.readLine()+"\n");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void actionPerformed(ActionEvent e) {
    String s = name + " : " + chat.getMssg();
    JButton src=(JButton)e.getSource();
    if (src.getText()=="Quit") {
        out.close();
        try {
            in.close();
            socket.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        System.exit(0);
    }
    else {
        out.println(s);
        chat.append(s + "\n");
        chat.clearPanel();
    }

}

Ответы [ 3 ]

3 голосов
/ 20 января 2012

Это ожидаемое поведение. Просто обработайте закрытие сокета на другом конце в блоке catch и продолжите выполнение.

Из Javadoc:

public String readLine()
                throws IOException

Read a line of text. A line is considered to be terminated by any one of a 
line feed ('\n'), a carriage return ('\r'), or a carriage return followed 
immediately by a linefeed.

Returns:
    A String containing the contents of the line, not including any 
    line-termination characters, or null if the end of the stream has been 
    reached 
Throws:
    IOException - If an I/O error occurs

Таким образом, у вас есть два варианта: либо полагаться на тот факт, что IOException выбрасывается, когда другой конец закрывает сокет, и выполнять очистку в блоке catch, либо если вы хотите чистый способ выключения, отправьте специальный " стоп-токен "другому потоку, сигнализирующий о том, что вы выходите и что он должен закрыть сокет на своем конце.

0 голосов
/ 20 января 2012

Попробуйте перехватить исключение на стороне клиента, когда сервер не работает.

0 голосов
/ 20 января 2012

Вы уверены, что клиент работает после запуска сервера?

, если вы пытаетесь создать соединение с сокетом клиента перед сокетом сервера. он не откроет сокет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...