亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這是發送給多個客戶端的正確方法嗎?

這是發送給多個客戶端的正確方法嗎?

滄海一幻覺 2021-05-14 15:15:08
我有一個服務器(線程),該服務器接收數據并具有一組客戶端(套接字)。每當客戶端連接時,都會創建一個新線程,并將新客戶端添加到客戶端陣列。這是客戶: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);

}


查看完整回答
反對 回復 2021-05-26
?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

您正在client.getOutputStream()遍歷列表的同時嘗試訪問對象(),因此java.util.ConcurrentModificationException。更改您List<>ConcurrentLinkedQueue。同樣在PrintWriter這里,您只需包裝現有流。


查看完整回答
反對 回復 2021-05-26
  • 2 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號