Сообщения, доставка сообщений, фикс хэндшейков, буферная зона (для синхронмзации)
This commit is contained in:
52
src/main/java/io/orprotocol/packet/PacketFactory.java
Normal file
52
src/main/java/io/orprotocol/packet/PacketFactory.java
Normal 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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user