2012-02-18 208 views
0

我正在實現一個服務器使用Java ServerSocket並有兩個客戶端連接,每個來自不同的線程。一個向服務器發送消息,另一個從服務器讀取消息。他們都在同一端口上聯繫服務器,所以我如何區分想要閱讀的客戶端和想要寫入的客戶端?Java的serversocket如何寫入和讀取到不同的線程

ServerSocket ss = new ServerSocket(port); 
while (true) { 
    Socket cs = ss.accept(); 
    BufferedReader r = new BufferedReader(new InputStreamReader(cs.getInputStream())); 
    String message = r.readLine(); 
    System.out.println("message"); 

    DataOutputStream os = new DataOutputStream(cs.getOutputStream()); 
    String send = "send"; 
    os.writeBytes(send); 
} 

最後writeBytes導致自認爲相連,以便將消息發送到服務器已經關閉了連接的客戶端的問題。同樣,希望從服務器接收客戶是不會對套接字的輸入流提交任何

回答

0

你將不得不使客戶端寫一個字節或會議開幕表示,如果要閱讀後的String或寫,你不能真正做到這一點神奇的,如果他們連接到同一個端口,除非你可以通過IP地址或東西區分開來

+0

@ user1190650:換句話說 - 你必須指定和實施特定應用協議... – home 2012-02-18 18:56:43

+0

感謝您的幫助! – user1190650 2012-02-19 03:32:33

0

如果您有連接到相同的端口時,會發生什麼多重目的,你必須爲連接建立一個協議,以便客戶端告訴服務器它是什麼類型的客戶端,並且服務器的行爲是相應的。

對於簡單的服務,你可以簡單地在客戶端寫的起始字節告訴它是什麼樣的客戶端,然後服務器相應的行爲。對於稍微更高級的協議,可能最容易重用已經存在強健實現的現有協議。

在你目前的情況,該協議是微不足道的,但你可能會很快運行到比較複雜的情況。這裏,http上的REST-ful協議很可能是一個很好的選擇。