Qt5实现的局域网通信工具,支持公网。类似软件百度一大把,但是还是想整理一份属于自己的专属QQ。支持跨平台。

1目的

本文主要介绍利用Qt实现局域网通信的主要实现流程和一些技术知识点的设计说明。

2总体设计

2.1 功能特点

这款局域网通信软件是基于Qt的实现的C/S架构通信,通信功能全部采用QTcpSocket完成的。该软件分为2部分,一部分是服务端,一部分是客户端。

消息通信采用QJsonValue的格式进行封装,方便封装和解析。

2.2 模块结构

整个设计可以大致分为服务端、客户端,服务端功能相对比较单一,仅仅做了客户端的消息管理和转发等。数据库读写等。客户端相对较为丰富。包括好友管理、群组管理、tcp消息管理,数据库管理,

整个项目设计的功能的设计流程图大致如下所示:

图2-1

2.3 开发环境

本项目的采用Qt进行设计开发,Qt版本为5.7.0,在后续代码维护和修改的时候建议使用该版本或更高的版本。

3模块说明

本设计中主要使用4个大类,一个QTcpServer,另外一个是QTcpSocket,主要是用于通信的,但是他们通信的时候采用了QJsonValue的数据格式进行交互,下面针对这个几个主要的模块进行简单介绍下。最后就是数据库QDataBase

3.1 QTcpServer类

本设计中服务器使用的就是QTcpServer,我们在使用他的时候只需要知道的一个信号就行了,就是有新的tcp链接上来的额时候,可以及时通知我,然后我这边进行客户端的链接处理。如下:

  m_tcpServer = new QTcpServer(this);
  connect(m_tcpServer, SIGNAL(newConnection()), this, SLOT(SltNewConnection()));

当有新的客户端链接上来,我们只需要在这个槽函数中进行处理就行了。

3.2 QTcpSocket类

该类为TCP的通信类,主要是链接服务器与客户端的。当连接或者断开开都可以获取该消息通知。并做出相应的处理。

    connect(m_tcpSocket, SIGNAL(readyRead()), this, SLOT(SltReadyRead()));
    connect(m_tcpSocket, SIGNAL(connected()), this, SLOT(SltConnected()));
connect(m_tcpSocket, SIGNAL(disconnected()), this, SLOT(SltDisconnected()));

3.3 QJsonValue类

该类为TCP通信的参数传递类,用于封装传递消息的。其格式如下:

图3-2-1 JSON数据封装

然后数据输出为:

{"data":{"name":"xiaoni","passwd":"123456"},"from":1,"type":2}

分别表示为:

Type: 消息传输类型(比如登陆、注册、消息发送、文件发送等)
From: 表示发送者的id。
Data:传输数据的封装对象,里面可能是json数组或则直接就是对象
// 对于这个json格式的解析如下:(其他格式均是如此)
    // data 的 value 是对象
    if (dataVal.isObject()) {
        QJsonObject dataObj = dataVal.toObject();
        QString strName = dataObj.value("name").toString();
        QString strPwd = dataObj.value("passwd").toString();
        m_nId = DataBaseMagr::Instance()->CheckUserLogin(strName, strPwd);
        qDebug() << "Login" << strName << strPwd << m_nId;
        // 返回客户端
        QJsonObject json;
        json.insert("id", m_nId);
        json.insert("code", -1 == m_nId ? m_nId : 0);
        json.insert("msg", -1 == m_nId ? "error" : "ok");
        if (-1 != m_nId) Q_EMIT signalConnected();
        // 发送查询结果至客户端
        SltSendMessage(Login, json);;
}

3.4 QSqlDataBase类

该类为数据库引擎类,在本设计中,服务端和客户端均采用数据库的方式进行数据的保存。

服务端:

创建用户数据库表

query.exec("CREATE TABLE USERINFO (id INT PRIMARY KEY, name varchar(20), "
               "passwd varchar(20), status INT, groupId INT, lasttime DATETIME);");
Id
Name
Passwd
Status
groupId
lasttime
唯一标识
用户名
用户密码
线上状态
群组id
最后时间

表3-4-1 用户数据库表设计

创建用群组数据库表

    query.exec("CREATE TABLE GROUPINFO (id INT PRIMARY KEY, groupId INT, name varchar(20), "
               "userId INT, identity INT)");
Id
groupId
name
userId
identity
唯一标识
群组id
群名字
用户id
用户身份

表3-4-2 用户数据库表设计

客户端:

    // 创建历史聊天表
    query.exec("CREATE TABLE MSGINFO (id INT PRIMARY KEY, userId INT,"
                          "type INT, direction INT, content varchar(500))");
Id
userId 
type 
direction 
content 
唯一标识
用户id
消息类型
聊天方向
消息内容

表3-4-3 用户数据库表设计

    // 创建我的好友表
    query.exec("CREATE TABLE FRIEND (id INT PRIMARY KEY, name varchar(50))");
Id
name 
唯一标识(好友id)
好友名字

表3-4-4用户数据库表设计

    // 创建群组表
    query.exec("CREATE TABLE MYGROUP (id INT PRIMARY KEY, name varchar(50))");
Id
name 
唯一标识(好友id)
好友名字

表3-4-5用户数据库表设计

4 界面设计

4.1 服务端界面设计

服务端界面仅仅是一个消息记录的方式,大部分功能都是做的消息转发功能,没有图像界面,因此界面很单一,在用户上下线的时候会提示。

图4-1 服务端界面

4.2 客户端界面设计

客户端界面相对比较复杂,界面风格仿照QQ的主面板设计,分为好友管列表,群组管理列表。

图4-2 客户端主界面

图4-3 私聊窗口

聊天界面采用QWidget的绘制,模仿QQ聊天气泡进行设计的,目前支持功能文件传输功能(服务器转发,先将要发送的文件传给服务器,然后通过服务器将该文件消息发送至对端客户,对端客户可以选择下载文件,也可以选择不下载文件)。

消息聊天机制:客户端将要发送的文本消息封装成QJsonValue格式的数据,通过服务器进行查找,如果对端客户在线,那么直接将该消息发送过去,不在线的用户不处理,可拓展为离线消息(保存最近100条消息,当下次该用户上线时,服务器将该消息推送给他)

文件发送机制:采用文件分片的方式将整个文件拆分成byte进行发送,每次发送50个byte,在局域网可以达到10M/S的传输速率。

图4-4群组聊天

群组聊天机制:当该群组里面的某个好友主动发起会话时,服务器会自动吧该消息转发给其他在线的组成员,并简单的封装下,是谁发送的消息。以此进行区分。

4.3 客户端界面设计

图4-5 登陆界面

在本设计中,添加了一个用户登陆的功能,因为走tcp流程,需要进行用户认证,点击登陆时,通过tcp发送认证消息至服务端,服务器查询服务器的数据库文件,如果查询到,返回JSON格式的数据给该客户端,并通过认证,可登陆主界面,否则如上弹出登陆校验失败的错误提示框。

用户注册:方法也是通过tcp发送注册消息至服务端,并获取返回的json数据。

4.4 其他设计

1、数据库聊天记录保存,当第一次加载该消息框时,会自动加载最近10条记录,并显示,如果想要获取全部的聊天记录,可直接点击聊天窗口上的历史记录按钮即可。

2、好友管理,目前只添加用户添加功能,用户删除功能没做,可以自行添加。

3、群组管理,与好友管理方法类似,删除功能为做。

4结语

好友管理类使用的QListWidget进行封装处理的,理聊天的气泡界面也是通过QPainter进行绘制,自己管理的列表类,支持鼠标滚轮滑动。

5、代码下载

编译代码前,请先阅读代码说明。
下载地址:https://download.csdn.net/download/nigoole/10819039

鉴于很多小伙伴编译存在问题。重新整理下:--- 修改于20220613

https://gitee.com/xiaoni_pj/my-chat

Qt实现的局域网通信软件(仿QQ版本)相关推荐

  1. Qt TCP/UDP局域网通信软件 模仿QQ TIM

    1.先上界面效果 2.好友列表.聊天界面.发送图片功能已实现 3.后续将通信.发送文件.群聊.截屏等等功能实现 布局搞得有点头疼... 添加发送文档功能 更新:TCP通信功能实现,需要启动后台服务器, ...

  2. 基于QT Creator 5.14的仿QQ聊天系统【UDP通讯】

    一.使用工具 本次整个项目的开发基于Qt Creator 5.14.2进行的开发与调试,主要通信功能采用UDPSocket完成,是我学习Qt过程中联系的小案例,过程中遇到的bug和完整代码会尽量展现出 ...

  3. 仿QQ聊天系统(JAVA+MySQL)

    摘  要 仿QQ聊天系统是基于MySQL数据库开发工具进行设计,理论研究与实践相结合,利用计算机技术.数据库技术,java技术等对腾讯QQ聊天系统的开发设计进行研究 以JAVA技术为核心,利用计算机局 ...

  4. Qt实现仿QQ截图,带绘图,撤回功能!

    Qt实现仿QQ截图 想自己用Qt做个东西玩玩,偶然间看到小猪老师做的截图文章 做的很棒,但是看到最后没有发现绘图功能,然后百度了各种用qt制作的截图软件,大部分都不带绘图功能,于是我便打算在小猪老师代 ...

  5. android 仿qq修改头像,Qt:小项目仿QQ修改头像界面,技术点记录

    最近写了一个修改头像功能的UI,布局参考了QQ目前的修改头像界面.如下图 这里主要说明一下两个地方的技术:1.头像图片上层的遮罩层,圆形外部为灰色,内部为全透明:2.上传图片宽高比例可以通过鼠标拖拽移 ...

  6. qt 仿QQ音乐简易本地播放器

    这是我禁用qt窗口自定义写了一个仿qq音乐的播放器,添加本地音乐实现循环,顺序,随机播放,可调节音量. 主要是对qt音频那一块的运用. 语言c++ 基本参考博客搬砖,中间栏为静态. 下载链接:http ...

  7. Qt Quick实现局域网聊天V4版本(支持GIF动图表情包、消息聊天、拖动缩放窗口、支持Linux编译)

    Qt Quick实现局域网聊天V4版本(支持GIF动图表情包.消息聊天.拖动缩放窗口.支持Linux编译) 随着社交网络的普及,人们的聊天方式也变得更加高效和便捷.在这里,我们将利用Qt Quick构 ...

  8. Qt 仿QQ图片查看器

    最近项目中,由于需要查看图片.看了网上写的各种图片查看器.感觉都没有QQ图片查看器那种界面好看一点.并且放大了可以移动图片.为此,想着仿QQ图片查看器自己写了一个,如图: 主要实现的功能有: 鼠标滚轮 ...

  9. linux局域网通信软件iptux,ipmsg

    windows下有非常好用的局域网通信软件:ipmsg(飞鸽传书). ipmsg也有linux版本,但是,有bug,更新也慢. linux下有一个国人开发的iptux,兼容ipmsg协议,跨平台使用, ...

  10. 仿QQ聊天程序(java)

    仿QQ聊天程序(java) 2014年03月17日 15:52:47 标签: java / 聊天 / 仿QQ 90246 仿QQ聊天程序 转载出处: https://blog.csdn.net/u01 ...

最新文章

  1. java实现收货7天发通知,Java实训的第7天
  2. 需求的推动力-网线啥的
  3. 按一个按钮会随机死人_《饥荒》那些年坑爹的随机地图,最后一个简直笑死人...
  4. failed to open log file_C++中glog源码剖析以及如何设计一个高效 log模块
  5. 多相机坐标转换_使用KITTI数据集实现坐标转换
  6. 微信红包随机数字_微信红包随机算法转载
  7. 深入分析Java中的关键字static
  8. php和app关系,php在app开发中的应用
  9. elipse下载及安装
  10. 完美掌握MySQL登录方法]MySQL登录教程
  11. 中国科学院大学2019年数学分析考研试题
  12. 阿里数据中台维度建模规范、维度模型设计及模型实施方法论
  13. 信用卡上了“灰名单”怎么办?如何解除?
  14. Hash校验工具、MD5 SHA1 SHA256命令行工具
  15. 如何将一个大文件打包压缩成几个小的文件及其解压缩打开方法
  16. 电路抗干扰设计——非常详细
  17. 游戏开发设计模式:命令模式
  18. C语言标识符有哪三类
  19. HTML5期末大作业:动漫网站设计——福五鼠动漫(6页)带轮播特效 高质量代码 HTML+CSS+JavaScript 毕设网页设计HTML
  20. 《程序员养成记》第1集 做程序员需要天赋吗?

热门文章

  1. php分组统计求和,数据需求统计常用shell命令---AWK分组求和,分组统计次数
  2. json文件编辑器android版,json editor手机版下载
  3. 顺序表基本操作归纳整理
  4. Kafka实战之整合Flume和Kafka完成实时数据采集
  5. Qt之切换语言的方法(传统数组法与Qt语言家)
  6. python面向对象实现算术编码
  7. activiti7对接springboot
  8. Activiti 7+Maven+Idea
  9. 3D旋转相册代码及详细使用教程
  10. matlab图像粘连计数,Matlab图像处理在水稻谷粒计数中的应用