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

相关推荐
疯狂打码的少年9 小时前
【计算机网络】UDP协议与TCP/UDP对比(面向连接vs无连接)
笔记·tcp/ip·计算机网络·udp
Riwuarua1 天前
从近似0基础开始FPGA开发 -- part.10 verilog-ethernet开源UDP协议栈工程学习
fpga开发·udp·开源
游戏开发爱好者82 天前
网络连接排查指南,谁在电脑后台偷跑流量,哪些程序在联网
网络协议·计算机网络·网络安全·ios·adb·https·udp
盛世宏博智慧档案3 天前
以太网温湿度传感器 TCP/IP、UDP、SNMP 协议怎么选?区别详细分析
单片机·tcp/ip·udp·以太网温湿度传感器
Da Da 泓3 天前
UDP和TCP中的网络编程
网络·tcp/ip·udp·java-ee
xiaoye-duck4 天前
《Linux 网络编程》深入传输层 UDP 协议原理:端口、报文、缓冲区与内核源码解析
linux·网络·udp
2501_915921435 天前
抓包工具对比:Charles、TraceEagle、Wireshark、Fiddler 与 Proxyman
网络协议·计算机网络·网络安全·ios·adb·https·udp
呆呆敲代码的小Y6 天前
TCP / UDP 对比介绍
网络·网络协议·tcp/ip·udp·tcp·tcp/udp
吹什么轩6 天前
linux网络:UDP原理
linux·网络·udp
Polevne6 天前
C# 上位机UDP/TCP连接外部设备
网络·tcp/ip·udp