我想知道是否有一种方法可以在任何时间点知道连接到服务器的所有客户端。我正在使用Sockets/Java。 例如,如果有“n”个客户端正在听取服务器,则是否可能跟踪已连接的客户端??显然,isConnected()和isClosed()方法不能提供我正在寻找的解决方案。请帮忙。
public class Test1 {
static Collection<Socket> activeSockets = new ConcurrentLinkedQueue<>();
static class Task implements Runnable {
Socket sk;
Task(Socket sk) {
this.sk = sk;
}
public void run() {
activeSockets.add(sk);
try {
...
} finally {
activeSockets.remove(sk);
}
}
}
public static void main(String[] args) throws Exception {
ExecutorService ex = Executors.newCachedThreadPool();
ServerSocket server = new ServerSocket(5555);
for (;;) {
Socket sk = server.accept();
ex.execute(new Task(sk));
}
}
}
1) 如果您正在创建多客户端服务器程序,则考虑将其作为多线程客户端-服务器程序。
2) 为每个新客户端创建一个新的Thread
。这种独特的Thread
创建将帮助您跟踪所有活动客户端线程。
3) 您可以检查已创建的客户端线程的状态,如下所示:
源代码 >> http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.State.html
Thread.getState()
将返回以下Thread.State
可能的状态之一:
NEW:处于此状态的是尚未启动的线程。
RUNNABLE:在Java虚拟机中执行的线程处于此状态。
阻塞:等待监视器锁定的线程处于此状态。
等待:无限期地等待另一个线程执行特定操作的线程处于此状态。
计时等待:等待另一个线程执行操作,最多等待指定的等待时间的线程处于此状态。
终止:已退出的线程处于此状态。