2012年(8)
分类: LINUX
2012-11-14 13:34:44
Introduction
本节开始将介绍一个使用EasyNetwork框架搭建的下载服务器.该服务器支持多任务/多线程/下载,支持断点续传.
该Donwload server/client比较简单,没有做过多的优化/检查工作来保证服务的稳定性.因为我们的focus是“怎么使用框架搭建Download server",而不是“Download server". 当然,现在我们只要把精力放在应用层的实现逻辑就可以了,呵呵...好吧,进入主题,本次新闻联播的主要内容有:
1. Download Protocol
下载协议,是最基本到要求了,我就不说啥了. 我们利用框架的DefaultProtocol来定义我们下载的4个协议:RequestSize, RespondSize, RequestData, RespondData.(具体见源码)
· RequestSize 请求文件大小
//请求文件大小
class RequestSize: public Protocol
{
public://实现protocol的接口
//协议的描述信息
const char* details(){return "RequestSize";}
//编码协议体数据到byte_buffer,成功返回true,失败返回false.
bool encode_body(ByteBuffer *byte_buffer);
//解码大小为size的协议体数据buf.成功返回true,失败返回false.
bool decode_body(const char *buf, int size);
public:
RequestSize(){}
RequestSize(string &filename)
{
m_file_name = filename;
}
void assign(const string &file_name){m_file_name = file_name;}
const string& get_file_name(){return m_file_name;}
private:
string m_file_name;
};
//DownloadProtocol.cpp
//编码协议体数据到byte_buffer,成功返回true,失败返回false.
bool RequestSize::encode_body(ByteBuffer *byte_buffer)
{
int len = 0;
ENCODE_STRING(m_file_name); //file name
return true;
}
//解码大小为size的协议体数据buf.成功返回true,失败返回false.
bool RequestSize::decode_body(const char* buf, int size)
{
int len = 0;
DECODE_STRING(m_file_name); //file name
return true;
}
· RespondSize 回复文件大小
· RequestData 请求文件数据
· RespondData 回复文件数据
· DownloadProtocolFamily协议族
最后需要定义一个协议族DownloadProtocolFamily来生成上面四个协议
class DownloadProtocolFamily:public DefaultProtocolFamily
{
public:
Protocol* create_protocol(ProtocolType protocol_type, bool new_header=true);
int destroy_protocol(Protocol* protocol);
private:
//memory cache: StringProtocol
MemCache<RequestSize> m_request_size_memcache;
MemCache<RespondSize> m_respond_size_memcache;
MemCache<RequestData> m_request_data_memcache;
MemCache<RespondData> m_respond_data_memcache;
};