我有一个使用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()
在服务器端重新创建该包时,它就消失了。
此外,据我所知,Netty的ByteBuf不能读取或编写自己的类。
我唯一的想法是发送多个包,我能避免这种情况吗?
编辑
我使用的数据包系统的定义。
由于没有很好地解释数据包系统,我将简要说明它的作用:
在我的例子中,有一个包包装了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
。
同样的情况也会发生在解码过程中,反之亦然。
我希望事情变得清晰起来。
https://stackoverflow.com/questions/56304773
复制相似问题