Высокопроизводительная индексация клиентов внутри протокола
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Планировщик для проверки активности клиентов.
|
||||
* Если планировщик обнаруживает неактивного клиента, он отключает его с соответствующим кодом ошибки.
|
||||
|
||||
Reference in New Issue
Block a user