《即时聊天程序设计.ppt》由会员分享,可在线阅读,更多相关《即时聊天程序设计.ppt(25页珍藏版)》请在三一办公上搜索。
1、第十一章基于Linux即时聊天程序设计(练习题,仅供参考),主讲人:欧忠良,本章目标,作为Linux高级阶段一个练习,让学员从实践中掌握课程知识点。实现即时聊天工具的设计思路群聊的设计思路私聊的设计思路文件传输的实现思路安全的共享内存管理方案,功能需求,技术平台:运行平台:Linux开发工具:vi/gcc/gdb/makefile软件功能客户端登陆群聊私聊文件传输*,技术知识点准备,掌握Linux编程工具gcc/gdb/makefile掌握Linux多进程技术的使用掌握在System V下的IPC技术:信号、消息队列、共享内存等等掌握Linux下TCP SOCKET 编程技术,程序框架,客户端
2、说明,tty进程从控制终端获取用户的输入,并以管道的形式传递给socket io进程进行发送Socket IO进程负责读入管道数据即得到用户的输入,并通过socket按照自定义协议发送。负责读取socket,并分析和处理数据包,并显示。当发现网络中断的情况下,发送信号给tty进程,让其退出。,服务器端说明(1),监听进程以IO复用模型,创建服务器监听,等待客户端连入;当接收到客户端的连接请求后,添加客户信息clientinfo到共享内存区,并fork一个socket io进程负责数据端口的读写Socket IO进程负责从socket中读取数据包,并送到接收缓冲队列中mqRecv(其中消息结构m
3、essageType=getpid())负责从mqSend缓冲消息队列中,读取messagetype=getpid()的消息数据,并将数据包发送出去。,服务器说明(2),接收缓冲由消息队列实现,SOCKET IO进程读取到数据都送入这个队列,处理进程从该队列中读取数据包进行相应处理发送缓冲由消息队列实现,处理进程处理后要发送给各客户端数据都送入这个队列,SOCKET IO进程从该队列中读取数据包按照自定义协议发送出去处理进程根据包类型,进行相关的处理客户信息列表以共享内存实现,详见共享内存管理方案和信息结构,自定义协议/数据包格式,typedef struct data_packet unsi
4、gned char ucPackType;/0:群聊 1:私聊 2:登陆 3:在线列表包char acLoginName10;/送出数据包的客户端登录名char acDstName10;/数据包送达的客户端名char acData80;/聊天数据DATAPACKHEAD;/数据包说明,当ucPackType如下时:0:acDstName为空1:acDstName,acLoginName不能为空2:acDstName,acLoginName为空,acData为登录名3:服务器端的应答包,acDstName,acLoginName为空acData的格式:loginname1;loginname2;
5、,接收/发送缓冲消息结构,typedef struct mymessageunsigned long int nMessageType;DATAPACK stDP;说明:被送进发送缓冲的消息:nMessageType等于socket io进程ID,以便各个socket io进程从发送缓冲中得到各自要发送的数据,客户端信息结构数据,struct stClientInfopid_t nClientPid;/负责读写端口的进程 char acLoginName30;/客户端的登录名,共享内存管理方案,Stack方案先进后出位图索引bitmap方案第一块内存块作为索引块索引块中每一位代表相应位置内存块
6、的状态:“1”表示在用,“0”表示空闲Hash管理方案详细介绍,注意:多进程访问同步,Hash管理方案,struct stShmBlockint nBlockId;/块编号void*pvBlockBp;/块基址int nBlockSize;/块大小sem_t semId;/控制该block的信号量unsigned char status;/该block的状态,void*apBlockMAX_SIZE,共享内存管理封装(1),int SHM_create(int nMemSize);功能:向Linux内核申请一片共享内存区参数:nMemSize共享内存大小返回值:0表示成功,且返回semid;0
7、:写入成功的字节数;-1:写入失败,共享内存管理封装(2),int SHM_read(shm_t shmid,void*pvUserData,int nDataLen);功能:从共享内存中读取一块数据到用户空间来参数:shmid共享内存块;pvUserData用来存放数据的区域;nDataLen读取长度返回值:0:读取的字节数;0:失败void SHM_destroy(shm_t shmid);功能:释放共享内存区参数:shmid共享内存块返回值:无,登陆流程,群聊流程设计,私聊设计流程,大并发网络通信程序,高并发解决方案高负载时性能解决方案系统稳定性数据安全性交易可靠性,高并发/接入,1、借
8、助Linux2.6内核实现的框架Epoll等2、通过多进程技术突破Linux单进程内1024个文件描述符的限制,高负载/性能,良好的程序框架进程改成线程来处理socket io线程可以根据并发io情况,启动相应数量的IO线程来读写处理线程可以根据接收缓冲的未处理数,来启动相应数量的处理线程来处理引入线程池的机制引入高性能的内存管理方案重新封装SOCKET,成库后以便于后面项目使用,数据安全,网络安全存储安全传输安全将目前固定长度包改成可变长度数据包结构,引入包头包体机制,节约网络带宽使用加入数据包验证或关键字段加密的机制,交易可靠性,交易时要保证一应一答(有请求必有应答),应考虑如下的情况:T发送成功,但S未收到T发送成功,S收到,但E超时或未返回T发送成功,S收到,交易返回,但此时线路中断T发送成功,S收到,交易返回,应答成功,但T未收到.,还需考虑的异常情况,异常流程1、服务器或客户端异常关闭2、网络线路中断,CS两端的处理机制3、“连接”中断或网络中断的侦测机制4、粘包和半包处理机制5、包完整性检测6、数据包交互可靠性7、,请大家关注续集,1、网络通信框架组件设计2、基于Linux大并发网络通信程序设计与实现,