经过一天的简单学习,尝试自己写一个简单的服务器,能够实现以下三大回调功能:onConnect onMessage onClose

下面直接贴出代码

1.BaseServer抽象类

BaseServer.h

/*

name:BaseServer

use:the basest server

author:hezijian([email protected])

*/

#ifdef _MSC_VER

#define _WIN32_WINNT 0x0501

#endif

#ifndef _BASE_SERVER_H_

#define _BASE_SERVER_H_

#include

#include "SERVER_CONSTANT.h"

using namespace boost::asio;

using boost::system::error_code;

using ip::tcp;

class Session{

public:

Session(io_service& iosev):

m_buf((char*)malloc(SERVER_CONTANT::SESSION_BUF_LEN)),

m_socket(iosev)

{

memset(m_buf,0,SERVER_CONTANT::SESSION_BUF_LEN);

}

~Session(){

delete[] m_buf;

}

inline ip::tcp::socket& getSocket(){return m_socket;}

inline char* getBuf(){return m_buf;}

private:

ip::tcp::socket m_socket;

char* m_buf;

};

class BaseServer

{

public:

BaseServer(io_service &iosev);

//初始化

void init();

//等待连接

void start();

//当有连接时

void connect(std::shared_ptr pSession, error_code ec);

//当有消息传递时

void message(std::shared_ptr pSession, error_code ec);

//当断开连接时

void close(std::shared_ptr pSession, error_code ec);

//以下是回调函数,由子类重写

virtual void onConnect(std::shared_ptr pSession, error_code ec)=0;

virtual void onMessage(std::shared_ptr pSession, error_code ec)=0;

virtual void onClose(std::shared_ptr pSession, error_code ec)=0;

private:

io_service &m_iosev;

ip::tcp::acceptor m_acceptor;

int m_unique_id;

};

#endif

BaseServer.cpp

#include "BaseServer.h"

#include

BaseServer::BaseServer(io_service &iosev):

m_iosev(iosev),m_acceptor(iosev, tcp::endpoint(tcp::v4(), SERVER_CONTANT::PORT)),m_unique_id(1){

init();

}

void BaseServer::init(){

return;

}

void BaseServer::start(){

std::shared_ptr pSession(new Session(m_iosev));

m_acceptor.async_accept(pSession->getSocket(),

std::bind(&BaseServer::connect,this, pSession, std::placeholders::_1));

}

void BaseServer::connect(std::shared_ptr pSession, error_code ec){

std::cout <<

"一个新的连接:" << pSession->getSocket().remote_endpoint().address()

<< std::endl;

onConnect(pSession,ec);

if(ec) return;

//继续等待连接

start();

pSession->getSocket().async_read_some(buffer(pSession->getBuf(),SERVER_CONTANT::SESSION_BUF_LEN),

std::bind(&BaseServer::message,this,pSession,std::placeholders::_1));

}

void BaseServer::message(std::shared_ptr pSession, error_code ec){

if(ec){

BaseServer::close(pSession,ec);

return;

}

std::cout <<

"从客户端"<< pSession->getSocket().remote_endpoint().address() << "收到数据:" << pSession->getBuf()

<< std::endl;

onMessage(pSession,ec);

//清空缓冲区,继续等待数据

memset(pSession->getBuf(),0,sizeof(pSession->getBuf()));

pSession->getSocket().async_read_some(buffer(pSession->getBuf(),SERVER_CONTANT::SESSION_BUF_LEN),

std::bind(&BaseServer::message,this,pSession,std::placeholders::_1));

}

void BaseServer::close(std::shared_ptr pSession, error_code ec){

std::cout << boost::system::system_error(ec).what() << std::endl;

std::cout << pSession->getSocket().remote_endpoint().address() << " disconnect" << std::endl;

pSession->getSocket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, const_cast<:system::error_code>(ec));

pSession->getSocket().close(const_cast<:system::error_code>(ec));

onClose(pSession,ec);

return;

}

说明,BaseServer是一个抽象类,必须由子类重写回调函数才能实例化,SERVER_CONSTANT是服务器常量的管理头文件。

Session暂时是一个包装了socket和buf的类,以后可能还会丰富修改

2.MyServer继承BaseServer

MyServer.h

#ifndef _MY_SERVER_H_

#define _MY_SERVER_H_

#include "BaseServer.h"

class MyServer : public BaseServer{

public:

MyServer(io_service& iosev);

virtual void onConnect(std::shared_ptr pSession, error_code ec);

virtual void onMessage(std::shared_ptr pSession, error_code ec);

virtual void onClose(std::shared_ptr pSession, error_code ec);

};

#endif

MyServer.cpp

#include "MyServer.h"

MyServer::MyServer(io_service& iosev):BaseServer(iosev){

}

void MyServer::onConnect(std::shared_ptr pSession, error_code ec){

printf("onConnect\n");

}

void MyServer::onMessage(std::shared_ptr pSession, error_code ec){

printf("onMessage\n");

}

void MyServer::onClose(std::shared_ptr pSession, error_code ec){

printf("onClose\n");

}

3.main函数

#include "MyServer.h"

#include

int main(int argc, char* argv[])

{

try{

io_service iosev;

MyServer sev(iosev);

// 开始等待连接

sev.start();

std::cout << "服务器启动成功!" << std::endl;

iosev.run();

}catch(std::exception e){

std::cout << e.what() << std::endl;

}

return 0;

}

原文:http://blog.csdn.net/hezijian22/article/details/41621595

boost asio 文件服务器,基于boost::asio封装搭建的简单服务器相关推荐

  1. 基于CentOS7.6系统搭建远程GIT服务器

    基于CentOS7.6系统搭建远程GIT服务器 0 背景 0.0 GIT是什么 0.1 为什么搭建远程GIT服务器 1. 功课 2. 过程 3. 总结 4. 参考资料 0 背景 0.0 GIT是什么 ...

  2. boost asio 文件服务器,使用boost ASIO库封装TCP服务器类

    使用异步TCP方式,可在此基础上增加更多功能. 头文件AsioTcp.h: #pragma once #include #include #include typedef boost::asio::i ...

  3. 基于滴滴云主机搭建 FTP 文件共享服务器(一)

    FTP 简单介绍 什么是 FTP 服务器? FTP 服务器(File Transfer Protocol Server)是在互联网上提供文件共享存储和访问服务的计算机,它们依照 FTP 协议提供服务. ...

  4. Tomact和MySql搭建android简单服务器

    之前已经写了怎么搭建eclipse加tomcat整合成服务器环境,如果有人不知道怎么配置,可以看我的那篇博客. 现在环境搭配好的情况下,在eclipse里新建一个Web工程,在src包下新建一个ser ...

  5. 搭建一个简单的问答系统(v2.0)

    之前刚接触机器学习的时候,写过一篇<基于sklearn库,搭建一个简单的问答系统>.此篇文章是在上篇的逻辑上,对一些函数进行了优化,并对检索方式进行了一些优化,再各个环节上时间复杂度都提高 ...

  6. Boost:基于boost::asio的延迟udp服务器测试程序

    Boost:基于boost::asio的延迟udp服务器测试程序 实现功能 C++实现代码 客户端源码 服务端源码 实现功能 boost::asio模块,基于boost::asio的延迟udp服务器测 ...

  7. Boost:基于boost::asio的延迟tcp服务器测试程序

    Boost:基于boost::asio的延迟tcp服务器测试程序 实现功能 C++实现代码 客户端源码 服务端源码 实现功能 boost::asio模块,基于boost::asio的延迟tcp服务器测 ...

  8. Boost:基于boost::asio单元测试的测试程序

    Boost:基于boost::asio单元测试的测试程序 实现功能 C++实现代码 实现功能 boost::asio模块,基于boost::asio单元测试的测试程序 C++实现代码 #ifndef ...

  9. Boost:基于boost::asio模块引用计数程序

    Boost:基于boost::asio模块引用计数程序 实现功能 C++实现代码 实现功能 基于boost::asio模块引用计数程序 C++实现代码 #include <boost/asio. ...

最新文章

  1. caffe转caffe2
  2. TCP/IP协议模型详解
  3. HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂
  4. 60多套html5移动端模板_美容整形高保真移动端原型模板发布
  5. Cocos游戏引擎3D特效全新升级 更流畅更炫酷
  6. django建表报错
  7. 使VM的虚拟机内存超越物理内存的方法
  8. 简而言之,JUnit:Hello World
  9. Python | 程序从列表中删除范围内的所有元素
  10. 【华为云 ModelArts-Lab AI实战营】第二期
  11. Centos 7 mysql 5.7 给root开启远程访问权限,修改root密码
  12. MY CSDB BLOG 第一篇
  13. 百度注册登录页面简单实现——仿照
  14. Android数据编码之Base64
  15. 一套成熟的BPM系统应该有的功能
  16. 论文笔记2:Combining Lexical, Syntactic, and Semantic Features with Maximum Entropy Models for Extracting
  17. java进阶之多线程二线程池
  18. 如何为YouTube启用暗模式
  19. 亚商投资顾问 早餐FM/0926 特斯拉跌4.59%,亚马逊跌3.01%
  20. “融而开放、合以创新”T-HIM融合通信技术开发实战

热门文章

  1. 苹果手机(iPhone)添加outlook邮箱设置
  2. 机器学习 反向传播_机器学习中的神秘化反向传播:您想了解的隐藏数学
  3. 乌镇互联网大会——中国最成功的商人花一辈子才悟到的道理(转自知乎)
  4. swi prolog 和java_制作适用于GNU和SWI的Prolog代码
  5. js中在另一个页面打开ppt、word
  6. Python之数据分析总结
  7. 【ASP.NET Core】配置应用程序地址的N多种方法
  8. SQL三值逻辑和NULL
  9. 用卡尔曼滤波处理工程数据的方法与思考with基于GPS与INS组合导航的滤波模型仿真
  10. 操作系统饥饿现象_操作系统中的饿死现象怎样理解?