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建立的过程

相关推荐
幻智星科技2 天前
多通道数据采集中collect_end信号的妙用
网络协议·架构·udp·硬件架构
2501_915106323 天前
跨平台抓包工具怎么选?TraceEagle抓包鹰 的四种跨平台能力
网络协议·计算机网络·网络安全·ios·adb·https·udp
Escalating_xu3 天前
【Linux 网络编程】传输层协议 UDP:从 8 字节首部到消息边界、缓冲区与 MTU
linux·网络·udp
码少女4 天前
Linux——UDP协议和TCP协议
linux·网络·udp·tcp
承渊政道5 天前
Linux网络学习【传输层协议UDP】
linux·网络·网络协议·学习·ubuntu·udp
幻智星科技5 天前
多通道数据采集DMA设计详解
fpga开发·udp·硬件架构
上海云盾-小余5 天前
TCP 洪水与 UDP 反射 DDoS 原理对比:流量放大机制与检测逻辑详解
tcp/ip·udp·ddos
华允物联-HUAIOT5 天前
DTU 和 LoRa 模块有什么区别?工业无线回传怎么选
网络·tcp/ip·udp
2501_915909067 天前
抓包工具断点拦截是什么?如何半路拦截修改 HTTP 请求
网络协议·计算机网络·网络安全·adb·https·udp
91刘仁德8 天前
计算机网络核心协议全解析:从MAC帧到HTTP
linux·网络·网络协议·tcp/ip·计算机网络·http·udp