服务器设计笔记(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 文件
/*
*
* 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. 这样的类不是一次能设计好的,需要在后续的开发过程中持续的改进。
服务器设计笔记(1)-----消息的封装相关推荐
- Cadence 16.6PCB设计之PCB封装设计笔记
好记性不如烂笔头,学过的知识就要记下来,否则没过多久就忘得一干二净,又要重新学习.最新使用Allegro的Orcad画了一块板子,并用Allegro设计PCB.为了避免忘记,在此记个笔记吧! 本文使用 ...
- 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等
本文作者潘唐磊,腾讯WXG(微信事业群)开发工程师,毕业于中山大学.内容有修订. 1.内容概述 本文总结了企业微信的IM消息系统架构设计,阐述了企业业务给IM架构设计带来的技术难点和挑战,以及技术方案 ...
- Linux高并发服务器开发---笔记4(网络编程)
0705 第4章 项目制作与技能提升 4.0 视频课链接 4.1 项目介绍与环境搭建 4.2 Linux系统编程1.4.3 Linux系统编程2 4.4 多进程 1-9 10.进程间通信☆☆☆ 4.5 ...
- C++服务器设计(七):聊天系统服务端实现
在之前的章节中,我们对服务端系统的设计实现原理进行了剖析,在这一章中,我们将对服务端框架进行实际运用,实现一款运行于内网环境的聊天系统.该聊天系统由客户端与服务器两部分组成,同时服务端通过数据库维护用 ...
- 并发服务器设计思路,参考apache学习UDP和QoS,研究成果
研究了快1个月的服务器架构,把研究成果记录一下. 参考的有:Apache vlc ACE ftp 我主要需要其中的并发处理,内存管理,TCP/UDP.QoS,速度限制等方面的内容,所以着重说这几 ...
- 服务器主动推送消息数据给客户端
1 引言 这个问题第一次是我在实现一个导师的方案的时候所发现的,一开始我需要实现服务器与客户端的密钥协商和数据传递,服务器需要主动分发(推送)密钥给客户端,因为以前没有做过相关编码,后来只能想到用反向 ...
- 其实一切与游戏无关--yy笔录+转载网络游戏服务器设计
严格的说,我从来没有玩过网络游戏,对于网游的理解仅限于大学时其他室友之间关于魔兽世界的经验交流.曾经yy过网游的后台实现方法,但现在回想起来那时的想法确实幼稚的很.两个月打酱油般的工作当中给我最深的体 ...
- 游戏服务器设计(转)
有段时间没有研究技术了,这次正好看到了新版的mangos,较之以前我看的版本有了比较大的完善,于是再次浏览了下他的代码,也借此机会整理下我在游戏服务器开发方面的一些心得,与大家探讨. 另外由于为避免与 ...
- 服务器架设笔记——多模块和全局数据
随着项目工程的发展,多模块设计和性能优化是在所难免的.本文我将基于一些现实中可能遇到的需求,讲解如何在Apache的Httpd插件体系中实现这些功能.(转载请指明出于breaksoftware的csd ...
- 服务器架设笔记——Apache模块开发基础知识
通过上节的例子,我们发现Apache插件开发的一个门槛便是学习它自成体系的一套API.虽然Apache的官网上有对这些API的详细介绍,但是空拿着一些零散的说明书,是很难快速建立起一套可以运行的系统. ...
最新文章
- UIWebView之获取所点位置图片URL
- 附录5:TensorFlow基础(一)
- 免费资源 | ActiveReports 报表控件发布多平台 Demo 代码集合
- 云宇宙iwemeta: 亚马逊全面进军元宇宙
- python julian date_Python 的内嵌time模板翻译及说明
- 如何高效率学Web前端 怎么规划前端学习路线
- 不扯概念,用例子演示什么是脏读,不可重复读,幻读?
- 面试官系统精讲Java源码及大厂真题 - 11 HashSet、TreeSet 源码解析
- iPhone 12系列详细屏幕参数前瞻:首批只有三星、LG屏幕 均为OLED面板
- python基础教程视频-python从入门到精通之30天快速学python视频教程
- ifs 报表开发手册_.NET快速开发框架Colder发布:10 篇热文汇总
- Spring源码之FactoryBean接口的作用和实现原理
- 微信小程序制作模板套用时需要注意什么呢?
- ElasticSearch从入门到精通:Logstash妙用
- 优化算法(1):最速下降法、牛顿法
- Aurora AD308e 一体机驱动
- RFID定位技术在仓库管理中的应用--新导智能
- Linux/centos备份系统镜像工具
- 计算机图形学中点画线法
- Warren E Buffett