在服务器端将客户端管理起来这样在收到数据时决策是否增加/删除/查找/修改用户等登录用什么标识用户的唯一性呢如果需要登录注册涉及到协议暂且使用IP端口号来唯一标识用户对用户进行管理一般先定义用户但是比较复杂要订协议用户进行注册设置用户名和密码登录的时候要确认今 天从简把InetAddr看作用户新用户来的时候如何处理要通过查找看到用户列表是否有该用户涉及到查如果没有进行插入重新启动ip和端口号可能发生变化涉及到改也可能下线删除那如何管理呢如果使用unordered_map使用ipport作为键值是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消息延迟上面时采用ipport如果只比较ip那就是一台机器只能充当一个客户端虽然多线程但只有一个xshellqt或图形化界面每一个界面靠一个线程不同的消息往不同的显示器上显示把客户端改成多线程主线程做控制两个从线程分别负责收和发收的输出到文件描述符2将标准错误重定向到管道上面分不清那句话是谁说的而且启动客户端不说话就没办法收消息所以启动之后先设置昵称来区分消息并且启动之后主动向服务器发送消息简单的实现就到这里了可以静态编译生成client_chat发送到其它机器通过xshell或者虚拟机运行./client_chat 客户端的ip 客户端的port就可以进行聊天了qt windows启动多线程简单聊天系统登录注册自己加udp 网络抖动丢包聊天用udp做简单但做好不简单没有登录注册ipport作为标识Route内定义一个全局/静态变量64位从1k/w开始每注册一个就返回一个数字类似qq号用户入网怎么下线如果用户退出在转发消息的时候检测到quit类字眼就从用户列表移除该用户涉及更复杂的判断转发的时候加锁但是网络IO耗时先把用户列表拷贝一份进行IO多线程这两个函数可能线程不安全整体代码量有些大因为对套接字不是很熟悉不了解原理感觉信息量大把系统部分整合揉在一起1000多行udp和tcp套接字创建过程就是套路该创建绑定监听链接都是固定的感觉陌生是因为用的少陌生用的多了套接字创建流程固定创建套接字逻辑使用设计模式模板化正在学接口从0到1建立的过程