简单的方法是每个客户端连接使用两个线程。一个线程处理从客户端读取消息,另一个用于发送消息,从而可以同时发送/接收来自客户端的消息。
为了避免在循环客户端连接以广播消息时进行网络调用,服务器线程应将消息添加到队列中以发送给客户端。java.util.concurrent 中的 LinkedBlockingQueue 非常适合这一点。下面是一个例子:
/**
* Handles outgoing communication with client
*/
public class ClientConnection extends Thread {
private Queue<String> outgoingMessages = new LinkedBlockingQueue<String>(MAX_OUTGOING);
// ...
public void queueOutgoing(String message) {
if (!outgoingMessages.offer(message)) {
// Kick slow clients
kick();
}
}
public void run() {
// ...
while (isConnected) {
List<String> messages = new LinkedList<String>();
outgoingMessages.drainTo(messages);
for (String message : messages) {
send(message);
}
// ...
}
}
}
public class Server {
// ...
public void broadcast(String message) {
for (ClientConnection client : clients) {
client.queueOutgoing(message);
}
}
}