2016-06-19 3 views
0

Привет, сообщество stackoverflow,Связь с сервером Java Server кажется застрявшей

Я застрял в проблеме связи сокетов в Java.

Вот пример кода моего сервера и клиента класса:

Сервер:

public class OTPServer { 


static ServerSocket serverSocket; 
final static int PORT = 4242; 
static Socket clientConnection; 

public static void main(String[] args) { 

    try { 
     serverSocket = new ServerSocket(PORT); 
     System.out.println("Socket initialized"); 
     String serverMessage = "Hello, I am the Host"; 
     ServerTool serverTool = new ServerTool(); 

     while (true) { 
      clientConnection = serverSocket.accept(); 
      if(clientConnection.isConnected()) { 
       System.out.println("Client connected"); 
      } 

      BufferedReader clientInputReader = new BufferedReader(new InputStreamReader(clientConnection.getInputStream())); 
      DataOutputStream serverOutput = new DataOutputStream(clientConnection.getOutputStream()); 
      System.out.println("Sending message to client: " + serverMessage); 
      serverOutput.writeBytes(serverTool.encodeMessage(serverMessage)); 
      serverOutput.flush(); 
      String clientMessage = clientInputReader.readLine(); 
      System.out.println("Encoded answer from client: " + clientMessage); 
      String decodedMessage = serverTool.decodeMessage(clientMessage); 
      System.out.println("Decoded answer from client: " + decodedMessage); 

      serverOutput.close(); 
      clientInputReader.close(); 

     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("Hello, I am the OTP Server!"); 

} 

Вот Клиент:

public class OTPClient { 

static Socket clientSocket; 
final static int PORT = 4242; 
final static String HOST = "localhost"; 


public static void main(String[] args) { 
    System.out.println("I am the OTP Client!"); 
    String serverMessage; 
    String clientResponse = "I am the Client"; 
    OTPTool otpTool = new OTPTool(); 

    try { 

     clientSocket = new Socket(HOST, PORT); 
     BufferedReader serverInput = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     DataOutputStream outputStream = new DataOutputStream(clientSocket.getOutputStream()); 
     System.out.println("Connection to Host established"); 
     serverMessage = serverInput.readLine(); 
     System.out.println("Encoded Message from Server: " + serverMessage); 
     String decodedMessage = otpTool.decodeMessage(serverMessage); 
     System.out.println("Decoded message from Server: " + decodedMessage); 
     System.out.println("Answering with own message: " + clientResponse); 
     outputStream.writeBytes(clientResponse); 
     outputStream.flush(); 
     outputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

Теперь, когда моя проблема:

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

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

Спасибо заранее!

С наилучшими пожеланиями, Ronny

Btw: я знаю, что сервер подключается только к одному клиенту запрашивает соединение. Это абсолютно для моего использования.

+0

Определенно проблема взаимоблокировки/параллелизма. В каком порядке вы запускаете каждый из этих классов? – vontell

+0

Вы вызываете readLine. Является ли ваш 'serverTool.encodeMessage', включая разрыв строки в конце сообщения? –

+0

@BrettOkken в момент, когда 'serverTool.encodeMessage' возвращает строку параметров. @ vontell сначала я запускаю сервер, а затем клиент, который не должен быть проблемой, так как сервер ждет от клиента подключения к нему. – LongRon

ответ

1

Он застревает, потому что serverInput.readLine(); блокируется до тех пор, пока не произойдет разрыв строки или конец файла. На стороне сервера вы не отправляете разрыв строки, поэтому клиент блокирует.

+0

Спасибо! Я не знал, что регулярное возвращаемое значение String не включает ни один из них. Работает сейчас полностью. Есть ли способ прочитать ввод без прерывания строки или конца файла? – LongRon

+0

Несомненно. Не называть 'readLine'. Используйте один из других методов чтения. Для этого требуется определить «протокол», который определяет начало/остановку сообщений. –