Добрый вечер. Первым делом извините за моего нуба 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.
}
}