2012-02-15 138 views
0

我試圖在兩個JVM之間發送消息:服務器啓動第二個進程。第二個過程是發送消息到服務器,該消息將消息輸出到控制檯。代碼如下:通過Java中的標準輸入/輸出進行通信

public class Server 
{ 
    public static void main(String[] args) 
    { 
     Process client=null; 
     BufferedReader clientInput=null; 

     try 
     { 
      client=Runtime.getRuntime().exec("java Client"); 
      clientInput=new BufferedReader(new InputStreamReader(client.getInputStream())); 
     } 
     catch(IOException e){} 

     System.out.println("Waiting for the client to connect..."); 

     try 
     { 
      String msg=clientInput.readLine(); 
      System.out.println(msg); 
     } 
     catch(IOException e){} 

     client.destroy(); 
    } 
} 

public class Client 
{ 
    public static void main(String[] args) 
    { 
     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); 

     try 
     { 
      out.write("Ready\n"); 
      out.flush(); 
     } 
     catch (Exception e){} 
    } 
} 

如果我跑,我得到從服務器,沒有輸出。最後,溝通應該是雙向的。任何幫助不勝感激。

編輯:我沒有得到任何錯誤(只是刪除從catch塊的打印語句以節省空間)。

回答

1

您在流結束時收到空。客戶端正確啓動,發送就緒,並結束,所以流結束。

完全正確的行爲。如果客戶端會自行結束(而不是像在stdin上讀取服務器消息那樣做其他事情),那麼服務器將永遠不會收到null。

編輯:永遠不要(!!!!!)做到這一點:

catch(IOException e){} 

至少寫:

catch(IOException e){ e.printStackTrace() } 

這會告訴你你的錯誤!

在我的公司,這是代碼風格的基本規則之一!

+0

的問題是,所有我收到的是空 - 「就緒」從未收到雖然。 – coderino 2012-02-15 16:54:04

+0

我在我的代碼中有e.printStackTrace()。正如我上面所說,我只是把它刪除,以免混亂太多空間。正如我所說,沒有例外。 – coderino 2012-02-16 10:07:48

1

我認爲你需要添加一個while循環:

while ((s = in.readLine()) != null && s.length() != 0) 
    System.out.println(s); 
} 
+0

我會嘗試 - 謝謝。 – coderino 2012-02-16 10:08:43

相關問題