Реализована функции отправки пакетов клиенту
This commit is contained in:
9
src/main/java/io/orprotocol/ProtocolException.java
Normal file
9
src/main/java/io/orprotocol/ProtocolException.java
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package io.orprotocol;
|
||||||
|
|
||||||
|
public class ProtocolException extends Exception {
|
||||||
|
|
||||||
|
public ProtocolException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -48,6 +48,14 @@ public class Server extends WebSocketServer {
|
|||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Конструктор сервера с объектом прикрепления и слушателем событий сервера
|
||||||
|
* @param settings базовые настройки серверера
|
||||||
|
* @param packetManager менеджер пакетов (обработчиков и зарегистрированных пакетов)
|
||||||
|
* @param context вложение которое будет передаваться всем серрверным обработчикам пакетов,
|
||||||
|
* @param listener слушатель событий сервера
|
||||||
|
* может быть использовано для передачи контекста приложения
|
||||||
|
*/
|
||||||
public Server(Settings settings, PacketManager packetManager, Context context, ServerListener listener) {
|
public Server(Settings settings, PacketManager packetManager, Context context, ServerListener listener) {
|
||||||
super(new InetSocketAddress(settings.port));
|
super(new InetSocketAddress(settings.port));
|
||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
@@ -114,8 +122,8 @@ public class Server extends WebSocketServer {
|
|||||||
client.disconnect(ServerFailures.UNSUPPORTED_PACKET);
|
client.disconnect(ServerFailures.UNSUPPORTED_PACKET);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Class<? extends Packet> packetClass = this.packetManager.getPacketClass(packetId);
|
|
||||||
|
|
||||||
|
Class<? extends Packet> packetClass = this.packetManager.getPacketClass(packetId);
|
||||||
try {
|
try {
|
||||||
Packet packet = packetClass.getConstructor().newInstance();
|
Packet packet = packetClass.getConstructor().newInstance();
|
||||||
packet.packetId = packetId;
|
packet.packetId = packetId;
|
||||||
@@ -150,7 +158,7 @@ public class Server extends WebSocketServer {
|
|||||||
* Передаем интервал heartbeat из настроек сервера.
|
* Передаем интервал heartbeat из настроек сервера.
|
||||||
* Если клиент не отправляет heartbeat в указанный интервал, его можно отключить.
|
* Если клиент не отправляет heartbeat в указанный интервал, его можно отключить.
|
||||||
*/
|
*/
|
||||||
Client client = new Client(socket, this.settings.heartbeatInterval);
|
Client client = new Client(socket, this.settings.heartbeatInterval, this.packetManager);
|
||||||
socket.setAttachment(client);
|
socket.setAttachment(client);
|
||||||
if(this.listener == null){
|
if(this.listener == null){
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -6,7 +6,11 @@ import java.util.Set;
|
|||||||
import org.java_websocket.WebSocket;
|
import org.java_websocket.WebSocket;
|
||||||
|
|
||||||
import io.orprotocol.BaseFailures;
|
import io.orprotocol.BaseFailures;
|
||||||
|
import io.orprotocol.ProtocolException;
|
||||||
import io.orprotocol.ServerFailures;
|
import io.orprotocol.ServerFailures;
|
||||||
|
import io.orprotocol.Stream;
|
||||||
|
import io.orprotocol.packet.Packet;
|
||||||
|
import io.orprotocol.packet.PacketManager;
|
||||||
import io.orprotocol.util.StringUtil;
|
import io.orprotocol.util.StringUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -29,18 +33,21 @@ public class Client {
|
|||||||
*/
|
*/
|
||||||
private volatile long lastHeartbeatTime;
|
private volatile long lastHeartbeatTime;
|
||||||
|
|
||||||
|
private PacketManager packetManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Создает нового клиента с указанным сокетом.
|
* Создает нового клиента с указанным сокетом.
|
||||||
* Этот метод используется внутри протокола для управления подключениями клиентов.
|
* Этот метод используется внутри протокола для управления подключениями клиентов.
|
||||||
* @param socket Веб-сокет клиента.
|
* @param socket Веб-сокет клиента.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public Client(WebSocket socket, long heartbeatInterval) {
|
public Client(WebSocket socket, long heartbeatInterval, PacketManager packetManager) {
|
||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
this.clientId = StringUtil.randomString(32);
|
this.clientId = StringUtil.randomString(32);
|
||||||
this.eciTags = new HashSet<ECITag>();
|
this.eciTags = new HashSet<ECITag>();
|
||||||
this.heartbeatInterval = heartbeatInterval;
|
this.heartbeatInterval = heartbeatInterval;
|
||||||
this.lastHeartbeatTime = System.currentTimeMillis();
|
this.lastHeartbeatTime = System.currentTimeMillis();
|
||||||
|
this.packetManager = new PacketManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -160,4 +167,21 @@ public class Client {
|
|||||||
this.disconnect(ServerFailures.UNKNOWN_FAILURE);
|
this.disconnect(ServerFailures.UNKNOWN_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Отправляет пакет клиенту.
|
||||||
|
* @param packet Пакет для отправки.
|
||||||
|
*/
|
||||||
|
public void send(Packet packet) throws ProtocolException {
|
||||||
|
Integer packetId = this.packetManager.getPacketIdByClass(packet.getClass());
|
||||||
|
if(packetId == null) {
|
||||||
|
throw new ProtocolException("Unknown packet class: " + packet.getClass().getName());
|
||||||
|
}
|
||||||
|
packet.packetId = packetId;
|
||||||
|
/**
|
||||||
|
* Записываем пакет в поток и отправляем его через сокет.
|
||||||
|
*/
|
||||||
|
Stream stream = packet.write();
|
||||||
|
this.socket.send(stream.getBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,10 +10,6 @@ public abstract class Packet {
|
|||||||
public int packetId;
|
public int packetId;
|
||||||
public PacketManager packetManager;
|
public PacketManager packetManager;
|
||||||
|
|
||||||
public Packet() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Записывает данные пакета в поток. Исползуется при отправке
|
* Записывает данные пакета в поток. Исползуется при отправке
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package io.orprotocol.packet;
|
package io.orprotocol.packet;
|
||||||
|
|
||||||
import io.orprotocol.Context;
|
import io.orprotocol.Context;
|
||||||
|
import io.orprotocol.ProtocolException;
|
||||||
import io.orprotocol.Settings;
|
import io.orprotocol.Settings;
|
||||||
import io.orprotocol.client.Client;
|
import io.orprotocol.client.Client;
|
||||||
|
|
||||||
@@ -32,5 +33,5 @@ public abstract class PacketExecutor {
|
|||||||
* @param packet Пакет, полученный от клиента.
|
* @param packet Пакет, полученный от клиента.
|
||||||
* @param client Клиент, отправивший пакет.
|
* @param client Клиент, отправивший пакет.
|
||||||
*/
|
*/
|
||||||
public abstract void onPacketReceived(Packet packet, Client client);
|
public abstract void onPacketReceived(Packet packet, Client client) throws Exception, ProtocolException;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,10 +42,19 @@ public class PacketManager {
|
|||||||
return this.packets.containsKey(packetId);
|
return this.packets.containsKey(packetId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает зарегистрированные исполнители пакетов.
|
||||||
|
* @return Хэш-карта зарегистрированных исполнителей пакетов.
|
||||||
|
*/
|
||||||
public HashMap<Integer, Class<? extends PacketExecutor>> getExecutors() {
|
public HashMap<Integer, Class<? extends PacketExecutor>> getExecutors() {
|
||||||
return this.executors;
|
return this.executors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Получает пакет ID по экземпляру класса
|
||||||
|
* @param packetClass Класс пакета
|
||||||
|
* @return ID пакета
|
||||||
|
*/
|
||||||
public Integer getPacketIdByClass(Class<? extends Packet> packetClass) {
|
public Integer getPacketIdByClass(Class<? extends Packet> packetClass) {
|
||||||
for (var entry : this.packets.entrySet()) {
|
for (var entry : this.packets.entrySet()) {
|
||||||
if (entry.getValue().equals(packetClass)) {
|
if (entry.getValue().equals(packetClass)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user