2013-10-01 6 views
1

Итак, я пытаюсь создать простую клиентскую программу сервера, где несколько клиентов могут подключаться к одному серверу. Я запускаю поток как на стороне клиента, так и на стороне сервера. У меня есть файл «loginuser.txt», который имеет текст для 5 строк. Этот код является потоком сервера. Когда я вызываю outToClient.println («xxx») или что-то еще, клиент НЕ принимает БОЛЬШЕ, чем одну строку за раз. Каждый раз, когда пользователь вводит что-либо на клавиатуре (на клиентском терминале), следующая строка файла отображается на том же терминале. Может кто-нибудь сказать мне, почему это происходит? Где я иду не так? Основная проблема: для println() одной строки от сервера к клиенту мне кажется, что я каждый раз набираю что-то на стороне клиента.Программирование сокетов в Java - проблема с записью в клиентский сокет со стороны сервера

BufferedReader inFromUser=new BufferedReader(new InputStreamReader(System.in)); 
BufferedReader inFromClient=new BufferedReader(new InputStreamReader(client.getInputStream())); 
BufferedReader userlogr=new BufferedReader(new FileReader("loginuser.txt")); 
PrintWriter outToClient = new PrintWriter(client.getOutputStream(), true); 
if(check==1) 
    { 
     fromclient=inFromClient.readLine(); 
     if(fromclient.compareTo("xxx")==0) 
     { 
      String line; 
      while((line=userlogr.readLine())!=null) 
      { 
       System.out.println(line); 
       outToClient.println(line); 
       outToClient.flush(); 
      } 

     } 
    } 
+2

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

+0

Звучит как проблема протокола (ваш протокол). Я предполагаю, что клиент читает только одну строку для каждой отправляемой строки. Если вы хотите отправить несколько строк в один ответ, вам нужно иметь другой способ узнать, когда вы получили все сообщение. –

+0

Можете ли вы показать соответствующий код клиента? – Fildor

ответ

0

У меня был этот вопрос раньше. Обычно есть три вещи:

1.) Также проверьте строки, которые ваша передача имеет «\ n» в конце. использование \ n и println испортило бы возврат каретки, так как оно будет удвоено. Извлеките все дополнительные «\ n» и попробуйте. (Возможно, это проблема в вашем случае)

2.) Клиентская сторона делает не иметь цикл while для вывода всех передаваемых данных. Вы отправляете данные по строкам. Проверьте, закрывается ли клиент после получения данных.

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