我是 Java 网络编程的新手,我的问题可能看起来太明显,但假设我有一个客户
package com.client.main;
public class Main {
public static void main(String args[]) throws Exception{
Socket s = new Socket("localhost", 12345);
BufferedReader r = new BufferedReader( new InputStreamReader(s.getInputStream()));
System.out.println(r.readLine());
}
}
和服务器:
package com.server.main;
public class Main {
public static void main(String args[]) throws Exception{
ServerSocket server = new ServerSocket(12345);
Socket client = server.accept();
PrintWriter writer = new PrintWriter(client.getOutputStream());
writer.write("Hello from server");
}
}
我正在运行服务器,在执行整个服务器的代码后,客户端抛出异常而不打印任何消息。有:
Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at com.client.main.Main.main(Main.java:14)
你能解释一下这种行为吗?
最佳答案
after whole server's code has been executed
简单。您的服务器已完成执行,因此它关闭,并且客户端得到了对等方重置的连接。
尝试将服务器代码置于无限循环中,这样在您领略套接字的魔力之前,它就不会关闭得太快。像这样,
while(true){
// Your code here
try{
Thread.sleep(10); // Don't forget this!
} catch(InterruptedException ie){
ie.printStackTrace();
}
}
代码说明:将代码置于无限循环中可以使服务器程序保持 Activity 状态。请记住,Java 代码或多或少是线性执行的*。 Thread.sleep
是必要的,否则你的服务器将占用资源;将其视为 CPU 的“呼吸时间”。
现在,要终止您的服务器,请向其发送关闭信号(例如 kill
或 Ctrl+C)。
*一旦您考虑到 JVM 在您背后所做的事情,您就会发现它并不是真正的线性。在使用 Socket 时请务必注意这一事实,因为 Socket 最终可能会导致线程,而在处理并发时 JVM 所做的事情很重要。 但是对于简单的客户端-服务器程序来说,我认为这种小小的挥手是允许的。
关于java - 最简单的客户端-服务器中的连接重置异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26826670/