2011-12-19 3 views
2

Я изучаю java и сталкивался с некоторыми проблемами с сокетами. Я разработал простое приложение клиент-сервер - вид стук-стук, он выполняет 4 шага:Сокеты, BufferedReader.readline() - почему поток не готов?

  1. клиент посылает какое-то сообщение на сервер
  2. сервер получит их и сохраняет в файл
  3. сервер отправляет обратно клиенту некоторые другие сообщения
  4. клиент recieves их, а также экономит на файл на шаге 4

появляется проблема: клиент не получает сообщения и никогда не выходит из цикла:

while ((inStr = in.readLine()) != null) { 
    writer.println(inStr); 
} 

где есть тип BufferedReader:

try { 
     socket = new Socket(ipAddress, 4444); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

На на стороне сервера сообщений посылаются:

try { 
     socket = srvSocket.accept(); 
     out = new PrintWriter(socket.getOutputStream(), true);   
     in = new BufferedReader(new InputStreamReader(socket.getInputStream()));     
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

...

out.println("test from server #1"); 
    out.println("test from server #2"); 

на стороне клиента я наблюдал in.ready() - он возвращает false. На стороне сервера я смотрю out.checkError() - он возвращает true;

Что я делаю неправильно - почему поток пуст?

Любая помощь ia оценивается! :)

+0

Любые исключения? – Tudor

+0

попробуйте 'out.flush()' после того, как вы написали строки. – nos

+0

@Sergio: Где находится код сервера, который отправляет сообщения, как вы говорите? –

ответ

-1

Это может быть и не решить вашу проблему. Но попробуйте сохранить все в блоке Try Catch. Например: ваша инициализация ServerSocket, блоки записи и т. Д. Если возникает некоторая ошибка, вы, возможно, не сможете использовать запись, поэтому нет смысла ее инициализировать.
  Вы можете попробовать написать стандартный поток вывода для отладки вместо файла. Ниже код для сервера/клиента - это небольшой вариант и его работа.

Сервер:

Socket socket; 
    ServerSocket srvSocket; 
    BufferedReader in; 
    PrintWriter out; 
    try { 
     srvSocket=new ServerSocket(4444); 
     socket = srvSocket.accept(); 
     out = new PrintWriter(socket.getOutputStream(), true);   
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     out.println("test from server #1"); 
     out.println("test from server #2"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Client

Socket socket; 
    BufferedReader in; 
    PrintWriter out; 
    String inStr; 
    try { 
     socket = new Socket("127.0.0.1", 4444); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     while ((inStr = in.readLine()) != null) { 
      System.out.println(inStr); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

Это не так. И его оригинальный код не слишком отличается от этого. – EJP

+0

@EJP Я запускаю тот же код в своем затмении. Я получаю вывод в консоли. Сначала я запускаю Сервер, затем Клиент – Sumit

+0

Я ссылаюсь на ваше первое предложение. Это 'println()' s, которые решают его проблему, а не обработку исключений. – EJP

2

Вы используете public PrintWriter(OutputStream out, boolean autoFlush), который будет вымывать автоматически на новой линии или println. Он не автофлуш после каждой записи. Вы должны очиститься после каждой записи.

Это javadoc для параметра autoFlush конструктора: Boolean; если true, println, printf, или format методы будут промывать выходной буфер

+0

Спасибо, но попытался сбросить() после каждого println() - тот же результат – Sergio

+0

, если я заменил цикл на [code] inStr = in.readline(); System.out.println (inStr); inStr = in.readline(); System.out.println (inStr); [/ code], чтобы читать 2 строки из потока - он отлично работает – Sergio

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

  • Нет связанных вопросов^_^