我有一個服務器(線程),該服務器接收數據并具有一組客戶端(套接字)。每當客戶端連接時,都會創建一個新線程,并將新客戶端添加到客戶端陣列。這是客戶:List<Socket> clients = Collections.synchronizedList(new ArrayList<Socket>());因此,服務器將接收到的數據發送給客戶端,如下所示://for each message: for(Socket client : clients){ //throws java.util.ConcurrentModificationException new PrintWriter(client.getOutputStream(), true).println(line); }現在這里有兩個問題:首先,當線程2添加客戶端時,我偶爾會遇到java.util.ConcurrentModificationException。另外,PrintWriter每次發送消息時,我都會創建一個新文件。另一個選擇是PrintWriter為每個客戶端存儲一個,但是它是一個客戶端,因此存儲一個沒有意義PrintWriter。這是一個好方法嗎?
2 回答

互換的青春
TA貢獻1797條經驗 獲得超6個贊
如果所有客戶端都在等待帶有getString()的println,這是正確的,否則您可能想要更改為UDP協議。
不必創建新的PrintWriter每個循環,因為連接將保持打開狀態,所以最好是一個(對于每個客戶端),而且在客戶端,您將只有一個Reader,并且它將通過其get方法等待消息。
對于并發問題,您必須創建當前列表的副本:
for (Socket client : new ArrayList<>(clients)) {
new PrintWriter(client.getOutputStream(), true).println(line);
}

三國紛爭
TA貢獻1804條經驗 獲得超7個贊
您正在client.getOutputStream()
遍歷列表的同時嘗試訪問對象(),因此java.util.ConcurrentModificationException
。更改您List<>
的ConcurrentLinkedQueue
。同樣在PrintWriter
這里,您只需包裝現有流。
添加回答
舉報
0/150
提交
取消