继上篇 初心之让人人能写高性能服务器 已一星期,我们仍尚未谋面,我已迫不及待,是否还记得我曾经对你的承诺,我说,要让人人能编写高性能网络服务器,当然,这只是我一相情愿的告白,我不知道有没有被你看上,也不知道你是否还愿意在这条道上与我走一走,我们一起谈一谈,未来…

看起来这是一个梦啊,梦是当不得真的,但梦想还是可以做做的。

在这所有的所有的一切开始之前,我们还是不落俗套地见上一见吧,你说,自古套路得人心,而大家又总倾心于Hello World,要不,我们换一个,Ping Pong可好。

请你忘记你关于网络编程的想象,保留那么一点点CPP的印象,因为,好的忘记,是新的开始,而CPP正是我们的主角。

要懂东西的不多,我们就从最基本的问题开始吧。


[备注:此篇为初稿,期待你的反馈]

在开始之前,建议先阅读以下前置知识:

  1. 基本问题:什么是信息,何为传递,连接
  2. Netplus试图解决什么问题
  3. Netplus里的基本概念
  4. Netplus收发消息的基本流程
  5. c++11: std::tuple example & tutorial
  6. c++11: lambda example & tutorial

PINGPONG Example

本篇,我们将演示如何实现一个完整版的PingPong服务器,以及客户端。

读完本文,你应该能用Netplus进行简单消息收发。

1. PINGPONG服务器

  1. 监听在tcp://127.0.0.1:13103端口
  2. 收到到来自远端的的连接的时候,为Channel添加一个Pong Handler

Pong Handler: 此Handler只做一个事情,当收到来自客户端的消息后,回复PONG

代码如下:

class Pong :public netp::channel_handler_abstract {
public:Pong() : channel_handler_abstract(netp::CH_INBOUND_READ){}//for inboundvoid read(netp::ref_ptr<netp::channel_handler_context> const& ctx, netp::ref_ptr<netp::packet> const& income) {//reply with PONGconst std::string pong = "PONG";netp::ref_ptr<netp::packet> PONG = netp::make_ref<netp::packet>(pong.c_str(), pong.length());netp::ref_ptr<netp::promise<int>> write_promise = ctx->write(PONG);//check the reply status once the write operation is donewrite_promise->if_done([](int reply_rt) {NETP_INFO("[PONG]reply PONG, rt: %d", reply_rt );});}
};

2. PINGPONG客户端

  1. 拨号到tcp://127.0.0.1:13103端口
  2. 当拨号成功之后,为Channel添加一个Ping Handler

Ping Handler: 当连接成功时,向服务器发送PING, 当成功收到回复的消息(PONG)后,继续发送PING

代码如下:

class Ping : public netp::channel_handler_abstract {
public:Ping():channel_handler_abstract(netp::CH_ACTIVITY_CONNECTED|netp::CH_INBOUND_READ){}void connected(netp::ref_ptr<netp::channel_handler_context> const& ctx) {NETP_INFO("[PING]connected");//initial PINGdo_ping(ctx);}void read(netp::ref_ptr<netp::channel_handler_context> const& ctx, netp::ref_ptr<netp::packet> const& income) {NETP_INFO("[PING]reply income");do_ping(ctx);}void do_ping(netp::ref_ptr<netp::channel_handler_context> const& ctx) {const std::string ping = "PING";netp::ref_ptr<netp::packet> message_ping = netp::make_ref<netp::packet>();message_ping->write(ping.c_str(), ping.length());netp::ref_ptr<netp::promise<int>> write_p = ctx->write(message_ping);write_p->if_done([]( int rt ) {NETP_INFO("[PING]write PING, rt: %d", rt );});}
};

3. PING PONG的总体执行逻辑

  1. 服务器监听tcp://127.0.0.1:13103
  2. 当服务器有新的channel连接进来时,为新的channel添加handler
  3. 客户端拨号到tcp://127.0.0.1:13103
  4. 客户端拨号成功后,添加handler

4. main 代码如下:

int main(int argc, char** argv) {//initialize a netplus app instancenetp::app app;std::string host = "tcp://127.0.0.1:13103";netp::ref_ptr<netp::channel_listen_promise> listenp = netp::socket::listen_on(host, [](netp::ref_ptr<netp::channel>const& ch) {ch->pipeline()->add_last( netp::make_ref<netp::handler::hlen>());ch->pipeline()->add_last( netp::make_ref<Pong>() );});int listenrt = std::get<0>(listenp->get());if (listenrt != netp::OK) {NETP_INFO("listen on host: %s failed, fail code: %d", host.c_str(), listenrt);return listenrt;}netp::ref_ptr<netp::channel_dial_promise> dialp = netp::socket::dial(host, [](netp::ref_ptr<netp::channel> const& ch ) {ch->pipeline()->add_last( netp::make_ref<netp::handler::hlen>() );ch->pipeline()->add_last( netp::make_ref<Ping>() );});int dialrt = std::get<0>(dialp->get());if (dialrt != netp::OK) {//close listen channel and returnstd::get<1>(listenp->get())->ch_close();return dialrt;}//wait for signal to exit//Ctrl+C on windows//kill -15 on linuxapp.run();//close listen channelstd::get<1>(listenp->get())->ch_close();//close dial channelstd::get<1>(dialp->get())->ch_close();return 0;
}

5. 代码解读

5.1 netp::app

所有的netplus应用,netp::app app总是第一行代码,app实例代表着一个netplus对象,用处初始化netplus系统,设置信号处理。

app.run() 等待退出信号

5.2 Channel Handler hlen

  • 这个handler用于处理格式为长度+内容的消息,内容长度占4bytes
  • 发送时为消息添加消息长度,占4byte
  • 接收时,先读4byte作为长度,然后按读到的长度继续读bytes, 直到读完给定的长度后,将read事件传递给下一个Handler,详细的描述,请参阅:

Netplus 之 Handler: hlen​github.com

5.3 ch->pipeline()->add_last( handler )

将handler添加到handler链表末尾

(此篇文章待进一步整理)

完整的工程地址如下:

Netplus 之 PINGPONG工程​github.com

知识库:

Netplus之WIKI​github.com

如果你喜欢我的文章,请加个关注,点个赞,谢谢。

写代码的冰冰

姑苏城里平江路,入夜细雨扰我心,再会。

想把我说给你听,,,

[netplus]初见,Netplus快速开始之PingPong Example相关推荐

  1. [netplus] 初心之让人人能写高性能网络服务器

    一直想做点有用的事,也一直想去遇见那个更好的你,有的时候明明已经出发了,打量湖中倒影,衬衣上好像还有一个皱皱,非得回去重新整理一翻.于是,如此往复,几度春秋,仍在原地打转.春风不识字,也常乱翻书.终于 ...

  2. SpringCloud快速入门(人生若只如初见,何事秋风悲画扇。等闲变却故人心,却道故人心易变。)

    目录 1.准备两个数据库 2.搭建父工程 3.测试 1.准备两个数据库 将两张表分别放入两个数据库 注:这里的sql是8版本的,如果是5.7的就把所有的COLLATE utf8mb4_0900_ai_ ...

  3. Swift语言快速入门

    Swift语言快速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著   ISBN 978-7-121-24328-8 201 ...

  4. TCP的ACK确认系列 — 快速确认

    主要内容:TCP的快速确认.TCP_QUICKACK选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 快速确认模式 (1) 进入快速确认模式 ...

  5. Bootstrap -- 初见 Bootstrap

    Bootstrap -- 初见 Bootstrap Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. ...

  6. 利用c#快速知道哪些qq好友空间屏蔽了自己

    大家好,我叫柠檬水,今天马上就要放假,突然想到自己以前的伙伴.同学,好像想到他们空间没怎么发过动态,难道是把我屏蔽了吗,好友又那么多,行吧,只能用c#写一个快速的知道哪些人屏蔽了自己. 首先我们整理逻 ...

  7. 快速了解元宇宙的 7 层产业链

    快速了解元宇宙的 7 层产业链 01 体验层--映射现实世界的生活场景 02 发现层--内容消费的关键领域 03 创作者经济层--共享及共创 04 空间计算层--实现无边界的关键技术 05 去中心化层 ...

  8. pmp中ram和raci的区别_还有10天了,如何快速通过PMP考试?

    三石老师,还有1个月考试,前面的课我都没听,书也没看,我还能过么? 三石老师,还有7天考试,我还没怎么看书,PMP考试能通过么? 三石老师,还有3天考试,怎么样才能过呢? 每次到考试前,都有很多学友在 ...

  9. 一键体验安全快捷外贸收款服务,PingPong福贸满足你的个性化需求

    目前,国内市场竞争压力大,"出海"成了当下中国各行各业的一个热词.从新能源汽车到游戏.电商.消费品.智能制造等,各个领域的大小公司几乎都在努力朝着出海的方向前进,以此寻求新的增长机 ...

  10. web快速入门之基础篇-html:2、基本标签之标题标签、段落标签、换行标签

    目录 一.前言 二.简单实例介绍 实例代码 运行效果 三.要点说明 1.h1到h6 标题标签 2.p 段落标签 3.br 换行标签[单标记] 一.前言 上一篇文章我整理以前上学的笔记是初见 html ...

最新文章

  1. NC:潮湿的墙体和家具中微生物迅速增长!
  2. 【总结】分类、聚类的评估指标
  3. (批量)备份github仓库到本地
  4. FCKeditor2.3 For PHP 详细整理的使用参考
  5. Problem B: 求各位数字之和
  6. 【Docker】Docker 启用 Kubernetes 报错 insecure-registries Must be host[ port] or CIDR
  7. Elasticsearch 并发修改乐观锁
  8. linux下rar-unrar命令使用
  9. 命令行查看硬盘序列号
  10. 单片机——DHT11 温湿度传感器
  11. 【业务安全03】密码找回业务安全
  12. MySQL完整笔记 总结
  13. html阅读是什意思,HTML是什么意思?什么是HTML5?什么是H5? | 前端面试题
  14. nginx多域名配置
  15. python和C++
  16. 【飞桨PaddleSpeech语音技术课程】— 语音合成
  17. BFS广度优先搜索算法//宽度优先搜索算法
  18. 郑大计算机专业英语第11章在线测试,郑大远程教育大学英语I 1-10章测试题
  19. 安装Linux平台Orion Health Rhapsody
  20. 100 的阶乘末尾有多少个0?

热门文章

  1. 是时候放弃循环神经网络了
  2. linux nano vim,修改ubuntu默认Nano编辑器为vim
  3. java中block标签_[Java教程]Clouda开发随笔之block标签
  4. 谈个人价值观与企业价值观(2014年收官之作,值得深思)
  5. java 日期格式化工具类
  6. 电脑小技巧:关于修复只能看无法拖…
  7. wmware虚拟网卡 VMnet8 VMnet1未识别网络解决方法
  8. 安装免费在线客服livezilla系统
  9. 使鼠标保持按住状态_程序猿、设计狮们的钟爱鼠标品牌,你知道是什么吗?
  10. markdown/LaTeX中在字母下方输入圆点的方法