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

时间:2014-11-09 09:06:25

标签: 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");
    }
}

我正在运行服务器,并且在执行完整个服务器的代码之后,客户端抛出异常而不打印任何消息。 Ther是:

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)

你能解释一下这种行为吗?

1 个答案:

答案 0 :(得分:1)

  

整个服务器代码执行完毕后

简单。您的服务器已完成执行,因此它会关闭,并且客户端会通过对等方重置连接。

尝试将您的服务器代码置于无限循环中,以便在您欣赏套接字的魔力之前不会过快关闭。像这样,

while(true){
    // Your code here
    try{
        Thread.sleep(10); // Don't forget this!
    } catch(InterruptedException ie){
        ie.printStackTrace();
    }
}

代码说明:将代码置于无限循环中可使您的服务器程序保持活动状态。请记住,Java代码或多或少线性地执行*。 Thread.sleep是必要的,否则您的服务器将占用资源;把它想象成你的CPU"呼吸时间"。

现在,要终止服务器,请向其发送关闭信号(如kill或Ctrl + C)。

*一旦你考虑到JVM在你背后所做的事情,它就不是真正线性的。在执行套接字时必须注意这一事实,因为套接字可能最终会导致线程,而JVM在处理并发时所做的事情很重要。 但是出于简单的客户端 - 服务器程序的目的,我认为这种小手工操作是允许的。