Почему этот код возвращает исключение java.net.socketException? - PullRequest
0 голосов
/ 18 января 2010

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

на стороне сервера:

final static Vector handlers = new Vector(10);
private Socket socket;
private BufferedReader in;
private PrintWriter out;

public ChatHandler(Socket socket) throws IOException {
    this.socket = socket;
    in = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));
    out = new PrintWriter(
            new PrintWriter(socket.getOutputStream(),true));
}

@Override
public void run() {
    String line;

    synchronized (handlers) {
        handlers.addElement(this);

    }
    try {

        while ((line = in.readLine()) != null && !line.equalsIgnoreCase("/quit")) {
            for (int i = 0; i < handlers.size(); i++) {
                synchronized (handlers) {
                    ChatHandler handler =
                            (ChatHandler) handlers.elementAt(i);
                    handler.out.println(line + "\r");
                    handler.out.flush();
                }
            }
        }
    } catch (IOException ioe) {
        ioe.printStackTrace();
    } finally {
        try {
            in.close();
            out.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            synchronized (handlers) {
                handlers.removeElement(this);
            }
        }
    }
}

сторона клиента: (кроме этого)

public static synchronized void active() {

    String teXt = MainClient.getText();

    os.println(teXt);
    os.flush();
    try {
        String line = is.readLine();



            setFromServertext("Text recieved:"+line+"\n");

        is.close();
        is.close();
        c.close();
    } catch (IOException ex) {
        Logger.getLogger(MainClient.class.getName()).log(Level.SEVERE, null, ex);
    }

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

StackTrace:

    init:
deps-jar:
compile-single:
run-single:
Server is starting...
Server is listening...
Client Connected...
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:168)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
    at java.io.InputStreamReader.read(InputStreamReader.java:167)
    at java.io.BufferedReader.fill(BufferedReader.java:136)
    at java.io.BufferedReader.readLine(BufferedReader.java:299)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)
    at ServerNetwork.ChatHandler.run(ChatHandler.java:44)
Client Connected...
Client Connected...
java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:129)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
    at java.io.InputStreamReader.read(InputStreamReader.java:167)
    at java.io.BufferedReader.fill(BufferedReader.java:136)
    at java.io.BufferedReader.readLine(BufferedReader.java:299)
    at java.io.BufferedReader.readLine(BufferedReader.java:362)
    at ServerNetwork.ChatHandler.run(ChatHandler.java:44)
BUILD STOPPED (total time: 15 minutes 53 seconds)

1 Ответ

0 голосов
/ 19 января 2010

Обычно это происходит, когда сокет закрыт, что приводит к разрыву соединения
Документация из close() гласит:

Любой поток, в настоящее время заблокированный в операции ввода-вывода на этом сокете, выдаст SocketException.

Используйте shutdownOutput(), если вы хотите нормальное завершение соединения TCP.
Если shutdownOutput вызывается на сервере, readLine () на клиенте вернет null, указывая EOF (конец файла). Теперь клиент должен вызвать shutdownOutput.

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