网游服务器框架(2)Stream



为了方便序列化数据,特建立了InputStream  和 outStream 2种数据容器。

每个流在初始化的时候。都带有字节序属性, 在写入和读取的时候,先处理再返回,这样逻辑部分可以解决字节序等问题。

Output 在初始化的时候  建立一个固定大小的缓存区。 保持一个流指针。 每次写入新的数据,都copy数据到流指针处,然后指针向后偏移写入的大小


Input  同上。每次读取。都偏移指针位置。


#define DEFAULT_BUFFER_MAX 128

class FSOutputStream
{

private:

	FS_DEFINE_READ_ONLY(size_t, m_iBufferLength, BufferLength);
	FS_DEFINE_READ_ONLY(size_t, m_iPos, Pos);
	FS_DEFINE_READ_ONLY(void*, m_pData, Data);

private:
	void scaleBuffer();

public:
	
	FSOutputStream(size_t length=DEFAULT_BUFFER_MAX);
	virtual ~FSOutputStream(){
		if(m_pData){
			free(m_pData);
			m_pData = NULL;
		}
	}

public:
	
	void toBytes(void*);

	size_t getLength(){ return m_iPos; };

	void subBuffer(size_t start, size_t len);

	void writeLongLong(unsigned long long);
	void writeInt(int val);
	void writeLong(long val);
	void writeShort(short val);


	void writeUInt(unsigned int);
	void writeUShort(unsigned short);


	void writeFloat(float val);
	void writeByte(BYTE val);
	void writeDatas(const void*, size_t);
	void writeString(char*, int);
	void writeString(const char*);
	void writeString(std::string str){  writeString((char*)str.c_str(), str.length()); };

};


#include "FSOutputStream.h"


FSOutputStream::FSOutputStream(size_t length):m_iBufferLength(length), m_iPos(0), m_pData(malloc(length)){
}

void FSOutputStream::toBytes(void* out){
	memcpy(out, m_pData, getLength());
}

void FSOutputStream::scaleBuffer(){

	m_iBufferLength = m_iBufferLength << 1;
	void* newBuffer = ::malloc(m_iBufferLength);
	memcpy(newBuffer, m_pData, m_iPos);

	void* tmp = m_pData;
	m_pData = newBuffer;
	free(tmp);

}

void FSOutputStream::subBuffer(size_t start, size_t len){

	void* newBuffer = ::malloc(len == 0 ? DEFAULT_BUFFER_MAX : len);
	memcpy(newBuffer, (BYTE*)m_pData + start, len);

	m_iBufferLength = (len == 0 ? DEFAULT_BUFFER_MAX : len);

	free(m_pData);
	m_pData = newBuffer;

	m_iPos = len;

}
void FSOutputStream::writeString(const char* data){
	int len = strnlen(data, 65535);
	writeInt(len);
	writeDatas(data, len);
}

void FSOutputStream::writeString(char* data, int len){
	writeInt(len);
	writeDatas(data, len);
}
void FSOutputStream::writeInt(int val){
	writeDatas(&val, sizeof(int));
}

void FSOutputStream::writeLong(long val){
	
	writeDatas(&val, sizeof(long));
}


void FSOutputStream::writeLongLong(unsigned long long v){

	int height = v >> 32;
	int low = v & 0xffffffff;
	writeInt(height);
	writeInt(low);
}

void FSOutputStream::writeShort(short val){
	writeDatas(&val, sizeof(short));

}
void FSOutputStream::writeUInt(unsigned int val){
	writeDatas(&val, sizeof(unsigned int));
}
void FSOutputStream::writeUShort(unsigned short val){
	writeDatas(&val, sizeof(unsigned short));
}

void FSOutputStream::writeFloat(float val){
	writeDatas(&val, sizeof(float));
}

void FSOutputStream::writeByte(BYTE val){
	
	writeDatas(&val, sizeof(BYTE));
}

void FSOutputStream::writeDatas(const void* data, size_t len){

	while(m_iPos + len >= m_iBufferLength){
		scaleBuffer();
	}

	memcpy((BYTE*)m_pData + m_iPos, data, len);

	m_iPos += len;

}


购物商城项目采用PHP+mysql有以及html+css jq以及layer.js datatables bootstorap等插件等开发,采用了MVC模式,建立一个完善的电商系统,通过不同用户的不同需求,进行相应的调配和处理,提高对购买用户进行配置….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值