2016-02-04 1 views
1

У меня есть сервер и клиент, работающий на локальном сервере.BufferedReader продолжает ждать ответа

Я прочитал с сервера так:

br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

public static String readResponse() throws IOException{ 
    String response = ""; 
    String line; 
    while((line = br.readLine()) != ""){ 
     System.out.println("s: " + line); 
    } 
    return response; 

} 

И я получаю ответ от сервера, но программа останавливается и никуда не уходит оттуда:

Please enter option number: 1 
c: MSGGET 
s: 200 OK 
s: Go for it now. The future is promised to no one. 

и он просто виснет здесь, когда предполагается продолжить.

Я также попытался:

while((line = br.readLine()) != null){ 

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

Пожалуйста, помогите! Спасибо!

+0

Не ваша проблема (но я подумал, что это было сначала); это не то, как вы сравниваете 'String' (s). Попробуйте 'while (! (Line = br.readLine()). IsEmpty()) {' –

+0

@ElliottFrisch Спасибо! Я попробовал. Имейте такую ​​же проблему хотя! – Nazariy1995

+1

Он будет блокироваться, пока он не получит что-то для чтения. –

ответ

-1

Попробуйте это:

br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    public static String readResponse() throws IOException{ 
     String response = ""; 
     String line; 
     while((line = br.readLine()) != "" || (line = br.readLine()) != null)){ 
      System.out.println("s: " + line); 
     } 
     return response; 

    } 

, если это не работает, то вам нужно проверить, если вы отправляете какой-то специальный символ на конце потока от сервера. Затем примените проверку для этого символа.

+0

Тестирование его для '!= "" 'совершенно бессмысленно, а второй' readLine() 'вызов выбрасывает строку ввода. – EJP

+0

отредактировал мой ответ для ошибки скобки. пожалуйста, восстановите. Я проверил для! = "" Как образец. Я написал ниже, что если для обозначения конца потока есть специальный символ, тогда мы должны применить проверку на это. –

+0

Вы не исправили ни одну из проблем, о которых я упоминал. – EJP

1
while((line = br.readLine()) != ""){ 
     System.out.println("s: " + line); 
    } 
    return response; 

} 

Если ваш собеседник не собирается передавать пустую строку в качестве конца-сообщений дозорных, этот цикл не имеет смысла, и она также сравнивает строки неправильно.

И я получаю ответ от сервера, но программа останавливается и никуда не уходит.

Ожидание пустой строки, которая никогда не прибывает. И это игнорирует условие окончания потока.

while((line = br.readLine()) != null){ 

Теперь этот цикл является правильным, но оно не будет выходить до конца потока, который не будет происходить до тех пор, равноправный не закрывает соединение.

Он просто ждёт.

Это то, что он должен делать.

+0

В этом случае сервер должен разорвать соединение? и я просто делаю while (br.ready())? – Nazariy1995

+1

Первый вопрос полностью зависит от вашего прикладного протокола. Если вы ожидаете только одного ответа, сервер должен закрыть соединение после его отправки. В противном случае вам нужно настроить петлю в соответствии с вашим протоколом: возможно, ваш сервер отправляет только одну строку за ответ? Я не знаю. Do * not * используйте 'ready()' или 'available()'. Это не то, для чего они нужны. – EJP

-1

Я закончил с использованием этого:

while(!(line = br.readLine()).equals("exit")){ 

И я спросил человека, ответственного за сервер, чтобы напечатать следующее, когда он сделал писать ответ:

//this was initiated at the beginning of the program 
out = new PrintWriter(socket.getOutputStream(), true); 

out.println("exit"); 

Это, кажется, работает хорошо для меня до сих пор! Спасибо всем за вашу помощь!

+0

Это будет цикл бесконечно, если конец потока достигнет «выхода». Вы должны проверить значение null перед чем-либо еще. – EJP