Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19262
  • 博文数量: 8
  • 博客积分: 190
  • 博客等级: 入伍新兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-14 12:40
文章分类
文章存档

2012年(8)

我的朋友

分类: LINUX

2012-11-14 13:34:44

Introduction

 

本节开始将介绍一个使用EasyNetwork框架搭建的下载服务器.该服务器支持多任务/多线程/下载,支持断点续传.

Donwload server/client比较简单,没有做过多的优化/检查工作来保证服务的稳定性.因为我们的focus怎么使用框架搭建Download server",而不是“Download server". 当然,现在我们只要把精力放在应用层的实现逻辑就可以了,呵呵...好吧,进入主题,本次新闻联播的主要内容有:

  • 1._Download_Protocol
  • 2._Download_Server
  • 3._Download_Client
  • 4._Ending

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;
};

阅读(429) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~