首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中追加数据包?

如何在Java中追加数据包?
EN

Stack Overflow用户
提问于 2019-05-25 20:21:36
回答 2查看 291关注 0票数 1

我有一个使用Netty构建的简单客户机/服务器系统,并且我使用数据包发送数据。在我的例子中,Packet有两个方法来写入和读取BytBuf。例如,包含字符串的数据包从字符串中获取字节,并将其写入ByteBuf,然后发送,或者从ByteBuf读取字节并创建消息。下面是来自我的数据包接口的代码片段:

代码语言:javascript
复制
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。基于字符串的数据包的示例如下:

代码语言:javascript
复制
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

同样的情况也会发生在解码过程中,反之亦然。

我希望事情变得清晰起来。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56304773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档