为了账号安全,请及时绑定邮箱和手机立即绑定

这是发送给多个客户端的正确方法吗?

这是发送给多个客户端的正确方法吗?

沧海一幻觉 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 关注
  • 142 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信