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()处停止。例外情况消失了。当我调试服务器时,它似乎已经发送了没有问题的变量,但客户端似乎没有收到它。