创建echo-server:已连接的客户端获得IO异常

时间:2014-09-23 07:54:25

标签: java chat inputstream outputstream printwriter

我正在尝试创建单线程echo-server,但我无法弄清楚如何从客户端再次从服务器向客户端发送输入。客户端连接到服务器正常,但它正在等待它抛出IOException的响应。我尝试将聊天客户端连接到其他聊天服务器,因此我确定错误在聊天服务器实现中。

我猜这个“恶棍”是下面介绍的方法,它从连接的客户端获取输入并将其发回,但我不确定为什么它不起作用。

private void processClientRequest(Socket clientSocket) throws IOException {
    InputStream in = clientSocket.getInputStream();
    PrintWriter out = 
        new PrintWriter(clientSocket.getOutputStream());
    long time = System.currentTimeMillis();

    out.write("Server - " + time + ": " + in);

    out.close();
    in.close();
}

请告诉我这种方法不是问题,而是需要我代码的其他部分。 提前谢谢!

编辑:我现在设法让我的服务器响应客户端。我通过将processClientRequest方法更改为:

来完成此操作
try {
    BufferedReader in =
        new BufferedReader(
            new InputStreamReader(clientSocket.getInputStream()));

    PrintWriter out = 
        new PrintWriter(clientSocket.getOutputStream());

    long time = System.currentTimeMillis();

    out.write("Server - " + time + ": " + in.readLine());

    out.close();

    try {
        in.close();
    } catch (IOException e) {
        System.err.println("Couldn't close input stream");
    }
} catch(IOException e) {
        System.err.println("Got an IOException error while reading or writing from/to client");
}

但截至目前,我的服务器只能回复客户端一次。如果客户端第二次写入服务器,它会收到响应,但不是客户端消息,而是“空”。而且由于我希望我的echo服务器能够接听客户端,直到客户端关闭或类似的东西,我需要弄清楚如何改变它。我想我将需要某种while循环来实现这一点,但我已经尝试过将整个try语句放入无限循环中,但这只是给了我大量的IOExceptions。

1 个答案:

答案 0 :(得分:1)

您没有阅读客户输入。你只是将toString传递给了你。你需要做一个while循环并从中读取。也许在一个单独的线程中除非你确定输入很短。在测试代​​码中应该没问题:

    private void processClientRequest(Socket clientSocket) throws IOException {
        InputStream in = clientSocket.getInputStream();//wrap this in a object stream or other to read lines/ utf
        int i = 0;
        while(i++ < 1000 && in.available() > 0){
          int read = in.read();//use it if u want, like to a string builder declared out of loop and echo it back after u read input
         }
        PrintWriter out = 
        new PrintWriter(clientSocket.getOutputStream());
        long time = System.currentTimeMillis();

        out.write("Server - " + time + ": " + in);

        out.close();//should be in seperate try catches so if 1 close fails u still close other and finally close socket in 3rd try catch
        in.close();
}

Socket server带有工作回显服务器,迷你网络服务器,并且有很多方面的帮助。