2

我想知道是否有办法知道在任何时间点都连接到服务器的客户端。我正在使用套接字/Java。即如果服务器正在侦听的客户端有“n”个,那么是否可以跟踪连接的客户端?显然, isConnected() 和 isClosed() 方法没有为我提供我正在寻找的解决方案。请帮忙

4

3 回答 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 回答