2016-05-02 2 views
0

У меня возникли проблемы с отправкой информации с клиента на сервер. Выход должен быть:TCP-сервер в Java

* Сервер: *
$> Java TCPClient/ServerIP/8080
ID пользователя текущего клиента: каменистый // должен напечатать это, но это не
. ..

Client
$> Java TCPServer 8080
Тип Войти, чтобы начать
Войти // ввод пользователя
ОТ СЕРВЕРА: Пожалуйста, войдите в систему с вашим ID пользователя.
каменистый // пользовательского ввода
Отправленные на сервер: каменистый
...

Но сервер не печатает, что заявление из, это нужно делать с буфером или потоковый необходимости чистить вверх? Код приведен ниже.

TCPServer Код:

... 
BufferedReader inFromClient = new BufferedReader(
      new InputStreamReader(connectionSocket.getInputStream())); 
DataOutputStream outToClient = 
      new DataOutputStream(connectionSocket.getOutputStream()); 
... 
outToClient.writeBytes("Please log in with your user ID.\n"); 
String clientId = inFromClient.readLine() 
System.out.println("User ID of the current client: " + clientId); 
outToClient.writeBytes("Game has started!\n"); 

TCPClient Код:

... 
    DataOutputStream outToServer = 
      new DataOutputStream(clientSocket.getOutputStream()); 
    BufferedReader inFromServer = new BufferedReader(
      new InputStreamReader(clientSocket.getInputStream())); 
    ... 
    System.out.println("Type login to start"); 
    if ((inFromUser.readLine()).equals(login)) 
    { 
      System.out.println("FROM SERVER: " + inFromServer.readLine()); 
      String option = inFromUser.readLine(); 
      outToServer.writeBytes(option); 
      System.out.println("Sent to Server: "+ option); 
      //should print "FROM SERVER: Game has started!" 
      System.out.println("FROM SERVER: " + inFromServer.readLine()); 
    } 
    ... 
+0

Вы пробовали 'OutputStream.flush()'? –

+0

Добавьте отладочную информацию, чтобы узнать, что происходит. Что возвращает 'inFromUser.readLine()', если что? –

+1

Каждый результат 'readLine()' должен быть проверен на значение null до того, как вы сделаете что-нибудь еще с ним. – EJP

ответ

1

Вы путаете символьные потоки и потоки байтов. A DataOutputStream обычно используется для отправки несимвольных данных. Не существует разделителей полей или терминаторов линий, поскольку вход не должен быть свободной. Целое число будет отправлено как ровно 4 байта, а не как переменное число символов между \x0030 и \x0039. Напротив, для линейно-ориентированных символьных данных используется BufferedReader. Символы кодируются с помощью Charset, например ASCII или UTF-16. Линии заканчиваются \n или \r\n в зависимости от платформы.

Для чего вы пытаетесь сделать, то вместо DataOutputStream следует использовать PrintStream. Например:

PrintStream outToClient = new PrintStream(connectionSocket.getOutputStream(), true); 
    outToClient.println("Please log in with your user ID."); 

Аналогичный код для outToServer.

Примечание: true значение, переданное в PrintStream конструктор позволяет автоматически промывку при новой строки посылается, поэтому большинство #flush() звонки становятся ненужными.


EDIT

Для симметрии, потому что вы используете BufferedReader, я бы сказал, использовать PrintWriter. Бросьте замену; использовать точно таким же образом:

PrintWriter outToClient = new PrintWriter(connectionSocket.getOutputStream(), true); 
outToClient.println("Please log in with your user ID."); 

Одно последнее замечание: как PrintStream и PrintWriter Погасить все IOException с.Периодически следует использовать #checkError(), чтобы исключение не произошло, например, закрытие потока.

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