Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
服务器-客户端通信java_Java_Client - Fatal编程技术网

服务器-客户端通信java

服务器-客户端通信java,java,client,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.

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

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();
    }
}
如果我在调试模式下运行它,它总是有正确的结果。例如

  • 请输入密码
  • 用户类型通过
  • 传球正确
  • 请键入命令
  • 然后键入命令
当它不处于调试模式时,一切都会出错。我甚至没有收到服务器的初始请求。发生了什么事?我认为读取行可能执行得太快了?

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

只需在时删除该
,然后执行一个简单的
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;
  }
}
.ready()中的
不会等待任何数据可用。如果客户端读取该行时服务器尚未发送数据,则将完全跳过
readLine()

只需在
时删除该
,然后执行一个简单的
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;
  }
}

是的,你的回答很好,但是,iu如何实现消息的结尾?我只是从另一方发送了一条名为“消息结束”的消息,然后在客户端接收该消息并打破循环?@Martinos:我已经用一个例子更新了我的答案,说明了你如何做到这一点。是的,你的答案说得很好,但是,iu如何实现消息结束?我只是从另一端发送一条名为“消息结束”的消息,然后在客户机上拾取它并打破循环?@Martinos:我已经用一个例子更新了我的答案,说明了如何做到这一点。