大雪深埋_C++头像
关注
udp服务器聊天版本封面图

udp服务器聊天版本

在这里插入图片描述
在服务器端将客户端管理起来,这样在收到数据时,决策是否增加/删除/查找/修改用户等
登录用什么标识用户的唯一性呢?如果需要登录注册,涉及到协议,暂且使用IP+端口号来唯一标识用户

对用户进行管理,一般先定义用户,但是比较复杂,要订协议,用户进行注册设置用户名和密码,登录的时候要确认,今 天从简,把InetAddr看作用户

在这里插入图片描述
新用户来的时候,如何处理?要通过查找看到用户列表是否有该用户,涉及到查,如果没有,进行插入,重新启动ip和端口号可能发生变化,涉及到改,也可能下线,删除

那如何管理呢?如果使用unordered_map,使用ip+port作为键,值是InetAddr,在插入的时候,使用InetAddr提供的方法toString获取键来进行比较
插入
在这里插入图片描述

在这里插入图片描述
但是也可以重载InetAddr的==符号,直接进行比较,使用vector进行管理即可

对用户进行管理,UserManager.hpp

在这里插入图片描述
上面UdpServer.hpp进行网络收发数据,InetAddr.hpp对用户进行描述,UserManager.hpp对用户进行组织,现在用户和网络数据还是分离的,需要将二者联系起来,使用Route.hpp对网络来的用户进行插入和删除离开网络的用户,进行广播数据等,因为用户列表是临界资源,可能并行进行增删查改,所以进行保护,其实Route这个类还是对于用户列表的再一次封装,使得UserManager对于用户列表的增删查改更为纯粹,加锁等操作都在Route完成

广播的时候,其实Route可以加一个队列成员,把需要广播的消息push到队列中,广播的时候直接从队列中取消息进行广播
在这里插入图片描述

在这里插入图片描述
并发版本
在这里插入图片描述

在这里插入图片描述
首先上面的客户端1发送aaa,但下面的客户端2还没入网,所以只会转发给客户端1消息aaa,接着客户端2发送bbb,入网,收到转发回来的bbb,接着客户端1发送ccc,并且接收之前发过来的bbb
在这里插入图片描述
问题:
1.只有给服务端发消息才能收消息,因为客户端是阻塞式发送,但实际上,不发消息应该也能收
2.客户端1发送ccc,没有立马收到ccc,因为接收之前的bbb,消息延迟

上面==时采用ip+port,如果只比较ip,那就是一台机器只能充当一个客户端

虽然多线程,但只有一个xshell
qt或图形化界面,每一个界面靠一个线程,不同的消息往不同的显示器上显示

把客户端改成多线程,主线程做控制,两个从线程分别负责收和发,收的输出到文件描述符2
在这里插入图片描述
将标准错误重定向到管道
在这里插入图片描述
上面分不清那句话是谁说的,而且启动客户端,不说话就没办法收消息
所以启动之后,先设置昵称,来区分消息,并且启动之后主动向服务器发送消息
在这里插入图片描述

在这里插入图片描述
简单的实现就到这里了,可以静态编译生成client_chat,发送到其它机器,通过xshell或者虚拟机运行,./client_chat 客户端的ip 客户端的port,就可以进行聊天了

qt windows启动多线程,简单聊天系统,登录注册自己加
udp 网络抖动,丢包
聊天用udp做简单,但做好不简单
没有登录注册,ip+port作为标识,
Route内定义一个全局/静态变量,64位,从1k/w开始,每注册一个就返回一个数字,类似qq号,用户入网,怎么下线,如果用户退出,在转发消息的时候,检测到quit类字眼,就从用户列表移除该用户,涉及更复杂的判断
转发的时候加锁,但是网络IO耗时,先把用户列表拷贝一份,进行IO
在这里插入图片描述
在这里插入图片描述

多线程这两个函数可能线程不安全
在这里插入图片描述
整体代码量有些大,因为对套接字不是很熟悉,不了解原理,感觉信息量大,把系统部分整合揉在一起,1000多行,udp和tcp套接字,创建过程就是套路,该创建,绑定,监听,链接,都是固定的,感觉陌生是因为用的少,陌生,用的多了,套接字创建流程固定,创建套接字逻辑使用设计模式模板化,正在学接口,从0到1建立的过程

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/m0_74328241/article/details/163957375

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--