Java 我应该向构造函数发送什么类型的数组?

Java 我应该向构造函数发送什么类型的数组?,java,arrays,sockets,client-server,chat,Java,Arrays,Sockets,Client Server,Chat,我正在创建一个服务器聊天客户端应用程序,并借用了代码。除了一个,我知道大多数事情是如何运作的 在我的类服务器中我等待套接字被接受 public static ArrayList<String> clientUsernameList = new ArrayList<>(); /** * @param args the command line arguments * @throws java.io.IOException */ public static void

我正在创建一个服务器聊天客户端应用程序,并借用了代码。除了一个,我知道大多数事情是如何运作的

在我的
类服务器中
我等待套接字被接受

public static ArrayList<String> clientUsernameList = new ArrayList<>();

/**
 * @param args the command line arguments
 * @throws java.io.IOException
 */
public static void main(String[] args) throws IOException {

    int port = 8900;    //Port number the ServerSocket is going to use
    ServerSocket myServerSocket = null;  //Serversocket for sockets to connect
    Socket clientSocket = null;    //Listerner for accepted clients
    ClientThread[] clientsConnected = new ClientThread[20]; //Max clients in this server

    try {
        myServerSocket = new ServerSocket(port);
        System.out.println("Server waiting for clients on port:" + port);
    } catch (IOException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    }

    while (true) {            
        try {   //Freezes while-loop untill a socket have been accepted or if some failure occur
            clientSocket = myServerSocket.accept();                
            System.out.println("Client have connected from:" + clientSocket.getLocalAddress().getHostName());                
        } catch (Exception e) {
            //Print out exception
            System.out.println(e);
        }
        //For-loop that counts every element in Array-clientsConnected
        for (int i = 0; i < clientsConnected.length; i++) {
            //If-statement checks if current element is null 
            if(clientsConnected[i] == null){
                //If current element in the Array is null then create a new object from ClientThread class
                //With a socket and the object of itself as parameter.
                (clientsConnected[i] = new ClientThread(clientSocket, clientsConnected)).start();

                //Must have a break otherwise it will create 20 objects (Exit for-loop)
                break;
            }   //Exit if-statement
        }   //Exit for-loop
    }   //Exit while-loop

}
//还有一些代码

这就是我迷路的地方。我是否发送了整个阵列?如果我这样做了,user1不应该只得到一个有1个用户的数组吗?当user2连接时,他不应该得到一个有2个用户的数组吗?我迷路了。如果有人能给我指出一些可以解释这一点的东西,我将不胜感激

  • 您的代码将只处理20个请求。对于每一个,它都会向clientsContected添加新的值,一旦整个表都满了,它将返回到循环的开始(不关闭已接受的连接)

  • 可能将连接的clients传递给线程的想法是,它可以在停止工作时将值设置为null(以便循环中的主代码可以为其分配新的客户端)。猜测,因为不包括任何代码)。但是对于这一点,数组中的索引将非常有用(因此3个参数而不是2个),这样ClientThread就不必搜索整个数组来找到与此匹配的对象

  • 我建议您使用BlockingQueue(容量有限,例如5),您将向其传递接受的连接。一旦它满了,你的main将被迫等待它,直到它有相同的空间插入新的连接,所以你将停止接受新的套接字。创建20个线程,在有限循环中尝试从该队列获取套接字并为其提供服务。一旦完成,他们返回等待新的请求

    所以,是的,你通过了整个阵列

  • 但它并不能解决当所有线程都很忙时会发生什么的问题,因为您一直在接受新的客户端,而不是等待空闲线程
  • public class ClientThread extends Thread {
    
    private ClientThread[] clientsConnected;
    private Socket SOCKET = null;
    private DataInputStream IN = null;
    private DataOutputStream OUT = null;
    private String userName,zone;
    //-------------------------------------------------------    
    //Constructor
    public ClientThread(Socket socket, ClientThread[] clientThread) {
        this.SOCKET = socket;
        this.clientsConnected = clientThread;
    }