为什么SocketException?

时间:2009-12-19 09:13:08

标签: java networking

我有Client类和Server类,但是当我运行两个main方法然后什么都不会发生时,当我停止运行时,将发生此异常。为什么??请帮帮我,我该怎么办?

我的客户端类:

public class Client {

static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    try {
        Socket c = new Socket("localhost", 5001);
        BufferedReader read = new BufferedReader(new InputStreamReader(c.getInputStream()));
        BufferedWriter write = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
        String string = reader.readLine();
        write.write(string, 0, string.length());
        write.newLine();
        write.flush();
        System.out.println(read.readLine());



    } catch (Exception e) {
        System.err.println(e);
    }
}}

我的服务器类:

public class Server{

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    ServerSocket s = null;
    try {
        s = new ServerSocket(5001);
        System.out.println("listening...");
        Socket so = s.accept();
        BufferedReader read = new BufferedReader(new InputStreamReader(so.getInputStream()));
        BufferedWriter write = new BufferedWriter(new OutputStreamWriter(so.getOutputStream()));
        while (true) {
            String string = read.readLine();
            System.out.println(string);
            String answer = "I got" + string + "from you!";
            write.write(answer, 0, answer.length());
            write.newLine();
            write.flush();
        }
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }

}}

服务器cpnsole中的stacktrace:

run:


listening...
system connected
Hello

Dec 19, 2009 12:58:15 PM server.Main main
SEVERE: null
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
        at java.io.InputStreamReader.read(InputStreamReader.java:167)
        at java.io.BufferedReader.fill(BufferedReader.java:136)
        at java.io.BufferedReader.readLine(BufferedReader.java:299)
        at java.io.BufferedReader.readLine(BufferedReader.java:362)
        at server.Main.main(Main.java:37)
BUILD SUCCESSFUL (total time: 9 seconds)
客户端控制台中的

run:
Hello
I gotHellofrom you!
BUILD SUCCESSFUL (total time: 4 seconds)

2 个答案:

答案 0 :(得分:3)

您的客户端连接到服务器,发送一些数据,读取响应并终止。没关系。

但是您的服务器等待客户端,读取其数据,写入响应,然后尝试再次从客户端读取一些数据。但是客户关闭了连接。因此,服务器会获得您描述的异常。

要解决此问题(在服务器端),您必须在Socket so = s.accept();循环中执行while。并且不要忘记在循环结束时关闭套接字。

答案 1 :(得分:0)

首先。 BufferedWriterSockets无用。使用PrintWriter自动刷新。

PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);// true means "flush automatically"
writer.println(reader.readLine());
// Now you don't have to add a newline and flush.

修改

其次。抛出异常的原因是因为客户端在将输入写入服务器后关闭了Socket。服务器仍在等待另一个String读取。但他不能因为Socket被关闭了。你没有按字面意思关闭它。但该计划在那里结束。所以Java认为:“没有什么可做的,退出”。通过退出,连接关闭。

要解决此问题,您必须将通信置于while(true)循环中,并以正确方式停止连接,发送“连接结束”消息。

客户端:

while (true)
{
    String userinput = reader.readLine(); // From System.in
    writer.writeln(userinput);
    if (userinput.equals("end"))
    {
        socket.close();
        break; // break out of the while(true) loop
    }
}

服务器端:

while (true) {
    String socketinput = reader.readLine();
    if (socketinput.equals("end"))
    {
        socket.close();
        break; // Break out of the while(true) loop.
    }
    ... // Handle the socketInput
}

这也是“Connection reset”的含义。

马亭。