2015-04-03 2 views
0

Я из Польши, поэтому я сожалею о любых ошибках.
Я некоторое время кодировал небольшое подключение к серверу и клиенту, когда останавливался на раздражающей проблеме. Когда я отправляю от клиента к серверной информации (String), сервер может ее получить, но не может откликнуться на нее.Java не может получить ответ клиента или сервера

Здесь это код.

Client

private static Socket socket; 

public static void main(String args[]){ 
    try{ 
     String host = "localhost"; 
     int port = 25002; 
     InetAddress address = InetAddress.getByName(host); 
     socket = new Socket(); 
     socket.connect(new InetSocketAddress(host, port), 5000); 

     //Send the message to the server 
     System.out.println("< "+sendMessage(socket)); 
     //socket.shutdownOutput(); 
     System.out.println("> "+getMessage(socket)); 
    }catch (SocketTimeoutException e){ 
     System.out.println(e.getMessage()); // changed 
    }catch (IOException e){ 
     System.out.println(e.getMessage()); // changed 
    }catch (IllegalBlockingModeException e){ 
     System.out.println(e.getMessage()); // changed 
    }catch(IllegalArgumentException e){ 
     System.out.println(e.getMessage()); // changed 
    }finally{ 
     //Closing the socket 
     try{ 
     socket.close(); 
     }catch(Exception e){ 
     System.out.println(e.getMessage()); // changed 
     } 
    } 
} 

public static String sendMessage(Socket client){ 
    try { 
     String message = "test"; 
     PrintWriter writer = new PrintWriter(client.getOutputStream(), true); 
     writer = new PrintWriter(client.getOutputStream(), true); 
     writer.print(message); 
     writer.flush(); 
     writer.close(); 
     return message; 
    } catch (IOException e) { 
     System.out.println(e.getMessage()); // changed 
     return "false"; 
    } 
} 

public static String getMessage(Socket client){ 
      try { 
       BufferedReader socketReader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
       return socketReader.readLine(); 
      } catch (IOException e){ 
       System.out.println(e.getMessage()); // changed 
       return "false"; 
      } 
     } 

И .. сервер

public class kRcon{ 
     private static Socket socket; 
     private static ServerSocket serverSocket; 
     private static Thread u; 

     private static class Server extends Thread { 
       public void run() { 
         int port = 25002; 
         try { 
          serverSocket = new ServerSocket(port); 
         } catch (IOException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } 
         while(true) { 
          try { 
          socket = serverSocket.accept(); 
          BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
          BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
          String str = socketReader.readLine(); 
         socketReader.close(); 
          System.out.println(str); 
          socketWriter.write("test"); 
          socketWriter.flush(); 
          socketWriter.close(); 
          } 
         }catch (IOException e1) { 
          e1.printStackTrace(); 
         } 
       } 
     public static void init(){ 
     try { 
      u = new Server(); 
      u.setName("Server"); 
      u.start(); 
     } catch (IOException e) { 
      System.out.println(e.getMessage()); // changed 
     } 
    } 
} 

Результаты
Если я начинаю первый сервер все выглядит хорошо. Итак, я начинаю клиент с Parametr «тест», выход над на консоли:

< test 
Socket is closed // changed 

На стороне сервера в консоли у меня есть:

"test" 
Socket is closed // changed 

Я попытался отключения входов и выходов и я не знаю, что делать. Пожалуйста, помогите: с

Edited 2015-04-03
Я изменил строки с комментарием «изменился».

Для Google и читателей Чтобы устранить проблему, не закрывайте StreamReaders над StreamWriters со стороны клиента. Благодаря EJP, за помощью!
Поздравления из Польши.

ответ

0

Когда вы получаете исключение, распечатайте его. Не просто выбросьте всю эту информацию. И не возвращайте магию Strings. В этом случае вы должны позволить распространению исключения. Если бы вы сделали все это, вы бы увидели, что исключение SocketException: socket closed было брошено getMessage(),, и у вас было бы что-то конкретное, чтобы исследовать, а не полную тайну.

Это вызвано закрытием PrintWriter в sendMessage(). Закрытие входного или выходного потока сокета закрывает другой поток и сокет.

+0

Красивая! Оно работает! Thaaaank вас! – kGielo