сервер клиент общение java - PullRequest
1 голос
/ 21 мая 2011

У меня есть этот клиент, информация о сервере не важна. Вывод этого кода очень случайный.

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 голос
/ 21 мая 2011

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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...