Can';t正确跟踪已连接的java客户端

Can';t正确跟踪已连接的java客户端,java,multithreading,server,Java,Multithreading,Server,我似乎不知道如何通知我的服务器类连接丢失。我的服务器代码是: public class Server { static int port = 4444; static boolean listening = true; static ArrayList<Thread>Clients = new ArrayList<Thread>(); static MatchMaker arena; public static void mai

我似乎不知道如何通知我的服务器类连接丢失。我的服务器代码是:

public class Server {

    static int port = 4444;
    static boolean listening = true;
    static ArrayList<Thread>Clients = new ArrayList<Thread>();
    static MatchMaker arena;

    public static void main(String[] args) {
        Initialize();
        Thread startConnections = new Thread(run());
        startConnections.start();
    }

    private static Runnable run(){
        System.out.println("(" +  new SimpleDateFormat("HH:mm:ss").format(new Date()) + ") Started listening on port: " + port);
        try(ServerSocket socket = new ServerSocket(port)){
            while(listening){
                if(Clients.size() <= 4){
                    Socket clientSocket = socket.accept();

                    MultiThread connection = new MultiThread(clientSocket, arena, );
                    Clients.add(connection);

                    System.out.println("Client connected from " + clientSocket.getRemoteSocketAddress() + " Assigned ID: " + connection.getId());
                    System.out.println("Currently connected clients(" + Clients.size() + "): ");
                    for(int i = 0; i < Clients.size(); i++)
                        System.out.println("   - " + Clients.get(i).getId());
                    connection.start();
                }
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

    private static void Initialize(){
        arena = new MatchMaker();
    }

}
公共类服务器{
静态int端口=4444;
静态布尔监听=真;
静态ArrayList客户端=新建ArrayList();
静态媒人竞技场;
公共静态void main(字符串[]args){
初始化();
线程开始连接=新线程(run());
startConnections.start();
}
私有静态可运行运行运行(){
System.out.println(“(“+新SimpleDataFormat(“HH:mm:ss”).format(new Date())+”)开始侦听端口:“+端口”;
try(ServerSocket=newserversocket(端口)){
边听{

如果(Clients.size()您可以将它们保持在同步映射中,如:

Map<Integer, ClientObject> connectedClients = new HashMap<Integer, ClientObject>(); //key integer will be the client id 
Map connectedClients=new HashMap();//键整数将是客户端id
其他建议:

Map<String, ClientObject> connectedClients = new HashMap<String, ClientObject>(); //key String will be the client IP&userName (you decide)
Map connectedClients=new HashMap();//键字符串将是客户端IP和用户名(由您决定)

首先使用线程安全集合来监视客户端连接,因此请替换以下内容 ArrayList Clients=新的ArrayList(); 具有 ConcurrentLinkedQueue客户端=新的ConcurrentLinkedQueue(); 但你们的问题是,你们正试图以线程安全的方式使用有限的资源,所以最好的选择是使用信号量。我已经对你们的类进行了一些重新分析,给出了一个想法。希望它能有所帮助。请仔细查看“服务器\ U实例”

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Semaphore;

public class Server {
    private final int MAX_AVAILABLE = 4;
    public final Semaphore SERVER_INSTANCE = new Semaphore(MAX_AVAILABLE, true);

    static int port = 4444;
    static volatile boolean listening = true;
    static MatchMaker arena;

    public static void main(String[] args) {
        Initialize();
        Thread startConnections = new Thread(run());
        startConnections.start();
    }

    private static void Initialize() {
        //do somthing
    }

    private static Runnable run(){
        System.out.println("(" +  new SimpleDateFormat("HH:mm:ss").format(new Date()) + ") Started listening on port: " + port);
        ServerSocket socket = null;
        while(listening){
           try {
                socket = new ServerSocket(port);
               try {
                   SERVER_INSTANCE.acquire();
                       Socket clientSocket = socket.accept();
                       MultiThread connection = new MultiThread(clientSocket, arena, SERVER_INSTANCE);

               } catch (InterruptedException e) {
                    e.printStackTrace();          
               }
           } catch (IOException e1) {
                e1.printStackTrace();
            }

        }
        return null;
    }

    static class MultiThread implements Runnable{
        Semaphore serverInstance ;
        public MultiThread(Socket clientSocket, MatchMaker arena, Semaphore serverInstance) {
            serverInstance = serverInstance;
        }

        @Override
        public void run() {
            try {
                serverInstance.acquire();
                //Do your work here
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                serverInstance.release();
            }
        }
    }

        class MatchMaker {

        }
}

我应该如何访问另一个类中的映射?您可以创建一个单例来帮助您插入/从中获取数据。该单例将实际管理您获得的所有连接的客户端。顺便说一句,在
main
中,您的代码根本没有启动新线程,并且已中断。您可以调用
run()
而不是此代码。
服务器中没有处理断开连接通知的代码。