2013-07-15 61 views
1

我是一個初學者程序員,所以這可能很明顯,我忽略了答案。但在這個問題上。如何處理通過套接字連接發送多個消息?

我有一個兩部分的程序(它比這個例子稍微複雜一點,但情況是相同的)。該程序在客戶端和服務器之間觸發了多條消息。我在服務器端有一個PrintWriter向客戶端發送消息,而在客戶端,我有一個BufferedReader來讀取發送的消息。 當這個例子運行時,我給出了兩行輸出。第一條消息是兩條消息,第二條消息是NULL。我想知道的是,如果有辦法基本停止服務器,直到準備好第二條消息,這樣我才能在發送第二條消息之前在客戶端執行一些操作。

我希望不要使用Thread.Sleep,因爲我寧願Server等待,直到客戶端說它已準備就緒。

這是客戶:

public class Client{ 
public void run(){ 
    Socket socket = null; 
    InputStream in = null; 
    BufferedReader reader = null; 

    try{ 
     socket = new socket("LocalHost",1234); 
     in = socket.getInputStream(); 
     reader = new BufferedReader(new InputStreamReader(in));   
    } 

    String messageFromServer = ""; 
    try{ 
     messageFromServer=reader.readLine(); 
    } 

    System.out.println(messageFromServer); 

    String messageFromServer = ""; 

    try{ 
     messageFromServer=reader.readLine(); 
    } 
    System.out.println(messagefromServer); 

    //close everything 
} 

}

這是服務器:

public class Server{ 
    public void run(){ 
     ServerSocket server = null; 
     Socket client = null; 
     try{ 
      server = new ServerSocket(1234); 
      client = server.accept(); 
     } 

     PrintWriter writer = null; 
     OutputStream out = null; 

     try{ 
      out = client.getOutputStream(); 
      writer = new PrintWriter(out, true); 
     } 

     writer.write("Hi I'm a server"); 

     //do some stuff that takes some time, user input, etc. etc. 

     writer.write("I'm still a server"); 

     //close everything 
    }  

謝謝:)

+0

您的客戶端可以發送一個ACK消息,服務器線程將等待它發送另一個消息之前。 – vidit

+0

您可以使用池機制,允許客戶端輪詢服務器 – MadProgrammer

+0

因此,您希望在不使用Thread.Sleep的情況下使服務器成爲SLEEP? –

回答

0

您可以使用ObjectInputStream閱讀對象,而不是字符串。
這樣,每次調用ObjectInputStream.readObject()時,您只會讀取一條消息(在您的情況下爲字符串);

順便說一句,你可以閱讀第一條消息,「做點什麼」,然後閱讀第二條消息。您不必一次讀取所有發送的消息。
如果沒有其他消息,則嘗試從ObjectInputStream中讀取對象時,將阻塞您的線程。
使用它像:
ObjectInputStream inputStream = new ObjectInputStream( socket.getInputStream())

+1

好的建議,這有什麼幫助? – MadProgrammer

+0

@MadProgrammer我編輯了我的答案:) – m1o2

+0

那裏,好多了;) – MadProgrammer

0

的問題,你現在有你的代碼的方式是,你用的是BufferedReader,但服務器不會終止它與新線的消息。

當您關閉writer,客戶在到達EOF或EOS和疏通讀取所以看來這兩個字符串一次發送...

如果你這樣做......

writer.write("Hi I'm a server\n"); 
// This will force the message to be written to the client and picked up ;) 
writer.flush(); 
writer.write("I'm still a server\n"); 
writer.flush(); 

然後你會得到消息seperatly ...

+0

完美的,我覺得這是顯而易見的東西,我忽略了。 有沒有一種方法可以在閱讀器停止閱讀的情況下編寫一個Newline字符? –

+0

是的,但您必須手動讀取閱讀器的內容... – MadProgrammer

相關問題