我将什么类型的数组发送给构造函数?

时间:2015-02-26 15:16:25

标签: java arrays sockets client-server chat

我正在创建一个服务器聊天客户端应用程序并借用了代码。我知道大多数事情除了一个以外都有效。

在我的Class Server中,我等待接受套接字。

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

}

}

因此,如果套接字被接受,我创建一个名为Class ClientThread

的线程类

要创建此类的对象,我需要一个套接字和一个数组。 这就是我的ClientThread类的样子

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

//Some more code

现在这就是我迷失的地方。我发送我的整个阵列吗?如果我这样做,user1只应该获得一个拥有1个用户的数组,而当user2连接时,他不应该得到一个包含2个用户的数组吗?我搞不清楚了。如果有人能指出我解释这一点的话,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

  1. 您的代码只会提供20个请求。对于每一个,它为clientsContected添加新值,一旦整个表已满,它将返回到循环的开始(不关闭接受的连接)。

  2. 将clientConnected传递给线程的想法可能是一旦它停止工作就可以将值设置为null(这样你的循环中的主代码就可以为它配置一个新的客户端)。 GUessin没有包含代码)。但是对于那个数组中的索引是有用的(所以3个参数而不是2个)因此ClientThread不必搜索整个数组来找到与之匹配的对象。

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

    所以是的,你传递了整个数组。

    1. 如果所有人都忙,那么它仍然无法解决发生的问题,因为你不断接受新客户而不是等待免费线程。