首页 > 其他分享 >Netty-TCP 01.编解码

Netty-TCP 01.编解码

时间:2023-06-30 20:14:35浏览次数:40  
标签:Netty 01 TCP content byte out 数据包 size

本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【1】部分,主要介绍编解码实现。

定制协议

一般来说,开发TCP通讯应用程序,定制通讯协议是不可避免的,这里以一种最简单的协议为例,假设一个TCP通讯数据包,包含三部分:

[type][size][content]
  1. type:数据包类型(长度为一个字节,即1个byte)
  2. size:数据包长度(长度为四个字节,即4个byte)
  3. content:实际的数据包内容

Java数据包结构封装:

/**
 * @author michong
 */
public class Packet {
    /**
     * 消息类型
     */
    private byte type;
    /**
     * 内容长度(不含size和type长度)
     */
    private int size;
    /**
     * 消息内容
     */
    private byte[] content;
}

数据编码

使用Netty进行数据包编码可以通过继承MessageToByteEncoder来实现:

/**
 * @author michong
 */
public class PacketEncoder extends MessageToByteEncoder<Packet> {

    @Override
    protected void encode(ChannelHandlerContext ctx, Packet packet, ByteBuf out) {
        if (Objects.isNull(packet) {
            return;
        }
        out.writeByte(packet.getType());
        out.writeIntLE(packet.getSize());
        out.writeBytes(packet.getContent());
    }
}

需要注意的是:这里需要按定制协议的顺序写出,这里的size使用的是小端模式,解码的时候也要使用小端模式。

数据解码

使用Netty进行数据包编码可以通过继承ReplayingDecoder来实现:

/**
 * @author michong
 */
public class PacketDecoder extends ReplayingDecoder<Void> {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
        byte type = in.readByte();
        int size = in.readIntLE();
        byte[] content = new byte[size];
        in.readBytes(content);
        Packet pkt = new Packet(type, content);
        out.add(pkt);
    }
}

这里可以很明显的感受到使用Netty开发的好处,使用Netty开发可以不用自己处理粘包、半包问题,解码这里使用的是跟编码一样的小端模式。

标签:Netty,01,TCP,content,byte,out,数据包,size
From: https://www.cnblogs.com/michong2022/p/17517718.html

相关文章

  • Netty-TCP 02.客户端
    本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【2】部分,主要介绍客户端的实现。模块划分TCP简单TCP通讯(聊天)应用程序客户端主要分为三个部分:心跳保活处理消息消费处理TCP连接实现心跳保活心跳保活是目的是告诉服务端客户端是在线的,当客户端空闲时,定时给服务端发......
  • Netty-TCP 03.服务端
    本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【3】部分,主要介绍服务端的实现。模块划分跟客户端类似,服务端也是主要分为三个部分:心跳检测处理消息消费处理TCP服务实现心跳检测服务端需要定时检测客户端是否在线(即是否发送心跳),如果没有,那么将客户端连接断开,同样......
  • Netty-TCP 04.发消息
    本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【4】部分,主要测试客户端和服务端的通讯。服务端下面是服务端测试代码:/***@authormichong*/publicclassTCPServer{publicstaticvoidmain(String[]args){TCPServerBootstrapbootstrap=ne......
  • N层研习记录01:试图通过Boolean参数控制并发冲突的检查方式(LINQ to SQL)
    作者:光脚丫思考版权所有,转载请注明出处!^_^此研习用到的测试代码可通过以下两个地址下载,如果不能下载,请留言通知我。下载地址02:http://u.115.com/file/f26716bcc2如果你只想快速的查看测试代码的主题部分,或者想更具体的了解测试的详细记录,则可以参看另一篇名为《N层研习中的测试代......
  • 编译python为可执行文件遇到的问题:使用python-oracledb连接oracle数据库时出现错误:DP
    错误原文:DPY-3010:connectionstothisdatabaseserverversionarenotsupportedbypython-oracledbinthinmode链接数据库方式如下:connection=create_engine("oracle+oracledb://user:password@host:post/dbname") PyCharm编译器内运行成功但编译后会有DP......
  • System.Data.SqlClient.SqlException (0x80131904): Invalid object name 'Person'.
    @@abpMicrosoft.Data.SqlClient.SqlException(0x80131904):Invalidobjectname 请求接口报错:System.Data.SqlClient.SqlException(0x80131904):Invalidobjectname'Person'.无效的名称:Person数据库没有这个表,或者这个字段处理;检查数据库是否有改表或该字段......
  • 动态规划01
    动态规划核心要义这一步的数据依据上一步或者上两步的数据动态规划五部确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组动态规划第一题斐波那契数列dp[i]表示第i个数列的值递推公式已经给出f(n)=f(n-1)+f(n-2)初始化已......
  • P3975 [TJOI2015] 弦论 题解
    一、题目描述:给你一个长度为$n$的字符串,字符串由$26$个小写字母组成,求第$k$大的字串。给定参数$t$:$t=0:\位置不同的相同字串只算一个。$$t=1:\位置不同的相同字串算作多个。$若字串数量不足$k$个,输出$-1$。数据范围:$1\le......
  • 601. 体育馆的人流量
    601.体育馆的人流量SQL架构表:Stadium+---------------+---------+|ColumnName|Type|+---------------+---------+|id|int||visit_date|date||people|int|+---------------+---------+visit_date是表的主键......
  • 585. 2016年的投资
    585.2016年的投资SQL架构写一个查询语句,将 2016年(TIV_2016)所有成功投资的金额加起来,保留2位小数。对于一个投保人,他在2016年成功投资的条件是:他在2015年的投保额 (TIV_2015)至少跟一个其他投保人在2015年的投保额相同。他所在的城市必须与其他投保人都......