'Socket closed' 在 readLine() 中;

'Socket closed' in readLine();

每当我尝试从我的服务器接收消息时,我都会收到以下异常。这发生在客户端的 rcvdId = inFromServer.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);
    }

}

来自抛出异常的堆栈跟踪

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)

'Socket closed'表示关闭socket然后继续使用

与'connection lost'无关。

它发生在这里:

out.close();

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

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