如何跟踪多客户端服务器应用程序中的活动客户端?

3

我想知道是否有一种方法可以在任何时间点知道连接到服务器的所有客户端。我正在使用Sockets/Java。 例如,如果有“n”个客户端正在听取服务器,则是否可能跟踪已连接的客户端??显然,isConnected()和isClosed()方法不能提供我正在寻找的解决方案。请帮忙。

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));
        }
    }
}

0

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虚拟机中执行的线程处于此状态。

阻塞:等待监视器锁定的线程处于此状态。

等待:无限期地等待另一个线程执行特定操作的线程处于此状态。

计时等待:等待另一个线程执行操作,最多等待指定的等待时间的线程处于此状态。

终止:已退出的线程处于此状态。


0
你是指连接到服务器还是连接到你的应用程序? 在Unix/Windows下使用“netstat -a”查看所有活动连接和所有侦听端口。 如果你想在应用程序层面上实现,那么可以使用一个列表或计数器,在每次接受连接时递增并在套接字关闭时递减。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接