转自实验楼教程:C++实现即时通信软件

1 知识储备

1.1 C/S模型

服务器端:

  1. socket()创建监听Socket
  2. bind()绑定服务器端口
  3. listen()监听客户端连接
  4. accept()接受连接
  5. recv/send接收及发送数据
  6. close()关闭socket

客户端:

  1. socket()创建监听Socket
  2. connect()连接服务器
  3. recv/send接收及发送数据
  4. close()关闭socket

1.2 TCP服务端通信的常规步骤

  1. 使用socket()创建TCP套接字(socket)
  2. 将创建的套接字绑定到一个本地地址和端口上(Bind)
  3. 将套接字设为监听模式,准备接收客户端请求(listen)
  4. 等待客户请求到来: 当请求到来后,接受连接请求,返回一个对应于此次连接的新的套接字(accept)
  5. 用accept返回的套接字和客户端进行通信(使用write()/send()或send()/recv() )
  6. 返回,等待另一个客户请求
  7. 关闭套接字

1.3 TCP客户端通信的常规步骤

  1. 创建套接字(socket)
  2. 使用connect()建立到达服务器的连接(connect)
  3. 客户端进行通信(使用write()/send()或send()/recv())
  4. 使用close()关闭客户连接

1.4 阻塞与非阻塞socket

通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞与非阻塞方式。

  1. 阻塞方式是指: 当试图对该文件描述符进行读写时,如果当时没有数据可读,或者暂时不可写,程序就进入等待状态,直到有东西可读或者可写为止。
  2. 非阻塞方式是指: 如果没有数据可读,或者不可写,读写函数马上返回,而不会等待。

举个例子来说,比如说小明去找一个女神聊天,女神却不在。如果小明舍不得走,只能在女神大门口死等着,当然小明可以休息。当女神来了,她会把你唤醒(囧,因为挡着她门了),这就是阻塞方式。如果小明发现女神不在,立即离开,以后每隔十分钟回来看一下(采用轮询方式),不在的话仍然立即离开,这就是非阻塞方式,在他离开的十分钟内可以干别的事情。

1.5 epoll

当服务端的在线人数越来越多,会导致系统资源吃紧,I/O效率越来越慢,这时候就应该考虑epoll了。epoll是Linux内核为处理大批句柄而作改进的poll,是Linux特有的I/O函数。其特点如下:

  1. epoll是Linux下多路复用IO接口select/poll的增强版本。其实现和使用方式与select/poll有很多不同,epoll通过一组函数来完成有关任务,而不是一个函数。
  2. epoll之所以高效,是因为epoll将用户关心的文件描述符放到内核里的一个事件表中,而不是像select/poll每次调用都需要重复传入文件描述符集或事件集。比如当一个事件发生(比如说读事件),epoll无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入就绪队列的描述符集合就行了。
  3. epoll有两种工作方式,LT(level triggered):水平触发和ET(edge-triggered):边沿触发。LT是select/poll使用的触发方式,比较低效;而ET是epoll的高速工作方式(本项目使用epoll的ET方式)。

通俗理解就是,比如说有一堆女孩,有的很漂亮,有的很凤姐。现在你想找漂亮的女孩聊天,LT就是你需要把这一堆女孩全都看一遍,才可以找到其中的漂亮的(就绪事件);而ET是你的小弟(内核)将N个漂亮的女孩编号告诉你,你直接去看就好,所以epoll很高效。另外,还记得小明找女神聊天的例子吗?采用非阻塞方式,小明还需要每隔十分钟回来看一下(select);如果小明有小弟(内核)帮他守在大门口,女神回来了,小弟会主动打电话,告诉小明女神回来了,快来处理吧!这就是epoll。

2 需求分析

最简单聊天室的群聊,线程池、多线程编程、超时重传确认收包等都不涉及,考虑有两个以下程序

  1. 服务器:能接受新的客户端的连接,并将每个客户端发过来的消息发给所有其他的客户端
  2. 客户端:能够连接服务器,并向服务器发送消息,同时接收服务器发过来的任何消息

3 抽象与细化

需求中的角色非常简单,同时功能也很简单,所以我们只需要根据功能角色设计客户端类和服务端类。

其中客户端类我们需要支持下面几个功能:

  1. 连接服务器
  2. 支持用户输入聊天消息,发送消息给服务器
  3. 接收并显示服务器的消息
  4. 退出连接

针对上述需求,客户端的实现需要两个进程分别支持下面的功能:

子进程的功能:

  1. 等待用户输入聊天信息
  2. 将聊天信息写到管道(pipe),并发送给父进程

父进程的功能:

  1. 使用epoll机制接受服务端发来的信息,并显示给用户,使用户看到其他用户的聊天信息
  2. 将子进程发给的聊天信息从管道(pipe)中读取, 并发送给服务端

服务端类需要支持:

  1. 支持多个客户端接入,实现聊天室基本功能
  2. 启动服务建立监听端口等待客户端连接
  3. 使用epoll机制实现并发,增加效率
  4. 客户端连接时发送欢迎消息并存储连接记录
  5. 客户端发送消息时广播给其他所有客户端
  6. 客户端请求退出时对连接信息进行清理

4 代码结构

  1. Common.h:公共头文件,包含所需的所有宏定义及socket网络编程头文件
  2. Client.h, Client.cpp:客户端类实现。
  3. Server.h,Server.cpp:服务端类实现。
  4. ClientMain.cpp ServerMain.cpp:客户端及服务端的主函数。

5 实现

  1. Common.h
  2. Client.h
  3. Client.cpp
  4. Server.h
  5. Server.cpp
  6. ClientMain.cpp
  7. ServerMain.cpp

C++实现及时通信软件相关推荐

  1. 和java通信_[源码和文档分享]基于JAVA的即时通信软件

    一.设计任务书 1.1 设计任务 本文设计的是一个简单的即时通信软件,利用 Java Socket 进行点到点通信,其工作机制模仿即时通信软件的基本功能,已实现的功能有:客户端登录 客户端退出 群组成 ...

  2. [源码和文档分享]基于JAVA的即时通信软件

    一.设计任务书 1.1 设计任务 本文设计的是一个简单的即时通信软件,利用 Java Socket 进行点到点通信,其工作机制模仿即时通信软件的基本功能,已实现的功能有: 客户端登录 客户端退出 群组 ...

  3. 即时通信软件开发的年轻开发者曾注意到

    微软"迷失"的十年,已成为美国企业发展史上最大的谜团之一.为了解其中缘由,曾两次获得乔治·波尔卡新闻奖(George Polk Award)的美国知名记者.最近刚刚担任<名利 ...

  4. 计算机网络课程设计即时通讯,计算机网络课程设计报告-基于LAN的即时通信软件.doc...

    一.概述 1.1 设计目的: 利用MFC编程实现客户端之间通过服务器进行通信. 1.2 设计内容: 网络通信软件的数据通信是通过网络套接字进行的.根据该原理,其编程步骤应分为创建套接字.在套接字上进行 ...

  5. 科聊——即时通信软件原型设计

    原型展示地址:科聊 原型设计工具:墨刀 运行环境:Android,Web浏览器(Chrome测试) 安卓下载: 说明:产品原型是整个产品面市之前的一个框架设计,本产品原型对框架结构做出了基本搭建,未注 ...

  6. UART串口通信软件推荐

    UART串口通信软件推荐 在我们调试单片机的时候,经常用到UART串口通信(没有足够的资金购入LCD屏.OLED屏等显示器件).市面上这么多的串口调试软件实在是让人无从下手,下面安利3款串口调试软件, ...

  7. C语言项目(四)——基于Linux系统下的带有GUI界面的即时通信软件

    二十一.TCP是如何保证可靠数据传输的? TCP提供一种面向连接的.可靠的字节流服务. 面向连接:意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接.在 ...

  8. 基于Java的实时通信软件的设计(类似微信)

    随着互联网和通讯技术的高速发展,用户对于交友软件的需求日益增长.为了满足当下市场对交友软件的需求,提升交友体验,本文提出基于Java开发的即时通讯软件. 本系统的客户端和服务器端都是基于Java语言开 ...

  9. JQ局域网通信软件(C/S)

    面向局域网内的C/S通信软件 基本是模仿QQ来做的,实现了大部分的聊天功能,图片和文件传输由于时间关系还没有完成.打算做个独立的文件传输软件练习下.以后再合并. 下载地址http://download ...

  10. 局域网通信软件 飞鸽传书

    飞鸽传书是一个局域网通信软件,支持局域网间发信息.传送文件.文件夹.多文件(或文件夹),速度非常快.有了飞鸽传书,局域网间传送文件不必再共享来共享去的了.而且,该软件极度绿色哦:单个执行文件,完全与注 ...

最新文章

  1. idea Debug快捷键
  2. 【Bootloader】探究bootloader,分析u-boot源码
  3. SQL Server性能调优入门(图文版)
  4. spring之java配置(springboot推荐的配置方式)
  5. 潍坊理工的计算机专业怎么样,潍坊理工学院教育学专业怎么样
  6. 杭电4520小Q系列故事——最佳裁判
  7. 烂泥:centos6.4服务器添加新硬盘
  8. python空白处错误,python中的空错误消息
  9. php7 电子书 下载,PHP 7: Real World Application Development
  10. Dell’Oro 5年期数据中心报告预测25G/100G端口速率市场快速上升
  11. 前端进阶之路-利用Jenkins快速打造前端项目自动化工作流
  12. python 输出 2到n的素数 附源码 注释超详细。。。
  13. WPS Office 2016 专业增强精简版 附终身授权正版序列号
  14. 聚类分析入门(理论)
  15. Mybatis时区问题
  16. 计算机启用来宾用户,win10怎么启用来宾账户_win10启用guest来宾账户的教程
  17. 【硬件深似海】磁珠选型规范
  18. 小丑改造计划之复习一
  19. Nginx --sendfile配置
  20. Python 协议攻击脚本(六): STP攻击

热门文章

  1. Java 递归取Children
  2. 第一篇 厚黑学 代序三 赤诚相见之独尊
  3. java如何开发生产派工报工_工序报工
  4. 沉浸式健身,是消费者的伪命题还是资本的好生意?
  5. 计算机硬盘换,电脑硬盘更换步骤
  6. 未能启动环境模拟器服务器,exagear启动环境失败 游戏电脑问题解决分享!
  7. Android 百度地图 简单实现--- 美食搜索
  8. R9000P日常使用卡死自动重启的解决办法
  9. python3+selenium如何正确驱动360浏览器打开网页
  10. 如何将Excel一行转成一列