Сообщения, доставка сообщений, фикс хэндшейков, буферная зона (для синхронмзации)

This commit is contained in:
RoyceDa
2026-02-08 18:40:03 +02:00
parent 7766afa984
commit c036275ed9
23 changed files with 1025 additions and 56 deletions

View File

@@ -0,0 +1,52 @@
package io.orprotocol.packet;
import io.orprotocol.ProtocolException;
import io.orprotocol.Stream;
/**
* Фабрика для создания пакетов из байтового массива. Используется для создания пакетов при получении данных от клиента,
* а так же может быть использована приложением
*/
public class PacketFactory {
private byte[] bytes;
private PacketManager packetManager;
/**
* Создать фабрику для создания пакетов из байтового массива
* @param bytes байтовый массив для создания пакета
* @param packetManager менеджер пакетов для получения класса пакета по его id
*/
public PacketFactory(byte[] bytes, PacketManager packetManager) {
this.bytes = bytes;
this.packetManager = packetManager;
}
/**
* Создает пакет из массива байт, сериализует и возвращает его. Если пакет с таким id не поддерживается, выбрасывает ProtocolException
* @return созданный пакет
* @throws ProtocolException
*/
public Packet createPacket() throws ProtocolException {
Stream stream = new Stream(this.bytes);
int packetId = stream.readInt16();
if(!this.packetManager.hasPacketSupported(packetId)){
throw new ProtocolException("Unsupported packet with id " + packetId);
}
Class<? extends Packet> packetClass = this.packetManager.getPacketClass(packetId);
try {
Packet packet = packetClass.getConstructor().newInstance();
packet.packetId = packetId;
packet.read(stream);
return packet;
} catch (Exception e) {
throw new ProtocolException("Failed to create packet with id " + packetId);
}
}
public int getPacketId() {
Stream stream = new Stream(this.bytes);
return stream.readInt16();
}
}

View File

@@ -2,6 +2,8 @@ package io.orprotocol.packet;
import java.util.HashMap;
import io.orprotocol.ProtocolException;
/**
* Менеджер сетевых пакетов и их обработчиков.
*/
@@ -96,5 +98,24 @@ public class PacketManager {
return this.packets.size();
}
/**
* Создает пакет из массива байт, сериализует и возвращает его. Если пакет с таким id не поддерживается, выбрасывает ProtocolException
* @param bytes байтовый массив для создания пакета
* @return созданный пакет
* @throws ProtocolException если пакет с таким id не поддерживается или произошла ошибка при создании пакета
*/
public Packet createPacket(byte[] bytes) throws ProtocolException {
PacketFactory packetFactory = new PacketFactory(bytes, this);
return packetFactory.createPacket();
}
/**
* Создает фабрику для создания пакетов из байтового массива
* @param bytes байтовый массив для создания пакета
* @return фабрика для создания пакетов из байтового массива
*/
public PacketFactory getPacketFactory(byte[] bytes) {
return new PacketFactory(bytes, this);
}
}