Ограничить количество клиентов, которые могут подключиться к серверу одновременно - Java - PullRequest
0 голосов
/ 29 марта 2020

Добрый вечер. Первым делом извините за моего нуба Engli sh. Мне нужно сделать для моего сервера проекта shool с ограниченным подключением в то же время. Для каждого успешного соединения мне нужно создать Thread и добавить его в какую-то коллекцию, скажем, ArrayList, а затем количество активных потоков увеличивается. Когда поток завершил свою работу, число активных потоков уменьшалось, и поток удалялся из коллекции. Когда мы получаем новый запрос и число maxClients было равно max, то мы отправляем клиенту сообщение об ошибке. Мне не разрешено использовать Timer, TimerTask и другие выполняемые классы для этой задачи. Любая помощь, советы и рекомендации приветствуются.

Это код потенциальных ограничений подключения, но он не работает ПРАВИЛЬНО.

public class Server {
       static int activeUsers = 0; 
      public static void main(String[] args){
          Server server = new Server();
          server.ServerWork();

      }
      public void ServerWork(){
      ArrayList<ClientThread> list;
      ServerSocket serverSocket;
      Socket socket;
       ClientThread client;
          list= new ArrayList<ClientThread>();
             serverSocket = new ServerSocket(9001, 50);//// backlog must be higher than activeUsers
      while (true) {
           socket = serverSocket.accept();
            activeUsers ++;
            if (client < 5){ ////5-value for maxUsers
                Thread thread = new ClientThread(socket);
                list.add((ClientThread) dretva);

                if (list.size() > 0) {

                    Iterator<ClientThread> iterator = list.iterator();
                    for (iterator = list.iterator(); iterator.hasNext();) {
                        ClientThread d = iterator.next();
                        d.start();
                        if (!d.isAlive() || d.isInterrupted() || d.getState() == Thread.State.TERMINATED) {
                            activeUsers--;
                            iterator.remove();
                        }

                    }

                }
            }
    ///if the list was full send user error message
  else {
                try {
                    OutputStream outputStream = socket.getOutputStream();
                    outputStream.write("ERROR 01;".getBytes());
                    outputStream.flush();
                    socket.shutdownOutput();
                    socket.close();
                } catch (IOException ex) {
                   ////some text here
                }
            }


      }
 }}

///class for client requests
class ClientThread extends Thread{
private Socket socket;
public ClientSocket(Socket socket) {
    this.socket = socket;
}
@Override
public void run() {


    try {
        InputStreamReader inputStream = new InputStreamReader(socket.getInputStream(), "UTF-8");
        OutputStream outputStream = socket.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(outputStream, "UTF-8");
        StringBuilder sb = new StringBuilder();
        while (true) {
            int i = inputStream.read();
            if (i == -1) {
                break;
            }
            sb.append((char) i);
        }
        osw.write("Hi from server");
        osw.flush();
        socket.shutdownOutput();
        socket.shutdownInput();
        socket.close();

    } catch (SocketException exception) {
    } catch (IOException ex) {

    } catch (InterruptedException ex) {

    }

}

@Override
public synchronized void start() {
    super.start(); //To change body of generated methods, choose Tools | Templates.
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...