java - 最简单的客户端-服务器中的连接重置异常

标签 java sockets

我是 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/

相关文章:

java - 不能同时在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean 获取多个包

java - 客户端-服务器聊天应用程序 JAVA

java - StringBuilder 和字符串问题

java - 每 30 秒更新一次订单状态

Java Reflection - 访问字段的字段

Java,SSLSocket,没有收到任何答复

c - 如何计算数据包有效负载中的字节数?

c - 套接字缓冲区中的头部空间

java - 模拟器中未从本地主机收到 UDP 数据包

java - 使变量可以被所有方法访问