У меня простая клиент-серверная система с Netty
, и я отправляю данные с использованием пакетов.У Packet
в моем случае есть два метода записи и чтения из BytBuf
.Например, пакет, содержащий строки, получает байты из строки и записывает их в ByteBuf
, который затем отправляется, или читает байты из ByteBuf
и создает сообщение.Вот фрагмент кода из моего интерфейса пакета:
import io.netty.buffer.ByteBuf;
public abstract class Packet {
public abstract void read(ByteBuf byteBuf);
public abstract void write(ByteBuf byteBuf);
}
Сначала, когда пакет получен, я хочу проверить, есть ли прикрепленный пакет, а затем я хочу получить к нему доступ или прочитать его.
Проблема заключается в создании пакета при его получении.Я мог бы добавить второй пакет к другому и сохранить его в локальной переменной первого пакета, но он исчез, когда я использую Class.newInstance()
для воссоздания пакета на стороне сервера.
Кроме того, ByteBuf от Netty не может читать или писать собственные классы, насколько я знаю ...
Моя единственная идея - отправлять несколько пакетов, могу ли я этого избежать?
РЕДАКТИРОВАТЬ
Определение системы пакетной обработки, которую я использую.
Из-за плохо объясненной системы пакетной передачи я кратко расскажу, что этоделает:
Пакет в моем случае оборачивается вокруг ByteBuf
.В Netty
единственный способ отправить данные - это записать их в ByteBuf
в виде байтов.Примером пакета на основе строки будет:
package com.sxf.protocol.chat.util.packets;
import io.netty.buffer.ByteBuf;
public class MessagePacket extends Packet {
private String msg;
public MessagePacket() {}
public MessagePacket(String message) {
this.msg = message;
}
@Override
public void read(ByteBuf byteBuf) {
byte[] msgBytes = new byte[byteBuf.readInt()];
byteBuf.readBytes(msgBytes);
msg = new String(msgBytes);
}
@Override
public void write(ByteBuf byteBuf) {
byte[] msgBytes = msg.getBytes();
byteBuf.writeInt(msgBytes.length);
byteBuf.writeBytes(msgBytes);
}
public String getMsg() {
return msg;
}
}
Когда вы создаете Packet
, вам нужно добавить сообщение в виде String
.В процессе кодирования я вызываю write()
и передаю ByteBuf
, который отправляется по конвейеру.Затем сообщение формируется в байты и записывается в ByteBuf
.
То же самое происходит при декодировании, просто наоборот.
Надеюсь, это станет ясно.