有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

服务器-客户端通信java

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

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();
    }
}

如果我在调试模式下运行它,它总是有正确的结果。例如

  • 请输入密码
  • 用户类型通过
  • 正确通过
  • 请输入命令
  • 然后你输入命令
  • 等等
  • 等等

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


共 (1) 个答案

  1. # 1 楼答案

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

    只需删除while并执行一个简单的readLine()

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

    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;
      }
    }