Java ';插座闭合';在readLine()中;

Java ';插座闭合';在readLine()中;,java,tcp,bufferedreader,Java,Tcp,Bufferedreader,每当我试图从我的服务器接收消息时,我都会遇到下面的异常。这发生在行rcvdId=informserver.readLine()。服务器确实收到了我发送的变量。变量serialToNucleo.nucleoAnswer甚至包含一个字符串。我知道代码还不能完全工作,因为我只发送了一个变量,但我正在处理这个问题 客户: try { Socket skt = new Socket("192.168.1.9" , 6789); BufferedReader inFromServer =

每当我试图从我的服务器接收消息时,我都会遇到下面的异常。这发生在行
rcvdId=informserver.readLine()。服务器确实收到了我发送的变量。变量
serialToNucleo.nucleoAnswer
甚至包含一个字符串。我知道代码还不能完全工作,因为我只发送了一个变量,但我正在处理这个问题

客户:

try {

    Socket skt = new Socket("192.168.1.9" , 6789);

    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(skt.getInputStream()));
    PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
    System.out.print("Sending string: '" + vraagTemp + " and " + vraagId+"'\n");
    out.print(vraagTemp + "\n");
    out.print(vraagId + "\n");
    out.close();
    rcvdId = inFromServer.readLine();
    rcvdTemp = inFromServer.readLine();

    WriteToDb writeToDb = new WriteToDb();
    writeToDb.SendDataToDb(rcvdId,rcvdTemp);

    skt.close();

}
服务器:

while (true) {

    Socket skt = serverSocket.accept();
    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(skt.getInputStream()));
    PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
    ontvServer = inFromClient.readLine();
    id = inFromClient.readLine();
    System.out.println("Received: " + ontvServer);

    if (id != null && ontvServer != null)
    {
        serialToNucleo.SetupComm(ontvServer, id);
    }
    else
    {
        Thread.sleep(100);
    }

    if (serialToNucleo.nucleoAnswer!= null) {
        out.print(serialToNucleo.nucleoAnswer + "\n");
        id = null;
        ontvServer = null;
    }
    else
    {
        Thread.sleep(100);
    }

}
来自抛出的异常的Stacktrace

java.net.SocketException: socket closed at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at ChatClient.main(ChatClient.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

“套接字关闭”表示您关闭了套接字,然后继续使用它

这与“连接丢失”无关

发生在这里:

out.close();
关闭套接字的输入或输出流将关闭套接字。更改为
out.flush()


注意:您的服务器代码像筛子一样泄漏套接字

您是否收到任何类型的异常?“socket closed”是它捕获的异常?您可以给出确切的名称吗?这不是很有帮助。java.net.SocketException:socketclosed当你询问异常时,总是发布准确完整的堆栈跟踪。当我调试java程序时,程序在到达我应该关闭套接字的代码行之前就结束了。我对这一切都不熟悉,在这里我非常努力。这项计划已经考虑了好几天了。这里没有服务器“应该关闭套接字”的“代码行”。这只会强化这不是真实代码的结论。服务器不会关闭连接。客户需要。接收异常的是客户端。服务器应在处理完套接字后关闭该套接字。这是资源泄漏。out.close()已更改为out.flush()。现在,客户端程序只是在rcvdId=informserver.readLine()处停止。例外情况消失了。当我调试服务器时,它似乎已经发送了没有问题的变量,但客户端似乎没有收到它。