为什么这段代码返回java.net.socketException?

时间:2010-01-18 19:29:51

标签: java networking

这些是我的客户端和服务器类,但我不知道为什么收到的文本不能以正确的方式工作(它会返回一些但不是我想要的那个)当我关闭运行部分时服务器我将有这些例外,请帮助我。谢谢

服务器端:

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);
    }
当用户在文本区域写一些内容并单击发送按钮时,将调用

活动方法。

堆栈跟踪:

    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 :(得分:0)

这通常发生在插座关闭时,导致连接中止 close()documentation个州:

  

此套接字上的I / O操作中当前阻塞的任何线程都将抛出SocketException

如果您想要TCP正常连接终止,请使用shutdownOutput() 如果在服务器上调用shutdownOutput,则客户端的readLine()将返回null,表示EOF(文件末尾)。现在客户端应该调用shutdownOutput。