从服务器向所有客户端发送邮件
问题描述:
我创建了一个聊天程序,但我无法弄清楚一个小方面。现在的工作方式是这样的:从服务器向所有客户端发送邮件
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);
}
答
首先,改变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
并编写您的消息。 而且,当然,在这里您应该跳过等于其套接字中发件人的客户端。
答
有很多方法可以解决这个问题。如果你在网络上编写字符串,你可以简单地创建一个包含用户名(或其他唯一标识符)和消息的可解析字符串,并带有一个可以执行.split()的分隔符。
如果您正在编写对象,您可以创建一个包含字符串(消息)和唯一标识符(如用户名或IP)的Message类,然后将其写入。
当你的服务器得到任何一个,只是检查是否==原点,并不发送它。
或者,首先不要发送消息给自己。如果您发送“Hello”作为消息,则只发送出去,所以当您收回时,您可以显示它。
检查部分是至关重要的,因为在不同情况下可能有1000个事件100个1000个用户。因此应该避免检查每个客户端O(n)。广播消息在O(1)中,并且检查过滤器不应该产生任何开销。可能这个讨论不是直接适用于这个问题。但是也应该考虑让客户端智能化的设计选择,以便忽略它自己的信息。 – arunk2
是的,他可以为每个客户端分配一个代码,以便客户端通过该消息发送;当回复的消息带有自己的ID时,他可以忽略它。你是对的想法是在设计;我的回答是基于他的代码,他在开始时发布的。 –