2017-02-05 2 views
1

У меня есть программа Client, которая отправляет серверу строку LISTALL. После этого серверу необходимо проверить все запущенные процессы в системе (Linux) с помощью команды ps -e, а затем вернуть результат клиенту. Очевидно, результат состоит из нескольких строк, так как я могу получить клиент, чтобы получать и хранить их все?Java-клиент/сервер - отправка нескольких строк по соединению сокета

Прямо сейчас, это то, что я получаю от клиента:

Message sent to the server: LISTALL Message received from the server: null

И с сервера:

Server started and listening to.. Message received from client: LISTALL

И затем он перечисляет результаты из ps -e команды как ожидается.

Мой код:

Сервер:

public class Server 
{ 

    private static Socket socket; 

    public static void main(String[] args) 
    { 
     try 
     { 

      int port = 25000; 
      ServerSocket serverSocket = new ServerSocket(port); 
      System.out.println("Server Started and listening to the port 25000"); 

      //Server is running always. This is done using this while(true) loop 
      while(true) 
      { 
       //Reading the message from the client 
       socket = serverSocket.accept(); 
       InputStream is = socket.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       String list = br.readLine(); 
       System.out.println("Message received from client is "+list); 


       //Sending the response back to the client. 
       OutputStream os = socket.getOutputStream(); 
       OutputStreamWriter osw = new OutputStreamWriter(os); 
       BufferedWriter bw = new BufferedWriter(osw); 

       String returnMessage; 
       try 
       { 
        ProcessBuilder build = new ProcessBuilder("ps", "-e"); 
        Process proc = build.start(); 
        BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
       while (reader.readLine() != null) { 
        returnMessage=reader.readLine(); 
          bw.write(returnMessage); 

        proc.waitFor(); 

        System.out.println("Message sent to the client is "+returnMessage); 
        bw.flush();} 
       } 
       catch(NumberFormatException e) 
       { 
        //Input was not a number. Sending proper message back to client. 
        returnMessage = "Please send a proper number\n"; 
       } 


      } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      try 
      { 
       socket.close(); 
      } 
      catch(Exception e){} 
     } 
    } 
} 

Клиент:

public class Client 
{ 

    private static Socket socket; 

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

      //Send the message to the server 
      OutputStream os = socket.getOutputStream(); 
      OutputStreamWriter osw = new OutputStreamWriter(os); 
      BufferedWriter bw = new BufferedWriter(osw); 

      String list = "LISTALL"; 

      String sendMessage = list + "\n"; 
      bw.write(sendMessage); 
      bw.flush(); 
      System.out.println("Message sent to the server : "+sendMessage); 

      //Get the return message from the server 
      InputStream is = socket.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      while (br.readLine() != null) {   
      String message = br.readLine(); 
      System.out.println("Message received from the server : " +message); 
     }} 
     catch (Exception exception) 
     { 
      exception.printStackTrace(); 
     } 
     finally 
     { 
      //Closing the socket 
      try 
      { 
       socket.close(); 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

ответ

1

Ваши чтения петли неверны. Они должны быть в общем виде:

String line; 
while ((line = reader.readLine()) != null) { 
    // Do something with `line` 
} 

В настоящее время вы отбросив все нечетные строки, а печать нуля, если есть нечетное число строк.

+0

По какой-то причине я все равно получаю тот же результат от клиента. То есть вместо вывода «Сообщение, полученное с сервера: ....», за которым следует правильный вывод, он говорит «Сообщение, полученное с сервера: null». – gambit20088

+0

Только если вы не выполнили этот код. С помощью этого кода это невозможно, поскольку вы можете убедиться сами. NB У вас есть эта ошибка в двух местах. – EJP

+0

Так что я должен сделать то же самое в цикле записи? – gambit20088

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