Socket框架

本文介绍了如何构建一个自定义的Socket通信框架,包括MessagePackage类的设计,用于封装消息包头和数据;M_Socket类的创建,实现连接、接收和发送数据的功能;以及NetMgr单例类的实现,管理Socket连接、接收和发送队列,以及重连机制。通过这个框架,可以高效地处理网络通信中的数据包交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.构建消息包类 MessagePackage
<1> 定义包头
根据业务需求,这里有5种:

//  构造包头用的数据(包头10个字节里的内容)
    public int bufferSize = 0;// 消息总长度
    public int protocolId = 0;// 消息ID
    // 网络标记包用来标记消息是否压缩、加密等信息 比如:0表示无压缩 无加密
    public ushort nFlags = 0;
    public ushort nModuleId = 0;// 发送的模块Id 客户端和服务器之间通讯设置为0
    public uint bodyLength = 0;// 包体长度

<2> 接受数据缓冲区 和 当前接受包接受字节多少的索引

public byte[] buffer;
public int bufferPoint;// 用来指示当前已经接收了多少字节

<3>自定义构造方法(用来初始化buffer区和重置bufferPoint)
上代码:


    public MessagePackage(int size) {
        CreatBuffer(size);
    }

    public void CreatBuffer(int size) {
        buffer = new byte[size];
        bufferPoint = 0;
    }

<4>将数据包头信息转换为实际信息

#region 将数据包头信息转换为实际信息
    // 将字节数组(长度为2)转换成数字
    private ushort BytesToInt(byte[] bytes) {
        int value = 0;
        value |= (bytes[1] & 0xFF) << 8;
        value |= (bytes[0] & 0xFF);
        return (ushort)value;
    }
    // 重置字节数组依次取出n个字节出来
    private byte[] GetBytes(byte[] byteArr, int length, int offset) {
        byte[] bytes = new byte[length];
        for (int i = 0; i < length; i++)
        {
            bytes[i] = byteArr[offset + i];
        }
        return bytes;
    }
    // 读取包头信息
    public void ReadPacketHead(MessagePackage msg) {
        bodyLength = BytesToInt(GetBytes(msg.buffer, 2, 0));
        bufferSize = BytesToInt(GetBytes(msg.buffer, 2, 2));
        mouduleId = BytesToInt(GetBytes(msg.buffer, 2, 4));
        flags = BytesToInt(GetBytes(msg.buffer, 2, 6));
        protocolId = BytesT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值