2015-01-10 2 views
0

Я просматривал множество объяснений использования Java Socket и создал следующий базовый код для моей собственной эхо-пары Server/Client. Однако в клиентском коде есть зависание, которое я не могу найти для жизни. Возможно, кто-то еще может это заметить?Ошибка связи сокета Java Echo Socket

// Server Code: 
    try (ServerSocket serverSocket = new ServerSocket(22222); 
       Socket cSocket = serverSocket.accept(); 
       PrintWriter out = new PrintWriter(cSocket.getOutputStream()); 
       BufferedReader in = new BufferedReader(
        new InputStreamReader(cSocket.getInputStream()))) { 
     System.out.println("Client connected: " + cSocket.getInetAddress().getHostAddress()); 
     // console DOES print ^this line and correct IP when client is run. 
     String inLine; 
     while (true) { 
       inLine = in.readLine(); 
       out.println(inLine); 
       if (inLine.equals("exit")) break; 
     } 

    // client code 
    try (Socket socket = new Socket("localhost", 22222); 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in));) { 
    String userIn; 
    while (true) { 
      System.out.print("Client> "); 
     userIn = consoleIn.readLine(); 
     out.println(userIn); // code hangs here. 
     out.flush(); 
     System.out.println("Server> " + in.readLine()); 
     if (userIn.equals("exit")) break; 
    } 
+0

Он не должен блокироваться. Вы уверены, что это не висит на линии раньше, читая консоль? Вы забыли ввести какой-либо вклад в клиент? NB вам нужно проверить результат 'readLine()' для null, с обоих концов. – EJP

+0

Код зависает после ввода некоторого ввода, а затем нажмите клавишу ввода. Запрос направляется в пустую строку и отказывает ввод в консоли клиента. Это было бы ожидаемым поведением, если бы он не смог отправить или получить сообщение с сервера, но я не знаю, что точно. – Chris

+0

https://drive.google.com/folderview?id=0Bzmbe59bsWNmcXpjY0VSclkwWVk&usp=sharing - это ссылка на файлы, если вы хотите ее протестировать. – Chris

ответ

0

Это не блокировка. Он блокирует в readLine() с сервера. Попробуйте flush() после println() на сервере.

+0

Да! Это получилось. Благодарю. Я не думал, что 'flush()' необходимо, но я добавил его в качестве запоздалой мысли в Client. – Chris

+0

Не возникнет ли это ошибка ПОСЛЕ первой попытки, а не ON, первая попытка, если проблема с флешей? Просто искал немного ясности. – Chris

+0

Нет, почему? Это необходимо, если вы не создаете 'PrintWriter' с autoflush, который вы сделали на клиенте, а не на сервере. У вас был избыточный флеш на клиенте и отсутствующий 'flush()' на сервере или отсутствующий autoflush. – EJP