服务器客户端通信java

时间:2011-05-21 16:03:43

标签: java client

我有这个客户端,服务器信息并不重要。此代码的输出非常随机。

class Client {
    public static void main(String args[]) throws Exception

    {
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        Socket clientSocket = new Socket("127.0.0.1", 10004);//this will become the addr of the server you want to input.
        InetAddress host = clientSocket.getInetAddress();
        //      System.out.println(host);

        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        boolean exit = false;

        while (!exit) {
            while (inFromServer.ready()) {
                System.out.println(inFromServer.readLine());
            }
            String sentence = inFromUser.readLine();
            outToServer.writeBytes(sentence + "\n");
        }
        clientSocket.close();
    }
}

如果我在调试模式下运行它,它始终是正确的结果。 E.g。

  • 请输入密码
  • 用户输入传递
  • 传递正确
  • 请输入命令
  • 并输入命令
  • etc

当它不处于调试模式时,一切都会出错。我甚至没有收到服务器的初始请求。到底是怎么回事?我认为读取行可能执行得太快了?

1 个答案:

答案 0 :(得分:1)

in.ready()不会等待任何数据可用。当客户端读取该行时服务器尚未发送数据,您将完全跳过readLine()

只需删除while并执行普通readLine()

如果有需要等待服务器多行的阶段,则需要实现更多逻辑。通常,服务器将发送“消息结束”标记以向客户端表明它已完成。例如,当服务器完成时,它可以发送消息“END-OF-MESSAGE”。在客户端代码中,您可以执行以下操作:

boolean serverDone = false;
while (!serverDone) {
  String message = in.readLine();
  if (message == null) {
    // handle this problem: the server has closed the connection
    serverDone = true; // or return, or throw
  } else if ("END-OF-MESSAGE".equals(message)) {
    serverDone = true;
  }
}