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

时间:2013-05-14 04:19:38

标签: java sockets

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

3 个答案:

答案 0 :(得分: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));
        }
    }
}

答案 1 :(得分:0)

1)如果您要创建多客户端 - 服务器程序,请考虑将其作为多线程客户端 - 服务器程序。

2)为每个新客户创建 Thread。此唯一 Thread创建将帮助您跟踪所有活动客户端线程

3)您可以查看已创建的client threads的状态,如下所示:

来源&gt;&gt; http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.State.html

Thread.getState()将返回以下Thread.State种可能状态中的一种:

新:尚未启动的线程处于此状态。

RUNNABLE:在Java虚拟机中执行的线程处于此状态。

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

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

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

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

答案 2 :(得分:0)

您的意思是连接到服务器还是连接到您的应用程序? 在Unix / Windows下使用“netstat -a”查看所有活动连接和所有侦听端口。 如果你想在你的应用程序级别,然后使用一个列表或计数器,当套接字关闭时,每个接受和减少递增。