当前位置: 首页 > news >正文

计算机网络:聊天室(UDP)

一、预期结果

        多个用户可以一起聊天,当用户加入/退出聊天室,聊天室每个成员都可以看到加入/退出用户的信息。

二、实现思路

(一)客户端

        1.使用socket函数接口并且建立客户端地址信息

        2.定义使用结构体和枚举,发送和接收直接用结构体。枚举用户状态(sigin、chat、quit),结构体(用户状态、用户昵称,用户消息)

        3.用户加入时:向服务器发送登录状态

        4.聊天过程:创建两个线程执行发送和接收服务器发送过来的消息。

        5.退出时:通过发送线程,向服务器发送quit作为退出标志,

(二)服务器端

        1.使用socket函数接口并且绑定服务器地址信息

        2.定义同样的结构体来接收信息。因为服务器需要向每个在线的客户端发送结构体信息,所以需要保存加入的客户端地址信息。这里则还需要定义一个结构体来存放地址信息和用户的状态。

        3.接收客户端发来的信息判断信息状态后执行操作。

                ①服务器接收的客户端状态为sigin:发送信息给每一个在线的客户端(可以将存在的客户端信息存在链表(数组)里面,然后遍历链表判断状态,发给每一个在线的客户端),将自己的地址尾插法插入链表(发送之后插入可以不用判断自己)。

                ②接收到的客户端信息为chat:发送消息给除自己之外的每一个客户端

                ③接收到的客户端信息为quit:发送给除自己每个用户之后,删除这个用户所在链表节点。

三、核心代码

四、成功展示

五、总结

        在这个小项目实现的过程中,我遇到了两个问题并且最后解决了这两个问题。遇到困难对我来说是非常好的,因为我是在学习的过程,有问题解决它才能掌握正真的知识。

        1.客户端与服务器传文件时,TCP中接收文件内容消息结束时为什么可以用recv的返回值==0来作为结束条件,而UDP却需要一个特殊的标志。

        原因:TCP面向连接的特性,相当于建立了一个管道。服务器文件读完是发送端发送0,而接收端收到0会知道对面已经发送完毕了。

                   UDP无连接,发送文件,读完文件发送0时,接收端不知道它发送完毕。所以必须设置一个标志。

        2.为什么在客户端定义的结构体全局变量msg,在主函数中输入msg.name,而在发送线程中msg.name没有被赋值。

        原因:线程共享进程内存数据区,而定义的全局变量是他们俩共享的区域。如果recv接收到服务端发来的msg,则它们两个线程共享的msg会被更新。因此,需要定义一个全局变量用来存放主函数中输入的msg.name,用来赋值给发送线程中给mag.name。又因为我在接收线程中recvfrom前加了bzero清除msg,所以导致发送是msg.name没有值。

                

http://www.dtcms.com/a/349214.html

相关文章:

  • 器件(十)——经典封装类型总结
  • JUC之ThreadLocal
  • MySQL的安装和卸载指南(入门到入土)
  • python写上位机并打包250824
  • 第04章 SPSS简介与数据库构建
  • 2025最新ncm转MP3,网易云ncm转mp3格式,ncm转mp3工具!
  • C6.1:发射极偏置放大器
  • 支持多种模型,无限AI生图工具来了
  • 智元精灵GO1 agibot数据转换Lerobot通用格式数据脚本
  • 3.2 半导体随机存取存储器 (答案见原书 P168)
  • 你在四阶段数据成熟度旅程中处于哪个阶段?
  • 高数 不定积分(4-3):分部积分法
  • APP逆向——某站device-id参数(2)
  • 56 C++ 现代C++编程艺术5-万能引用
  • Linux内核ELF文件签名验证机制的设计与实现(C/C++代码实现)
  • DeepSeek对采用nginx实现透传以解决OpenShift 4.x 私有数据中心和公有云混合部署一套集群的解答
  • 机床智能健康管理系统:工业母机数字化转型的核心引擎​
  • 在mysql中,modify ,change ,rename to的作用是什么
  • AI使用日志(一)--Cursor和Claude code初体验
  • 用 Python 探索二分查找算法:从基本原理到实战最佳实践
  • 自回归(Auto-Regressive, AR),自回归图像生成过程
  • 【Canvas与旗帜】蓝圈汤加旗
  • 基于蓝牙的stm32智能火灾烟雾报警系统设计
  • 一个高度精简但结构完整的微服务示例
  • 敏感电阻简单介绍
  • Java 创建线程的几种方式
  • Python复数运算完全指南:从基础到工程级应用实践
  • Hyperledger Fabric官方中文教程-改进笔记(十六)-策略(policy)
  • 【Luogu】P4127 [AHOI2009] 同类分布 (数位DP)
  • 【知识杂记】卡尔曼滤波相关知识高频问答