Высокопроизводительная индексация клиентов внутри протокола

This commit is contained in:
RoyceDa
2026-02-04 06:01:12 +02:00
parent 6a5c01bf25
commit cd1e6e6b14
5 changed files with 301 additions and 16 deletions

View File

@@ -13,6 +13,7 @@ import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import io.orprotocol.client.Client;
import io.orprotocol.index.ClientIndexer;
import io.orprotocol.lock.ThreadLocker;
import io.orprotocol.packet.Packet;
import io.orprotocol.packet.PacketExecutor;
@@ -25,6 +26,7 @@ public class Server extends WebSocketServer {
private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private ServerListener listener;
private ThreadLocker threadLocker = new ThreadLocker();
private ClientIndexer clientIndexer = new ClientIndexer();
/**
* Конструктор сервера
@@ -52,11 +54,16 @@ public class Server extends WebSocketServer {
}
@Override
public void onClose(WebSocket socket, int arg1, String arg2, boolean arg3) {
public void onClose(WebSocket socket, int reasonCode, String arg2, boolean arg3) {
if(this.listener == null){
return;
}
this.listener.onClientDisconnect(this, socket.getAttachment());
Client client = socket.getAttachment();
this.listener.onClientDisconnect(this, client);
/**
* Удаляем клиента из индексации (потому что он вышел)
*/
this.clientIndexer.removeClientFromIndex(client);
}
@Override
@@ -120,7 +127,12 @@ public class Server extends WebSocketServer {
packet.read(stream);
/**
* Получаем обработчик пакета и вызываем его метод обработки.
*
* @SuppressWarnings("rawtypes") используется потому что пакет это generic класс
* и ему нельзя без указания. Но так как тип нам точно известен просто
* убираем ошибку компилятора
*/
@SuppressWarnings("rawtypes")
PacketExecutor executor = this.packetManager.getExecutors().get(packetId);
executor.settings = this.settings;
if(listener != null && !listener.onPacketReceived(this, client, packet)) {
@@ -160,7 +172,7 @@ public class Server extends WebSocketServer {
* Передаем интервал heartbeat из настроек сервера.
* Если клиент не отправляет heartbeat в указанный интервал, его можно отключить.
*/
Client client = new Client(socket, this.settings.heartbeatInterval, this.packetManager);
Client client = new Client(socket, this.settings.heartbeatInterval, this);
socket.setAttachment(client);
if(this.listener == null){
return;
@@ -199,6 +211,22 @@ public class Server extends WebSocketServer {
return clients;
}
/**
* Получает менеджер пакетов сервера (где хранятся зарегистрированные пакеты и обработчики)
* @return PacketManager
*/
public PacketManager getPacketManager() {
return this.packetManager;
}
/**
* Получить индексатор сервера, нужен для быстрого поиска клиентов по индексам
* @return ClientIndexer
*/
public ClientIndexer getClientIndexer() {
return this.clientIndexer;
}
/**
* Планировщик для проверки активности клиентов.
* Если планировщик обнаруживает неактивного клиента, он отключает его с соответствующим кодом ошибки.