网游服务器框架(2)Stream

原创 2013年12月04日 22:11:43



为了方便序列化数据,特建立了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;

}


Java8初体验(二)Stream语法详解

1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and para...
  • z742182637
  • z742182637
  • 2017年03月24日 09:39
  • 221

Java8初体验(二)Stream语法详解

转自:http://ifeve.com/stream/Java8初体验(二)Stream语法详解 感谢同事【天锦】的投稿。投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验(...
  • chenchaofuck1
  • chenchaofuck1
  • 2016年07月13日 15:38
  • 2933

Hadoop的Python框架指南

最近,我加入了Cloudera,在这之前,我在计算生物学/基因组学上已经工作了差不多10年。我的分析工作主要是利用Python语言和它来进行的。但Apache Hadoop的生态系统大部分都是用Jav...
  • iloveyin
  • iloveyin
  • 2014年12月19日 19:26
  • 1205

开源直播live stream方案

Live streaming is in much demand nowadays. Kaltura first introduced an end to end live streaming sol...
  • gnicky
  • gnicky
  • 2017年02月08日 10:37
  • 549

Java9 的几个新特性

1. JShell: 交互式 Java REPL 许多语言已经具有交互式编程环境,Java 现在加入了这个俱乐部。您可以从控制台启动 jshell , 并直接启动输入和执行 Java 代码。 js...
  • hcy1000
  • hcy1000
  • 2017年05月11日 17:15
  • 283

rtmp协议中streamid和chunk关系

Rtmp中,一个Message通常是分割成多个Chunk进行传输的.每个Chunk通常包含有1~12个字节的头部(该部分与完整的协议不是十分符合). 因为Rtmp是基于TCP协议的,所以在Rtm...
  • occupy8
  • occupy8
  • 2015年03月02日 14:11
  • 2622

SparkStream:2)Window窗体相关操作

SparkStreaming之window滑动窗口应用,Spark Streaming提供了滑动窗口操作的支持,从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据,会被聚...
  • jiangpeng59
  • jiangpeng59
  • 2016年11月27日 22:26
  • 1253

kafka与streaming集成两种方式

hadoop,spark,kafka交流群:224209501标签(空格分隔) spark streaming作为kafka消费者两种模式,测试完整通过。...
  • u011308691
  • u011308691
  • 2016年05月18日 10:57
  • 2594

Stream语法详解

1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and para...
  • u014082714
  • u014082714
  • 2016年05月16日 11:32
  • 8140

KafkaStreams介绍(四) –架构

说明: 本文是Confluent Platform 3.0版本中对于Kafka Streams的翻译。 原文地址:https://docs.confluent.io/3.0.0/streams/i...
  • ransom0512
  • ransom0512
  • 2016年08月03日 17:12
  • 3305
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网游服务器框架(2)Stream
举报原因:
原因补充:

(最多只允许输入30个字)