我已经创建了一个聊天程序,但我无法弄清楚一个小方面。它现在的工作方式是这样的:
服务器启动
客户端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);
}
答案 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;作为一条消息,只发送出去,所以当你把它拿回来时,你就可以显示它了。