Система событий
This commit is contained in:
3
src/main/java/io/orprotocol/Context.java
Normal file
3
src/main/java/io/orprotocol/Context.java
Normal file
@@ -0,0 +1,3 @@
|
||||
package io.orprotocol;
|
||||
|
||||
public class Context extends Object {}
|
||||
@@ -20,23 +20,56 @@ public class Server extends WebSocketServer {
|
||||
private PacketManager packetManager;
|
||||
private Settings settings;
|
||||
private ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
|
||||
private Object attachment;
|
||||
private Context context;
|
||||
private ServerListener listener;
|
||||
|
||||
public Server(Settings settings, PacketManager packetManager, Object attachment) {
|
||||
/**
|
||||
* Конструктор сервера
|
||||
* @param settings базовые настройки серверера
|
||||
* @param packetManager менеджер пакетов (обработчиков и зарегистрированных пакетов)
|
||||
*/
|
||||
public Server(Settings settings, PacketManager packetManager) {
|
||||
super(new InetSocketAddress(settings.port));
|
||||
this.settings = settings;
|
||||
this.packetManager = packetManager;
|
||||
this.attachment = attachment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Конструктор сервера с объектом прикрепления
|
||||
* @param settings базовые настройки серверера
|
||||
* @param packetManager менеджер пакетов (обработчиков и зарегистрированных пакетов)
|
||||
* @param context вложение которое будет передаваться всем серрверным обработчикам пакетов,
|
||||
* может быть использовано для передачи контекста приложения
|
||||
*/
|
||||
public Server(Settings settings, PacketManager packetManager, Context context) {
|
||||
super(new InetSocketAddress(settings.port));
|
||||
this.settings = settings;
|
||||
this.packetManager = packetManager;
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
public Server(Settings settings, PacketManager packetManager, Context context, ServerListener listener) {
|
||||
super(new InetSocketAddress(settings.port));
|
||||
this.settings = settings;
|
||||
this.packetManager = packetManager;
|
||||
this.context = context;
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose(WebSocket arg0, int arg1, String arg2, boolean arg3) {
|
||||
|
||||
public void onClose(WebSocket socket, int arg1, String arg2, boolean arg3) {
|
||||
if(this.listener == null){
|
||||
return;
|
||||
}
|
||||
this.listener.onClientDisconnect(this, socket.getAttachment());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(WebSocket arg0, Exception arg1) {
|
||||
|
||||
if(this.listener == null){
|
||||
return;
|
||||
}
|
||||
this.listener.onError(this, arg1);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -47,6 +80,12 @@ public class Server extends WebSocketServer {
|
||||
*/
|
||||
Client client = socket.getAttachment();
|
||||
client.updateHeartbeat();
|
||||
if(this.listener != null) {
|
||||
/**
|
||||
* Сообщение от клиента, но пакет не сформирован, передаем null
|
||||
*/
|
||||
this.listener.onPacketReceived(this, client, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -90,7 +129,13 @@ public class Server extends WebSocketServer {
|
||||
Class<? extends PacketExecutor> executorClass = this.packetManager.getExecutors().get(packetId);
|
||||
PacketExecutor executor = executorClass.getConstructor().newInstance();
|
||||
executor.settings = this.settings;
|
||||
executor.attachment = this.attachment;
|
||||
executor.context = this.context;
|
||||
if(listener != null && listener.onPacketReceived(this, client, packet)) {
|
||||
/**
|
||||
* Если слушатель сервера вернул true, пакет не обрабатываем.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
executor.onPacketReceived(packet, client);
|
||||
} catch (Exception e) {
|
||||
System.out.println("Error while processing packet " + packetClass.getName());
|
||||
@@ -107,6 +152,13 @@ public class Server extends WebSocketServer {
|
||||
*/
|
||||
Client client = new Client(socket, this.settings.heartbeatInterval);
|
||||
socket.setAttachment(client);
|
||||
if(this.listener == null){
|
||||
return;
|
||||
}
|
||||
if(this.listener.onClientConnect(this, client)) {
|
||||
client.disconnect(ServerFailures.SERVER_NOT_ACCEPT_CLIENT);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -118,6 +170,10 @@ public class Server extends WebSocketServer {
|
||||
|
||||
int port = this.getPort();
|
||||
System.out.println("\u001B[32mServer started at x.x.x.x:" + port + "\u001B[0m");
|
||||
if(this.listener == null){
|
||||
return;
|
||||
}
|
||||
this.listener.onServerStart(this);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -24,6 +24,11 @@ public enum ServerFailures implements BaseFailures {
|
||||
* Код ошибки, указывающий на тайм-аут бездействия.
|
||||
*/
|
||||
INACTIVITY_TIMEOUT(3004),
|
||||
/**
|
||||
* Сервер по какой-то причине не принимает подключение клиента
|
||||
* Выбрасывается в методе onClientConnect при отмене события например защитой
|
||||
*/
|
||||
SERVER_NOT_ACCEPT_CLIENT(3005),
|
||||
/**
|
||||
* Код ошибки, указывающий на неизвестный тип пакета.
|
||||
*/
|
||||
|
||||
45
src/main/java/io/orprotocol/ServerListener.java
Normal file
45
src/main/java/io/orprotocol/ServerListener.java
Normal file
@@ -0,0 +1,45 @@
|
||||
package io.orprotocol;
|
||||
|
||||
import io.orprotocol.client.Client;
|
||||
import io.orprotocol.packet.Packet;
|
||||
|
||||
public interface ServerListener {
|
||||
/**
|
||||
* Сервер запущен
|
||||
* @param server
|
||||
*/
|
||||
void onServerStart(Server server);
|
||||
/**
|
||||
* Сервер остановлен
|
||||
* @param server
|
||||
*/
|
||||
void onServerStop(Server server);
|
||||
/**
|
||||
* Клиент подключился
|
||||
* @param server
|
||||
* @param client
|
||||
* @return если возвращено true значит клиент не будет подключен к серверу выбросится
|
||||
* ошибка SERVER_NOT_ACCEPT_CLIENT
|
||||
*/
|
||||
boolean onClientConnect(Server server, Client client);
|
||||
/**
|
||||
* Клиент отключился
|
||||
* @param server
|
||||
* @param client
|
||||
*/
|
||||
void onClientDisconnect(Server server, Client client);
|
||||
/**
|
||||
* Произошла ошибка сервера
|
||||
* @param server
|
||||
* @param exception
|
||||
*/
|
||||
void onError(Server server, Exception exception);
|
||||
/**
|
||||
* Пакет получен от клиента
|
||||
* @param server
|
||||
* @param client
|
||||
* @param packet
|
||||
* @return если возвращено true значит пакет не будет обработан дальше
|
||||
*/
|
||||
boolean onPacketReceived(Server server, Client client, Packet packet);
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package io.orprotocol.packet;
|
||||
|
||||
import io.orprotocol.Context;
|
||||
import io.orprotocol.Settings;
|
||||
import io.orprotocol.client.Client;
|
||||
|
||||
@@ -8,7 +9,7 @@ import io.orprotocol.client.Client;
|
||||
*/
|
||||
public abstract class PacketExecutor {
|
||||
public Settings settings;
|
||||
public Object attachment;
|
||||
public Context context;
|
||||
|
||||
/**
|
||||
* Настройки сервера.
|
||||
@@ -19,11 +20,11 @@ public abstract class PacketExecutor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Вложенный обьект, который был передан при создании сервера.
|
||||
* @return вложенный обьект
|
||||
* Контекст приложения переданный при создании сервера.
|
||||
* @return контекст
|
||||
*/
|
||||
public Object getAttachment() {
|
||||
return attachment;
|
||||
public Context getContext() {
|
||||
return context;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user