[netplus]初见,Netplus快速开始之PingPong Example
继上篇 初心之让人人能写高性能服务器 已一星期,我们仍尚未谋面,我已迫不及待,是否还记得我曾经对你的承诺,我说,要让人人能编写高性能网络服务器,当然,这只是我一相情愿的告白,我不知道有没有被你看上,也不知道你是否还愿意在这条道上与我走一走,我们一起谈一谈,未来…
看起来这是一个梦啊,梦是当不得真的,但梦想还是可以做做的。
在这所有的所有的一切开始之前,我们还是不落俗套地见上一见吧,你说,自古套路得人心,而大家又总倾心于Hello World,要不,我们换一个,Ping Pong可好。
请你忘记你关于网络编程的想象,保留那么一点点CPP的印象,因为,好的忘记,是新的开始,而CPP正是我们的主角。
要懂东西的不多,我们就从最基本的问题开始吧。
[备注:此篇为初稿,期待你的反馈]
在开始之前,建议先阅读以下前置知识:
- 基本问题:什么是信息,何为传递,连接
- Netplus试图解决什么问题
- Netplus里的基本概念
- Netplus收发消息的基本流程
- c++11: std::tuple example & tutorial
- c++11: lambda example & tutorial
PINGPONG Example
本篇,我们将演示如何实现一个完整版的PingPong服务器,以及客户端。
读完本文,你应该能用Netplus进行简单消息收发。
1. PINGPONG服务器
- 监听在tcp://127.0.0.1:13103端口
- 收到到来自远端的的连接的时候,为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客户端
- 拨号到tcp://127.0.0.1:13103端口
- 当拨号成功之后,为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的总体执行逻辑
- 服务器监听tcp://127.0.0.1:13103
- 当服务器有新的channel连接进来时,为新的channel添加handler
- 客户端拨号到tcp://127.0.0.1:13103
- 客户端拨号成功后,添加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: hlengithub.com
5.3 ch->pipeline()->add_last( handler )
将handler添加到handler链表末尾
(此篇文章待进一步整理)
完整的工程地址如下:
Netplus 之 PINGPONG工程github.com
知识库:
Netplus之WIKIgithub.com
如果你喜欢我的文章,请加个关注,点个赞,谢谢。
写代码的冰冰
姑苏城里平江路,入夜细雨扰我心,再会。
想把我说给你听,,,
[netplus]初见,Netplus快速开始之PingPong Example相关推荐
- [netplus] 初心之让人人能写高性能网络服务器
一直想做点有用的事,也一直想去遇见那个更好的你,有的时候明明已经出发了,打量湖中倒影,衬衣上好像还有一个皱皱,非得回去重新整理一翻.于是,如此往复,几度春秋,仍在原地打转.春风不识字,也常乱翻书.终于 ...
- SpringCloud快速入门(人生若只如初见,何事秋风悲画扇。等闲变却故人心,却道故人心易变。)
目录 1.准备两个数据库 2.搭建父工程 3.测试 1.准备两个数据库 将两张表分别放入两个数据库 注:这里的sql是8版本的,如果是5.7的就把所有的COLLATE utf8mb4_0900_ai_ ...
- Swift语言快速入门
Swift语言快速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著 ISBN 978-7-121-24328-8 201 ...
- TCP的ACK确认系列 — 快速确认
主要内容:TCP的快速确认.TCP_QUICKACK选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 快速确认模式 (1) 进入快速确认模式 ...
- Bootstrap -- 初见 Bootstrap
Bootstrap -- 初见 Bootstrap Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. ...
- 利用c#快速知道哪些qq好友空间屏蔽了自己
大家好,我叫柠檬水,今天马上就要放假,突然想到自己以前的伙伴.同学,好像想到他们空间没怎么发过动态,难道是把我屏蔽了吗,好友又那么多,行吧,只能用c#写一个快速的知道哪些人屏蔽了自己. 首先我们整理逻 ...
- 快速了解元宇宙的 7 层产业链
快速了解元宇宙的 7 层产业链 01 体验层--映射现实世界的生活场景 02 发现层--内容消费的关键领域 03 创作者经济层--共享及共创 04 空间计算层--实现无边界的关键技术 05 去中心化层 ...
- pmp中ram和raci的区别_还有10天了,如何快速通过PMP考试?
三石老师,还有1个月考试,前面的课我都没听,书也没看,我还能过么? 三石老师,还有7天考试,我还没怎么看书,PMP考试能通过么? 三石老师,还有3天考试,怎么样才能过呢? 每次到考试前,都有很多学友在 ...
- 一键体验安全快捷外贸收款服务,PingPong福贸满足你的个性化需求
目前,国内市场竞争压力大,"出海"成了当下中国各行各业的一个热词.从新能源汽车到游戏.电商.消费品.智能制造等,各个领域的大小公司几乎都在努力朝着出海的方向前进,以此寻求新的增长机 ...
- web快速入门之基础篇-html:2、基本标签之标题标签、段落标签、换行标签
目录 一.前言 二.简单实例介绍 实例代码 运行效果 三.要点说明 1.h1到h6 标题标签 2.p 段落标签 3.br 换行标签[单标记] 一.前言 上一篇文章我整理以前上学的笔记是初见 html ...
最新文章
- NC:潮湿的墙体和家具中微生物迅速增长!
- 【总结】分类、聚类的评估指标
- (批量)备份github仓库到本地
- FCKeditor2.3 For PHP 详细整理的使用参考
- Problem B: 求各位数字之和
- 【Docker】Docker 启用 Kubernetes 报错 insecure-registries Must be host[ port] or CIDR
- Elasticsearch 并发修改乐观锁
- linux下rar-unrar命令使用
- 命令行查看硬盘序列号
- 单片机——DHT11 温湿度传感器
- 【业务安全03】密码找回业务安全
- MySQL完整笔记 总结
- html阅读是什意思,HTML是什么意思?什么是HTML5?什么是H5? | 前端面试题
- nginx多域名配置
- python和C++
- 【飞桨PaddleSpeech语音技术课程】— 语音合成
- BFS广度优先搜索算法//宽度优先搜索算法
- 郑大计算机专业英语第11章在线测试,郑大远程教育大学英语I 1-10章测试题
- 安装Linux平台Orion Health Rhapsody
- 100 的阶乘末尾有多少个0?
热门文章
- 是时候放弃循环神经网络了
- linux nano vim,修改ubuntu默认Nano编辑器为vim
- java中block标签_[Java教程]Clouda开发随笔之block标签
- 谈个人价值观与企业价值观(2014年收官之作,值得深思)
- java 日期格式化工具类
- 电脑小技巧:关于修复只能看无法拖…
- wmware虚拟网卡 VMnet8 VMnet1未识别网络解决方法
- 安装免费在线客服livezilla系统
- 使鼠标保持按住状态_程序猿、设计狮们的钟爱鼠标品牌,你知道是什么吗?
- markdown/LaTeX中在字母下方输入圆点的方法