| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> c++项目——聊天室——第一节 -> 正文阅读 |
|
[网络协议]c++项目——聊天室——第一节 |
c++项目——聊天室——第一节概述???????本节内容是在 如何学习编程 之后进一步由理论结合实践去验证和加深该学习思想,为了方便起见,不会再过多的阐述先验知识,因此若是在阅读过程中出现因先验知识不足而导致的难以理解的情况,请自行学习相关的先验知识。 ???????因为c++这门语言学习起来总有一定的难度,除了语言本身的原因以外,由于学的人相对较少,学精通的人更少,导致在推广方面,无论是人数还是质量都难以保证。 ???????自己在刚开始学c++的时候,出现过很多问题,影响最大的还是以下几点:
???????所以除了有借此加深巩固自己之前所学以外,也希望自己的文章可以帮助到更多的c++小白,让越来越多的人喜欢上c++,愿c++经久不衰。 引言???????再次声明,本篇文章是让小白过渡到初学者的文章,因为本人也是初学者,所以掌握的知识的全面程度和深度肯定是有限的,但学习本身就是不断的扩宽自己的广度和深度,所以这很正常。就如同牛顿力学过度到量子力学一样,牛顿力学没有错,量子力学也没有错,只是适用范围不同罢了,或者说量子力学的适用范围更大,但不管怎么说,能在一定范围内正确解释世界规律的,我觉得就是好理论。 ???????先验知识声明:在进入聊天室的学习之前,必须要有一定的c++基础知识和计算机相关的基础知识,没有这些基础,什么牛鬼蛇神来了都没有,就算是所谓的“天才、聪明人”,也只是通过类比的方式,结合他自己之前类似的经历推出来的(我对天才这个词很反感,我觉得就是骗骗世人,给人们找借口的词汇,如有不适敬请见谅),所以如果没有掌握这些知识,你看起来无比难受是很正常的事情。 ??????? 细心的同学可能发现了,为啥我没有把c++多线程标记为必会呢?因为我们这个聊天室是一个循序渐进的版本,因此如果没到后面多线程的版本,不需要掌握c++多线程基础当然也可以驾驭。 聊天室初步????? 1 总体设计??????? 正所谓:兵马未动,粮草先行;理论是用来更好指导实践的。有一个好的架构体系,或者说在设计之初就考虑好很多东西的话,对后面无论是出问题还是迭代肯定都会更好解决。(可以结合 如何学习编程 提到的守恒思想去分析)。 ??????? 无论是设计和分析问题,首先要把握的就是他的核心,用哲学的话来说就是:把握事物的主要矛盾。其实也就是把握事物的本质。 ??????? 聊天室聊天室,核心肯定是提供一个较为舒适的聊天服务。把握本质以后,接下来我们做的事情是什么?——计算机分治思想,或者简单点说,把问题分解。 ??????? 回到正题,那么我们该如何把问题分解呢——剪取不重要细节。借鉴或者类比之前吃饭的例子,舒适的聊天室,本质上就是多人之间进行聊天,那我们先分析两个人的情况,也先不管舒不舒适的问题,那现在的问题就变成了——两个人的聊天室。 ??????? 到这,我们的1.0版本的聊天室已经逐渐浮出水面了:A同学和中转站建立连接,之后向中转站建立连接;B同学和中转站也建立连接,接受中转站发送过来A的消息。 ????? 2 思路设计??????? 下面我们就来逐步分析服务器和客户端都是怎么设计的。 ??????? 1 客户端。客户端由两个方面组成:接收客户输入并把消息发送给服务器 和 接收由服务器发送给客户端的消息。还是一样,继续分解问题:先考虑接收客户输入并把消息发送给服务器怎么做?接受客户输入:可以用cin的getline接收,并把消息放到一个队列里;把消息发送给服务器:借助c++asio网络提供的api即可。再来看服务器发送给客户端的消息怎么做?服务器发送给客户端的数据通过网络传输最开始肯定是发到网卡上,但是对网卡的操作也太底层了,因此借助c++asio网络库——借助asio网络库的api接收服务端信息,并用队列放到内存,并用cout输出即可。即:
??????? 2 服务器。服务器也是由两个部分组成:接收客户端消息 和 将聊天室消息发送给客户端。因为和客户端有点类似,这里直接给出结论,即:
????? 3 数据结构设计(细节设计)???????上面的设计内容部分算是结束了,但具体如何去设计类和数据结构还有待商榷。 ???????(1)分析消息协议部分???????还是一样,将分治的思想融入进来,无论是客户端还是服务器,最先要解决的,就是双方要统一消息的格式,也就是我们常说的协议。 ???????因此我们设计一个chat_message类,用于存放消息,同时规定:消息结构是 消息头部 + 消息体的形式。消息头部存放了消息体的长度和消息类型(比如是客户端发送给服务器聊天的消息还是服务器发给客户端的消息),而且是定长的,这样就可以通过头部去处理消息体的内容。
???????(2)分析客户端???????之后分析客户端,cin的getline接收用户输入,同时还要有一个队列,简单表示就是:
下面是chat_client的表示:
再分析一下要有什么函数: 因此类可以表示为:
???????(3)分析服务器???????服务器除了要和客户端连接chat_server,还要有一个聊天室chat_room接收消息,但是在广播消息的时候,需要向每个客户端都发消息,因此用chat_session表示接入进来的客户端,简单表示如下:
再分析一下需要有什么样的函数: 更完整的类声明如下:
当然,因为要结合c++的asio库,所以声明肯定还要更复杂一些,但那都是asio的东西,把握了这主体的东西对我们的编程来说就足够了。 聊天室1.0下面来看看聊天室1.0的内容: 一共分为5个文件: 至此完成的就是asio的例子程序完成的内容。不过虽然功能一样,但是我们把消息变成了type进行了一个小改动,这样让我们的可扩展性就提升了一些,我们在此基础上加入客户端可以发送“绑定名字”的消息。 当然代码很简单,完整代码我把它放到了github上,后续我们会逐渐对他进行更新和迭代,在循序渐进中慢慢感受理论与实践相结合的乐趣。 聊天室1.0 github地址:参考文献1 b站课程 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:00:07- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |