2017-02-21 2 views
0

У меня возникла проблема с использованием цикла while, окружающего BufferedReader в Java. Я делаю некоторые эксперименты с Sockets.Застревание в цикле While с использованием BufferedReader

Мой текущий код:

InetAddress address = InetAddress.getByName(this.IP); 
     SocketAddress socketaddress = new InetSocketAddress(address, this.port); 
     Socket socket = new Socket(); 
     socket.connect(socketaddress); 

     if(socket.isConnected()){ 

      Executor.logger.info("Connection to proxy established!"); 

     } 
     else { 

      Executor.logger.warning("Connection to proxy failed!"); 
      socket.close(); 
      return; 

     } 

     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     String temp2; 
     while((temp2 = in.readLine()) != null){ 

      Executor.logger.info("Running query says " + temp2); 

     } 

Но независимо от того, что я пытался код не будет переходить к следующей строке. Это не спам моего регистратора ни с чем, он просто внезапно останавливается и застревает.

Это только клиентская сторона, и я не контролирую серверную часть получателя.

Я что-то не так?

Благодарим за любую помощь заранее.

редактирует

Сервер командной строки, которая принимает команду с переменными и возвращается с кодом, который говорит вам результат того, что вы сделали. Однако при первом подключении он возвращает что-то вроде сообщения, пустой строки, сообщения, пустой строки, которая является петлей, которая в настоящее время застревает.

+0

Он * блокирует * на 'readLine()', потому что он ждет данных. Соединение не закрыто, поэтому 'readLine()' не возвращает 'null', но никаких данных не поступает, поэтому он продолжает ждать поступления данных. Предположительно, сервер ждет ввода от вас, пока он не вернет больше данных. Вам также нужен другой поток для записи, чтобы вы могли получать данные и отправлять данные одновременно. – Kayaman

+0

Есть ли способ обнаружить, когда BufferedReader пуст? Мне нужен код для продвижения, поскольку он базируется внутри конструктора. – Harieo

+0

Вы должны использовать поточный прослушиватель, такой как DataFetcher: https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io/DataFetcher.java – ControlAltDel

ответ

0

После тестирования я нашел альтернативную переменную, которая может быть использована для определения того, заполнен ли BufferedReader или нет.

Если изменить ((temp2 = in.readLine())! = NULL) из этого кода:

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    String temp2; 
    while((temp2 = in.readLine()) != null){ 

     Executor.logger.info("Running query says " + temp2); 

    } 

и использовать логическое (in.ready()) вместо:

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     out.write("login " + this.user + " " + this.password); 
     out.flush(); 

     String temp2; 
     while(in.ready()){ 

      temp2 = in.readLine(); 

      Executor.logger.info("Running query says " + temp2); 

     } 

Он остановит цикл, если BufferedRead не имеет больше данных для чтения и может быть повторно инициализирован снова, когда это необходимо, путем повторного копирования цикла.

+0

Это будет по-прежнему блокироваться, если доступно не более полной строки. – EJP

+0

Мои тесты того, что он написан без ввода, похоже, работают, и код просто пропускает. Метод читает: «Сообщает, готов ли этот поток к чтению. Буферизованный поток символов готов, если буфер не пуст ...» – Harieo

+0

Предлагаю вам ознакомиться с некоторыми сетевыми учебниками, чтобы узнать, как правильно выполнять сетевой ввод-вывод. Это не правильный путь, даже если это может сработать для конкретного случая. Или вы можете узнать неправильный путь, а затем в какой-то момент в будущем столкнуться с ошибками из-за этого. – Kayaman

Смежные вопросы