群聊系统项目(基于TCP、UDP实现)

最近学习了网络编程后, 写了一个基于TCP、UDP协议的群聊系统。

技术栈

      1、TCP、UDP通信
      2、生产、消费模型, 支持并发
      3、自定义协议封装数据 & json封装数据
      4、STL中无序map、vector容器使用
      5、日志管理模块 - 在线显示后台情况
      6、ncurses库绘制聊天界面

支持功能

      1、支持用户注册、登录。 注册成功后台会返回一个账号, 用户可以通过账号和密码进行登录。
      2、支持群发功能。当一方发送一次消息, 其他在线用户都可以接收到。
      3、支持在线用户显示。 当用户发送一次消息后,其他用户的在线列表就会显示该用户。

原理剖析

一、注册、登录模块
      1、登录、注册模块采用TCP协议实现。 注册、登录信息采用自定义类去封装信息。 后台对应的自定义类去解析数据。 (防止粘包问题)(采用TCP协议也是为了防止掉包问题,传输的可靠性,毕竟该模块很重要)
      2、注册:
         后台:后台得到该注册信息会在用户管理添加该用户信息,以便后续登录校验。( 用户管理是用STL中unordered_map容器实现的,存储的键值对为<用户ID, 用户的信息>, 通过用户ID可以得到该用户的注册信息、登录状态等。)如果注册成功, 会将该用户状态置为注册。返回客户端注册成功状态码。
         客户端:如果注册成功,会得到服务器端返回的注册成功状态码, 从而进行登录、聊天的后续操作。
      3、登录:
         后台:当接受到用户的登录信息,通过用户管理unordered_map查找是否存在该用户,存在密码是否正确。如果登录信息正确, 会将该用户状态置为登录。
         客户端:如果登录成功, 会得到服务器端返回的登录成功注册码, 从而进入聊天界面。

一、聊天(接受、发送信息)
      1、聊天模块采用UDP协议实现。后台采用生产、消费模型进行用户数据接收和转发。UDP传输数据采用Json进行序列化和反序列化封装、解析。
      2、当用户发送一次消息, 后台生产线程(内部执行recvfrom)接受到该信息, 首先判断该用户是否为登录状态, 如果为登录状态, 将该用户状态置为在线状态, 然后将该信息存放到消息池(生产、消费模型中线程安全队列)中去调用消费线程完成转发。
      3、对于客户端, 采用ncurses库绘制简单图形界面, (包括首航介绍界面, 发送界面,接收界面,在线用户显示界面), 在发送界面对应UDP的sendto接口完成向服务器的发送数据。 接收界面对应UDP的recvfrom接口完成对服务器的接受数据。对于在线用户, 实现比较简单, 接受到服务器的信息, 将该信息中用户名添加到在线用户列表中(vector存储),在在线用户界面进行显示。

注册登录界面:
在这里插入图片描述
交互界面
在这里插入图片描述
后台日志显示
在这里插入图片描述

源码链接:https://github.com/haomengwudaydayup/C-_learning/tree/master/chat-free-system_progrm

ps:本人太会使用ncurses库, 因此在前台显示有些问题, 但是后台程序无误。
(本人梦想是做后台的),请见谅!

发布了25 篇原创文章 · 获赞 16 · 访问量 912

猜你喜欢

转载自blog.csdn.net/weixin_44024891/article/details/105674312
今日推荐