服务器设计笔记(1)-----消息的封装

简介:

    消息的封装方式有多中,比如xml,json等,但是我依然觉得使用拼数据的方式最简单,也最节省带宽。比如我们处理一个逻辑就可以这样处理了:

    int cast_net(MessageBlock &mb)

    {

        int  area_id,lvl;

        mv >> area >> lvl;

        //逻辑处理

        //....

        MessageBlock re_mb;

        re_mb << item_id << item_sum;

        return this->respond_to_client(re_mb); 

    } 

    

    在之前公司的时候,使用的是ace的ACE_Message_Block,来到了新的公司,重新封装了ACE_Message_Block。 很多地方学习了ACE的设计。比如 wr_ptr(),rd_ptr()等。 

    MessageBlock.h 文件

    /*


* MessageBlock.h
 *
 *  Created on: Aug 11, 2012
 *      Author: archy_yu
 */

#ifndef MESSAGEBLOCK_H_
#define MESSAGEBLOCK_H_

#include <TlvPackage.h>
#include <string>

class MessageBlock
{
public:
    MessageBlock(int =0);
    /*
    MessageBlock(short tag,short len);
    MessageBlock(TLVEntity paraTlvEntity);
    */

    MessageBlock(MessageBlock &mb);

    /*
    MessageBlock(char* msg,int len);
    MessageBlock(std::string str);
    */
    virtual ~MessageBlock();

    MessageBlock& operator << (const char &value);
    MessageBlock& operator << (const short &value);
    MessageBlock& operator << (const int &value);
    MessageBlock& operator << (const char* ss);

    MessageBlock& operator >> (char &value);
    MessageBlock& operator >> (short &value);
    MessageBlock& operator >> (int &value);
    MessageBlock& operator >> (char* ss);

    void set_len();
    int get_len();
    char* wr_ptr();
    char* rd_ptr();
    int Capacity();

private:
    int wr_position;
    int rd_position;
    int capacity;
    int len;
    char* data;
};
#endif /* MESSAGEBLOCK_H_ */

MessageBlock.cpp文件


/*
 * MessageBlock.cpp
 *
 *  Created on: Aug 11, 2012
 *      Author: archy_yu
 */

#include <stdlib.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "MessageBlock.h"

MessageBlock::MessageBlock(int n)
{
    wr_position = 0;
    rd_position = 0;
    len = 0;
    this->data = (char *)calloc(n > 0 ? n : 1024,sizeof(char));
    this->capacity = n > 0 ? n : 1024;
}

/*
MessageBlock::MessageBlock(short tag,short len)
{
    this->dataindex = 0;
    this->len = len;
    this->data = (char *)calloc(len,sizeof(char));
    if(this->data == NULL)
    {
        //error
    }
}

MessageBlock::MessageBlock(TLVEntity paraTlvEntity)
{
    this->dataindex = 0;
    this->len = paraTlvEntity.Length;
    this->data = (char* )calloc(paraTlvEntity.Length,sizeof(char));
    if(this->data == NULL)
    {
        //error
    }
    memcpy(this->data,paraTlvEntity.Value,paraTlvEntity.Length);
}
*/
MessageBlock::MessageBlock(MessageBlock &mb)
{
    this->data = mb.data;
    this->len = mb.len;
    this->capacity = mb.capacity;
    this->rd_position = mb.rd_position;
    this->wr_position = mb.wr_position;
}

/*
MessageBlock::MessageBlock(char* msg,int len)
{
    this->data = (msg);
    this->len = len;
    this->dataindex = 0;
}

MessageBlock::MessageBlock(std::string str)
{
    this->data = const_cast<char* >(str.c_str());
    this->len = str.size();
    this->dataindex = 0;
}
*/
MessageBlock::~MessageBlock()
{
    // TODO Auto-generated destructor stub
    free(this->data);
}

MessageBlock& MessageBlock::operator << (const char &value)
{
    if((wr_position + sizeof(char)) > this->capacity)
    {
        this->data = (char* )realloc(this->data,wr_position + sizeof(char));

        if(this->data == NULL)
        {
            return *this;
        }
        this->capacity = this->wr_position + sizeof(char);
    }

    *((char* )(this->data + wr_position )) = value;
    wr_position += sizeof(char);
    len = wr_position ;

    return *this;
}

MessageBlock& MessageBlock::operator <<(const short &value)
{
    if((wr_position + sizeof(short)) > this->len)
    {
        this->data = (char* )realloc(this->data,wr_position + sizeof(short));
        if(this->data == NULL)
        {
            return *this;
        }
        this->capacity = this->wr_position + sizeof(short);
    }

    *((short* )( this->data + wr_position )) = value;
    wr_position += sizeof(short);
    len = wr_position;

    return *this;
}

MessageBlock& MessageBlock::operator <<(const int &value)
{
    if((wr_position + sizeof(int)) > this->len)
    {
        this->data = (char *)realloc(this->data,wr_position + sizeof(int));
        if(this->data == NULL)
        {
            return *this;
        }
        this->capacity  = this->wr_position + sizeof(int);
    }

    *((int* )( this->data + wr_position )) = value;
    wr_position += sizeof(int);
    this->len = wr_position;

    return *this;
}

MessageBlock& MessageBlock::operator <<(const char* ss)
{

    short len = strlen(ss);

    if((wr_position + 2 + len) > this->len)
    {
        this->data = (char *)realloc(this->data,wr_position + 2 + strlen(ss));
        if(this->data == NULL)
        {
            return *this;
        }
        this->capacity = this->wr_position + 2 + strlen(ss);
    }

    *((short* )(this->data + wr_position)) = len;
    wr_position += sizeof(len);
    this->len = wr_position;

    memcpy(this->data + wr_position,ss,len);
    wr_position += len;
    this->len = wr_position;
    return *this;
}

MessageBlock& MessageBlock::operator >>(char &value)
{
    if((rd_position + sizeof(char)) > this->len)
    {
        return *this;
    }

    value = *((char* )(this->data + rd_position ));
    rd_position += sizeof(char);

    return *this;
}

MessageBlock& MessageBlock::operator >>(short &value)
{
    if((rd_position + sizeof(short)) > this->len)
    {
        return *this;
    }

    value = *((short* )(this->data + rd_position ));
    rd_position += sizeof(short);

    return *this;
}

MessageBlock& MessageBlock::operator >>(int &value)
{
    if((rd_position + sizeof(short)) > this->len)
    {
        return *this;
    }
    value = *((int* )(this->data + rd_position));
    rd_position += sizeof(int);
    return *this;
}

MessageBlock& MessageBlock::operator >>(char* ss)
{
    short len = *((short* )(this->data + rd_position));

    if( (this->rd_position + sizeof(len) + len) > (this->len) )
    {
        return *this;
    }

    rd_position += sizeof(len);
    memcpy(ss,this->data + rd_position,len);
    ss[len] = '\0';
    rd_position += len;
    return *this;
}

char* MessageBlock::wr_ptr()
{
    return this->data + wr_position;
}

char* MessageBlock::rd_ptr()
{
    return this->data + rd_position;
}

int MessageBlock::Capacity()
{
    return this->capacity;
}


void MessageBlock::set_len()
{
    (*(short *)(this->data)) = this->wr_position;
}

int MessageBlock::get_len()
{
    return this->len;}

   需要说明的几点: 

    1. linux服务器一般都是小端的设计,但是flash在使用ByteArray的时候就要注意大端小端的使用了。 

    2. 这样的类不是一次能设计好的,需要在后续的开发过程中持续的改进。  


相关文章
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
4月前
|
运维 安全 网络安全
运维笔记:基于阿里云跨地域服务器通信
运维笔记:基于阿里云跨地域服务器通信
206 1
|
7月前
|
JSON 自然语言处理 网络协议
【字节跳动青训营】后端笔记整理-2 | Go实践记录:猜谜游戏,在线词典,Socks5代理服务器
猜数字游戏也算是入门一门编程语言必写的程序了。通过这个程序,我们可以熟悉Go语言中的输入输出、流程控制与随机函数的调用。
101 2
|
Java 应用服务中间件 PHP
[笔记]Nginx使用之作为图片服务器
[笔记]Nginx使用之作为图片服务器
270 0
|
7月前
|
弹性计算 NoSQL MongoDB
用云服务器ECS玩转Leanote个人云笔记
本教程将介绍如何搭建个人Leanote云笔记。
149579 7
|
7月前
|
存储 网络协议 数据可视化
如何使用Synology Drive作为文件同步服务器实现云同步Obsidian笔记
如何使用Synology Drive作为文件同步服务器实现云同步Obsidian笔记
224 0
|
7月前
|
弹性计算 安全 Linux
幻兽帕鲁云服务器搭建笔记,详细记录
如何自建幻兽帕鲁服务器?基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了,一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器,阿里云百科分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程
84 0
|
Ubuntu 网络安全 Docker
[笔记]Qt5+FFMpeg+Opencv 实现实时美颜直播推流《一》基础知识以及直播服务器配置
[笔记]Qt5+FFMpeg+Opencv 实现实时美颜直播推流《一》基础知识以及直播服务器配置
183 0
|
前端开发
前端学习笔记202307学习笔记第五十五天-node-服务器和域名1
前端学习笔记202307学习笔记第五十五天-node-服务器和域名1
67 2
|
前端开发
前端学习笔记202307学习笔记第五十五天-node-客户端,服务器,Url之3
前端学习笔记202307学习笔记第五十五天-node-客户端,服务器,Url之3
64 1