2017-04-25 114 views
0

我创建了一个聊天程序,但我无法弄清楚一个小方面。现在的工作方式是这样的:从服务器向所有客户端发送邮件

Server启动

客户端1连接

客户端2连接

客户端1将消息:你好。

服务器获取消息并将其发送给所有连接的客户端。

我遇到的主要问题是服务器发送客户端1的消息给客户端,以及因此现在2“你好”的,而不是仅仅1

这里是我的Server.java

for (Iterator<DataOutputStream> e = clients.iterator(); e.hasNext();) { 
     DataOutputStream dout = (DataOutputStream)e.next(); 

     dout.writeUTF(message); 
} 

回答

1

首先,改变clients list型为Socket

static List<Socket> clients = new ArrayList<Socket>(); 

然后,创建Socket型公共变量保存发送方客户端。

private static Socket senderSocket; 

之后,更换此:

Socket s = ss.accept(); 
System.out.println("Connection from " + s); 
DataOutputStream dout = new DataOutputStream(s.getOutputStream()); 
clients.add(dout); 

与此:

Socket s = ss.accept(); 
System.out.println("Connection from "+s); 
//DataOutputStream dout = new DataOutputStream(s.getOutputStream()); 
clients.add(s); 

最后,改变for循环:

for (Iterator<DataOutputStream> e = clients.iterator(); e.hasNext();) 

到:

for(Socket s : clients) 

而且,在每client创建DataOutputStream并编写您的消息。 而且,当然,在这里您应该跳过等于其套接字中发件人的客户端。

+1

检查部分是至关重要的,因为在不同情况下可能有1000个事件100个1000个用户。因此应该避免检查每个客户端O(n)。广播消息在O(1)中,并且检查过滤器不应该产生任何开销。可能这个讨论不是直接适用于这个问题。但是也应该考虑让客户端智能化的设计选择,以便忽略它自己的信息。 – arunk2

+0

是的,他可以为每个客户端分配一个代码,以便客户端通过该消息发送;当回复的消息带有自己的ID时,他可以忽略它。你是对的想法是在设计;我的回答是基于他的代码,他在开始时发布的。 –

1

有很多方法可以解决这个问题。如果你在网络上编写字符串,你可以简单地创建一个包含用户名(或其他唯一标识符)和消息的可解析字符串,并带有一个可以执行.split()的分隔符。

如果您正在编写对象,您可以创建一个包含字符串(消息)和唯一标识符(如用户名或IP)的Message类,然后将其写入。

当你的服务器得到任何一个,只是检查是否==原点,并不发送它。


或者,首先不要发送消息给自己。如果您发送“Hello”作为消息,则只发送出去,所以当您收回时,您可以显示它。

相关问题