我想知道是否有办法知道在任何时间点都连接到服务器的客户端。我正在使用套接字/Java。即如果服务器正在侦听的客户端有“n”个,那么是否可以跟踪连接的客户端?显然, isConnected() 和 isClosed() 方法没有为我提供我正在寻找的解决方案。请帮忙
问问题
2830 次
3 回答
1
我会这样做
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));
}
}
}
于 2013-05-14T04:31:14.323 回答
0
1)如果您正在创建多客户端-服务器程序,则考虑将其作为多线程客户端-服务器程序。
2)为每个新客户创建新的。 Thread
这种独特的 Thread
创作将帮助您跟踪所有活动的客户端线程。
3)您可以检查client threads
已创建的状态,如下所示:
来源>> http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.State.html
Thread.getState()
将返回以下Thread.State
可能状态之一:
NEW:尚未启动的线程处于此状态。
RUNNABLE:在 Java 虚拟机中执行的线程处于此状态。
BLOCKED:被阻塞等待监视器锁的线程处于此状态。
WAITING:无限期等待另一个线程执行特定操作的线程处于此状态。
TIMED_WAITING:一个线程正在等待另一个线程执行一个动作直到指定的等待时间,就处于这种状态。
TERMINATED:已退出的线程处于此状态。
于 2013-05-14T04:31:09.133 回答
0
你的意思是连接到服务器还是连接到你的应用程序?在 Unix/Windows 下使用“netstat -a”查看所有活动连接和所有监听端口。如果你想在你的应用程序级别使用一个列表或计数器,当套接字关闭时,它会在每次接受和减少时递增。
于 2013-05-14T13:56:09.563 回答