2013-05-01 59 views
0

我目前正在一臺服務器上運行多個客戶端系統。我試圖獲得它,因此服務器可以通過PrintWriter發送一條命令,該命令將通過該套接字上連接的所有客戶端。然而在實踐中,命令只能通過一個客戶端。所有客戶端都在一個套接字上創建,並且都使用相同的掃描器。我正在嘗試做什麼?通過java中的套接字發送數據

一些代碼(櫃面它有助於)插槽

創作:

serverSocketRefresh = new ServerSocket(PORTREFRESH); 
refresh = serverSocketRefresh.accept(); 
Creation of the Print Writer and the Scanner: 

networkOutputRefresh = new PrintWriter(refresh.getOutputStream(), true); 
networkInput = new Scanner(refresh.getInputStream()); 

Ceation的客戶:

do 
{ 
    // Wait for client... 

    client = serverSocket.accept(); 
    System.out.println("\nNew client accepted.\n"); 
    handler = new ClientHandler(client,networkOutputRefresh, itemArray, bidderArray); 
    handler.start(); 
} while (true); 

命令我嘗試發送給所有的客戶端:

public static void updatePrice() 
{ 
    networkOutputRefresh.println("1"); 
} 
+0

在一個插座上連接了哪種不同的客戶端? – 2013-05-01 03:56:17

回答

0

我不知道如果我正確地理解你的代碼讀取,但似乎你正在使用客戶的單一參考。並且您的客戶端引用將保存最後一個客戶端引用,因此Printwrite只寫入該客戶端。理想情況下,如果您想向所有客戶端發佈內容,那麼您應該擁有一組客戶端引用。每當您在服務器套接字上獲得接受權限時,都會將新客戶端引用添加到您的集合中。無論何時您必須發佈給所有客戶端,只需遍歷客戶端集合並使用其關聯的printwriters進行發佈即可。

+0

這工作!非常感謝:) – user2254372 2013-05-01 07:50:40

0

爲什麼不使用BufferedReader和BufferedWriter,並且每次接受客戶端時都要新建一個?

編輯:或者,如果'1'是您通過該套接字發送的唯一信息,則直接通過套接字將其作爲字節發送。我相信,該方法是一樣的東西socket.write(new byte[] { 1 }, 0, 1),並在另一端,socket.read(buffer, 0, 1),其中緩衝區長度的字節數組1.

+0

這是一個關於套接字的uni項目,本教程明確告訴我們使用PrintWriters和掃描儀:/ – user2254372 2013-05-01 03:49:46

+0

@ user2254372啊,好的。 PrintWriters和Scanners應該可以工作,只要你爲每個連接的客戶端創建一個新的。 – AppleDash 2013-05-01 03:51:54

+0

他們沒有辦法與使用同一個掃描器寫入多個線程的打印作家做到這一點嗎? – user2254372 2013-05-01 03:52:02

相關問題