无法使私人广播方法起作用

时间:2018-07-14 20:52:16

标签: java mysql sockets server tcp-ip

我在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()

1 个答案:

答案 0 :(得分:0)

我不了解您的程序如何运行的全貌,但是您说该程序可以完美运行,但是不执行私人消息传递部分。

如果我查看您的代码,在while循环中,您总是从clientListi = 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);
}