将消息从服​​务器发送到所有客户端

时间:2017-04-25 23:24:48

标签: java sockets server client

我已经创建了一个聊天程序,但我无法弄清楚一个小方面。它现在的工作方式是这样的:

服务器启动

客户端1连接

客户端2连接

客户端1发送消息:hello。

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

我遇到的主要问题是服务器向客户端1发送客户端1的消息,所以现在有2"你好"而不是只有1。

这是我的Server.java

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

      dout.writeUTF(message);
 }

2 个答案:

答案 0 :(得分:2)

首先,将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 :(得分:1)

有很多方法可以解决这个问题。如果您正在通过网络编写字符串,您只需创建一个包含用户名(或其他一些唯一标识符)和消息的可解析字符串,并使用可以执行.split()的分隔符。

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

当您的服务器获得时,只需检查来源==目的地,并且不要发送它。

或者,首先不要将信息发送给自己。如果你发送&#34;你好&#34;作为一条消息,只发送出去,所以当你把它拿回来时,你就可以显示它了。