如何在整个项目中访问单个数组 java

how to access a single array throughout the project java

我正在制作一个由中央服务器(如 DNS)控制的多个服务器和客户端的程序,该程序的操作是:

  1. 中央服务器启动名为Servidor_Borda

  2. 另一台服务器在 Servidor_Borda 中连接,您的 IP 保存在数组列表中。

  3. 当客户端想要连接时,他需要去 Servidor_Borda 并接收一个有效的 IP 来连接。

我的问题是当客户端请求 IP 连接时 ArrayList 总是空的,我不能做一个唯一的数组。

public class Servidor_Borda {

public static void main(String args[]) throws IOException{
    int porta = 4004;
    try{
        ServerSocket serverSocket = new ServerSocket(porta);
        Socket socketConexao;
        System.out.print("Aguardando conexões...\n");
    while(true){
        socketConexao = serverSocket.accept();
        String ip = socketConexao.getInetAddress().getHostAddress();            
        listaAtivos.getInstance().addServidor(ip);
        TrataConexao trataC = new TrataConexao(socketConexao);
        new Thread(trataC).start();
    }    
    }catch(Exception e){
        System.out.print("Porta em uso!");
    }      
}
}


public class listaAtivos {

private static listaAtivos singleton = null;
private ArrayList<String> servidoresConectados;

private listaAtivos(){
    servidoresConectados = new ArrayList<>();
}

public static listaAtivos getInstance(){
    if(singleton==null){
        singleton = new listaAtivos();
    }
    return singleton;
}

public void addServidor(String ip){
    servidoresConectados.add(ip);
    exibeAtivos();
}

public String escolheServidor(){
    int tam = servidoresConectados.size();
    if(tam != 0){
        for(int i=0;i<tam;i++){
            String ip = servidoresConectados.get(i);
            return ip;
        }
    }
    return null;
}
}


public class Cliente {

    public static void main(String args[]){
        int porta = 4008;        
        String ip = listaAtivos.getInstance().escolheServidor();
        Socket s = new Socket(ip,porta);
    }  

}

您的服务器 运行 在 4004 端口上,但您正在尝试从 4008 中的客户端访问连接。因此连接永远不会完成,因此 serverSocket.accept() 被阻止并等待永远处于阻塞状态。请在下面找到 link 了解详细信息。

http://download.java.net/jdk7/archive/b123/docs/api/java/net/ServerSocket.html#accept%28%29

但是由于您是 运行 来自另一个控制台的客户端程序,因此无法实现确切的行为,并且它不会影响服务器创建的单例。它将始终使用 null 创建 listaAtivos 的新实例。