2017-02-05 6 views
1

私はClientという文字列のサーバに文字列LISTALLを送ります。 その後、サーバはps -eコマンドを使用してシステム上の実行中のプロセス(Linux)をすべて確認し、その結果をクライアントに返す必要があります。 明らかに、結果は複数の文字列で構成されています。クライアントを受信して​​すべて保存するにはどうしたらいいですか?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

あなたの読み取りループが正しくありません。彼らは一般的な形式である必要があります:あなたはすべての奇数ラインを捨て、そしてラインの数が奇数の場合はnullを印刷している現在では

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

+0

何らかの理由で、私は依然としてクライアントから同じ出力を得ています。つまり、 'サーバから受信したメッセージ:....'の代わりに正しい出力が続き、 'サーバから受信したメッセージ:null'と表示されます。 – gambit20088

+0

このコードを実行しなかった場合のみ。このコードでは、あなた自身で見ることができるように、不可能です。あなたはこのミスを2か所に持っています。 – EJP

+0

だから私は同じループループで修正する必要がありますか? – gambit20088

関連する問題