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

相关推荐
xiaoye-duck12 小时前
《Linux网络编程》UDP Socket 编程实战:从 Echo 回显、通用字典服务到套接字封装全流程
linux·网络·udp
Zguigo1 天前
lesson37-39计算机网络核心概念精讲:从路由器到UDP的实战与备考指南
计算机网络·udp·智能路由器
游戏开发爱好者83 天前
WebSocket 抓包怎么查看内容?从握手到消息帧完整解读
网络协议·计算机网络·网络安全·ios·adb·https·udp
阿钱真强道3 天前
06 极物科技 | 创明RS485窗帘 - UDP 通讯协议规范
udp·智能家居·通讯协议·极物·极物智能·极物科技·创明窗帘
eggrall3 天前
Socket编程UDP
网络协议·udp·php
00后程序员张4 天前
SSL Pinning 抓包抓不到明文?绕过证书固定的几种方案
网络协议·计算机网络·网络安全·ios·adb·https·udp
2301_777998344 天前
Linux网络:UDP 网络编程
linux·网络·网络协议·udp
阿pin5 天前
TCP VS UDP
网络协议·tcp/ip·udp
佳児素花痴╮5 天前
UDP编程与网络通信
网络·网络协议·udp