我在github上为一个学校项目修改了一个开源项目以满足我的需求
它有一个broadcast()
方法来发送消息,并在while循环中被run()
方法调用,但问题是broadcast()
向{{1}中的所有用户发送了一条消息}我想添加通过写userList<>
向其中一个用户发送私人消息的功能。
以下是广播方法的代码:
@username
这是run()方法
private synchronized void broadcast(String msg) {
for (int i = 0; i < clientList.size(); i++) {
clientList.get(i).write(msg);
}
System.out.println("Log: Message broadcast --> " + msg);
}
这是我尝试使用此功能的public void run() {
System.out.println("Log: Got input/output streams for connected client.");
/** Get the first message from the client, attempt communication */
String clientMsg = null;
boolean accepted = false;
/** Allow client to create an account, login, or quit */
do {
clientMsg = client.read();
if (clientMsg.equals("QUIT")) {
System.out.println("Log: Client disconnected without signing in.");
client.disconnect();
return;
}
else if (clientMsg.startsWith("NEWUSER: ")) {
createUser(clientMsg);
}
else if (clientMsg.startsWith("LOGIN: ")) {
accepted = authenticate(clientMsg);
}
else
{
System.out.println("Log: Unexpected client message -> " + clientMsg);
client.disconnect();
return;
}
} while(!accepted);
/** Run main chat loop. Will read from the client, and broadcast each read
* until the client disconnects. */
while (true) {
int i=0;
String username= clientList.get(i).getUsername();
String line = client.read();
if (line == null) break;
else if(line.startsWith("@"+username)){
broadcastp(line,username);
}
else {
broadcast(line);
}
i++;
}
/** The only way for the client to exit the above loop is to disconnect.
* Therefore, call the handler's exit routine */
exit();
}
方法,但是它不起作用。即使没有私人聊天功能,它也可以编译并完美运行。
broadcastp()
答案 0 :(得分:0)
我不了解您的程序如何运行的全貌,但是您说该程序可以完美运行,但是不执行私人消息传递部分。
如果我查看您的代码,在while
循环中,您总是从clientList
(i = 0
)中获取第一个用户名,并且仅在行开始时才调用broadcastp
那个名字。
首先..是否曾经调用过broadcastp
?在broadcastp
中,您有另一个循环,但是给定调用方式,它总是会与i == 0
匹配(使用while
循环中的行和用户名)。
问题似乎在那里。因此,在while循环中,类似这样的事情可能对您有用(删除i
变量,不需要broadcastp
):
boolean isPrivate = false;
String line = client.read();
for (User user : clientList) {
if (line.startsWith("@" + user.getUsername())) {
user.write(line);
isPrivate = true;
break;
}
}
if (!isPrivate) {
broadcast(line);
}