Qt-Web混合开发-WebSocket客户端程序Web版本(9)

news2024/9/20 18:34:57

Qt-Web混合开发-WebSocket客户端程序Web版本💚💜🉑🍑

文章目录

  • Qt-Web混合开发-WebSocket客户端程序Web版本💚💜🉑🍑
    • 1、概述🐛🦆
    • 2、实现效果😅🙏
    • 3、实现功能🐮🐴
    • 4、关键代码💳🛣️🍐
    • 5、源代码🐍🉐

更多精彩内容
👉个人内容分类汇总 👈
👉Qt - Web混合开发👈

1、概述🐛🦆

  • Qt版本:V5.12.5
  • 关于WebSocket API可以看
  • 用于测试的WebSocket服务端程序
  • WebSocket

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

现在,很多网站为了实现推送技术,所用的技术都是 Ajax 轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

  • WebSocket和Http的异同点

相同:

  1. 建立在TCP之上,通过TCP协议来传输数据;
  2. 都是可靠性传输协议;
  3. 都是应用层协议。

差异:

  1. WebSocket是HTML5中的协议,支持持久连接,HTTP不支持持久连接;
  2. HTTP是单向协议,只能由客户端发起,做不到服务器主动向客户端推送信息。

2、实现效果😅🙏

在这里插入图片描述

3、实现功能🐮🐴

  1. 使用html编写界面、css设置样式、javascript实现webSocket客户端程序;
  2. 将html、css、js文件分开编写,便于阅读;
  3. 程序编译后自动将html文件夹拷贝到可执行程序当前路径;
  4. 可以直接点击chatClient.html文件运行客户端程序;
  5. 也可以在程序编译运行后使用QDesktopServices自动打开html文件。

4、关键代码💳🛣️🍐

  • pro文件
QT += core  widgets
  • main.cpp
#include <QApplication>
#include <QDesktopServices>
#include <qdir.h>
#include <qurl.h>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    /**
     * 使用合适的程序打开url
     * QDesktopServices需要使用QApplication才可以执行,
     * 否则会报错【QDesktopServices::openUrl: Application is not a GUI application】
     */
    qDebug() << QDesktopServices::openUrl(QDir("./html/chatClient.html").absolutePath());

    return a.exec();
}

  • chatClient.html
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebSocket客户端程序</title>

    <script src="./chatClient.js"></script>
    <link rel="stylesheet" type="text/css" href="chatClient.css">
</head>
<body>
    <div>
        <h1>WebSocket客户端程序</h1>
        <p>
            服务端url:<input type="text" id="url" value="ws://localhost:1234">
        </p>
        <p>
            <button id="but_connect" onclick="socketConnectOrDis()">连接</button>
            <button id="but_getState" onclick="getState()">WebSocket状态</button>
        </p>
        <p>
            <textarea name="textShow" id="textShowId" cols="60" rows="10" readonly></textarea>
        </p>
        <p>
            <input type="text" id="nick" value="张三" />
            <input type="text" id="inputText" onkeydown="if(event.keyCode==13)sendMessage();"/>
            <button id="but_send" onclick="sendMessage()" disabled>发送数据</button>
        </p>

    </div>
</body>
</html>
  • chatClient.js
// 关于WebSocket的用法可以看【https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket】
var g_client = null;     // WebSocket客户端对象

/**
 * 控制WebSocket连接或者断开
 */
function socketConnectOrDis()
{
    var text = document.getElementById("but_connect").innerHTML;
    if(text === "连接")
    {
        connectWebSocket();
    }
    else
    {
        disConnectWebSocket();
    }
}

/**
 * WebSocket连接
 */
function connectWebSocket() 
{
    try
    {
        if(g_client && g_client.readyState === WebSocket.OPEN)  // 如果g_client不为空,并且为连接状态
        {
            g_client.close();  // 关闭连接
        }
        var url = document.getElementById("url").value;
        g_client = new WebSocket(url);      // 创建一个WebSocket客户端,并连接
        /**
         * 连接成功触发事件执行的回调函数
         */
        g_client.onopen = function(evt)   
        {
            showMessage("连接成功!");
            document.getElementById("but_connect").innerHTML = "断开连接";
            document.getElementById("but_send").disabled = false;        // 按键使能
        }
        /**
         * 关闭连接触发事件执行的回调函数
         */
        g_client.onclose = function(evt)
        {
            showMessage("关闭连接");
            document.getElementById("but_connect").innerHTML = "连接";
            document.getElementById("but_send").disabled = true;
        }
        /**
         * 接收到信息的回调函数
         */
        g_client.onmessage = function(evt)
        {
            showMessage("收到:" + evt.data);
        }
        /**
         * 连接失败后的回调函数
         */
        g_client.onerror = function(evt)
        {
            showMessage("Error:" + evt.data);
        }
    }
    catch(exception)   // 捕获异常信息
    {
        showMessage("Error:" + exception);
    }
}

/**
 * 断开连接
 */
function disConnectWebSocket()
{
    if(g_client)
    {
        g_client.close();
    }
}

function getState()
{
    if(g_client)
    {
        var state;
        switch(g_client.readyState)
        {
            case WebSocket.CONNECTING:
            {
                state = "连接中";
                break;
            }
            case WebSocket.OPEN:
            {
                state = "已连接";
                break;
            }
            case WebSocket.CLOSING:
            {
                state = "正在关闭连接";
                break;
            }
            case WebSocket.CLOSED:
            {
                state = "未连接";
                break;
            }
            default:
            {
                state = "未知";
                break;
            }
        }
        showMessage("客户端当前状态:" + state);
    }
    else
    {
        showMessage("客户端未初始化");
    }
}

/**
 * 显示信息
 */
function showMessage(message) 
{
    var textShow = document.getElementById("textShowId");
    textShow.value += message + "\n";              // 追加信息
    textShow.scrollTop = textShow.scrollHeight;    // 滚动条显示最下方
}

/**
 * 发送信息
 */
function sendMessage()
{
    if(g_client != null)
    {
        var nick = document.getElementById("nick").value;       // 获取昵称
        var msg = document.getElementById("inputText").value;   // 获取发送的数据
        var strToSend = nick + ":" + msg;
        g_client.send(strToSend);
        showMessage("发送:" + strToSend);
    }
}

  • chatClient.css
button {
    background-color: #4CAF50; /* Green */
    border: none;
    color: white;
    padding: 15px 32px;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    font-size: 14px;
    margin: 4px 2px;
    cursor: pointer;
    -webkit-transition-duration: 0.4s; /* Safari */
    transition-duration: 0.4s;
    box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19);
}
button:hover {
    box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24),0 17px 50px 0 rgba(0,0,0,0.19);
}

#textShowId {
     /*去掉右下角的斜杠,不允许文本框缩放*/
     resize: none;
     background: #e6dfdf;
     /*设置字体大小*/
     font-size: 18px;
     /* placeholder位置 提示靠左靠右居中等 */
     text-align: left;
     box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19);
}

h1 {
    font-size: 40px;
    color:red;
}

div {
    text-align: center;   /* 居中 */
}

input {
        height: 35px;
        background-color: rgb(248, 240, 240);
        font-size: 16px;
        border: 1px solid rgb(27, 26, 26);
        color: black;
        outline: none;  
        padding-left: 15px;  
        box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19);
}

#nick {
    width: 60px;
}

5、源代码🐍🉐

  • gitee
  • github

. ⋆⁺⋆。🦋₊⋆°⋆
 /l、
゙(゚、 。 7
 l、゙ ~ヽ
 じしf_, )ノ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java实战:hutool-db实现多数据源配置

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

5G NR同频多beam检测方法

【摘 要】5G NR与LTE有诸多方面的不同,较突出的变化就是SSB内PSS序列和SSS序列设计与LTE明显不同,而且在每个SSB突发内会有多个SSB,多个SSB的出现增加了小区搜索的难度。由于频谱资源匮乏,所以采用同频方式组网,但因此相邻小区之间也会产生干扰,影响检测效率。同频检测技…

器乐文化网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 1.用户模块 1)登录/注册 (通过前后端交互实现用户信息注册登 录) 2&#xff09; 在线支付充值虚拟币&#xff1b;&#…

Ajax(七)+axios+跨域+JSONP

目录 1. XMLHttpRequest Level2的新特性——FormData对象管理表单数据&#xff08;一&#xff09; 用法&#xff08;二&#xff09; 2. XMLHttpRequest Level2的新特性—— 上传文件 3. XMLHttpRequest Level2的新特性—— 显示文件上传进度 4. jQuery高级用法 4.1 jQuery…

【AIOT】Python语音处理

语音信号有三个重要的参数&#xff1a;声道数、取样频率和量化位数。 声道数&#xff1a;可以是单声道或者是双声道采样频率&#xff1a;一秒内对声音信号的采集次数&#xff0c;44100Hz采样频率意味着每秒钟信号被分解成44100份。换句话说&#xff0c;每隔144100秒就会存储一次…

[附源码]计算机毕业设计Python本地助农产品销售系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

class80(CL80)双模蓝牙5.2热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09;软件支持一些常见问题解答&#xff08;FAQ&#xff09;首次使用测试步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功能层1配置的功能默认的快捷键蓝牙参数蓝牙…

【lssvm回归预测】基于鸽群算法优化最小二乘支持向量机PIO-lssvm实现数据回归预测附matlab代码

​✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法…

Python+Qt抽奖点名工具源码窗体程序

程序示例精选 PythonQt抽奖点名工具源码窗体程序 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonQt抽奖点名工具源码窗体程序》编写代码&#xff0c;功能包括了抽奖点名&#xff0c;历史…

【DBN分类】基于粒子群算法优化深度置信网络PSO-DBN实现数据分类附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Enhancing Adversarial Training with Second-Order Statistics of Weights

利用二阶权重统计增强对抗训练 对抗训练已被证明是提高深度神经网络鲁棒性的最有效方法之一。它被形式化为对模型权重和对抗性扰动的最小-最大优化&#xff0c;其中权重可以通过梯度下降方法&#xff08;如SGD&#xff09;进行优化。在本文中&#xff0c;我们证明了将模型权重…

黑*头条_第2章_app端文章查看,静态化freemarker,分布式文件系统minIO(新版)

黑*头条_第2章_app端文章查看&#xff0c;静态化freemarker,分布式文件系统minIO&#xff08;新版&#xff09; 文章目录黑*头条_第2章_app端文章查看&#xff0c;静态化freemarker,分布式文件系统minIO&#xff08;新版&#xff09;1)文章列表加载1.1)需求分析1.2)表结构分析1…

2000-2020年全国31省城镇化率

2000-2020年全国31省城镇化率 1、时间&#xff1a;2000-2020年 2、范围&#xff1a;包括全国31个省 3、指标包括&#xff1a;总人口、城镇人口、农村人口、城镇化率 其中&#xff1a;城镇化率城镇人口/总人口 3、来源&#xff1a;整理自计NJ及各省统计NJ 4、指标解释&…

葵花宝典之C语言冷知识(一)

实用小课堂开课啦&#xff01;鸟类天堂&#xff1a; &#x1f9a2;一&#xff1a;函数类型的对应 &#x1f99c;代码呈现&#xff1a; &#x1f9a2;二&#xff1a;浮点数运算 &#x1f9a2;三&#xff1a;scanf的使用 &#x1f9a9; NUM 1&#xff1a;遇见空格&#xff0c;回车…

(附源码)Springboot北京东奥会志愿者报名系统 毕业设计 150947

Springboot北京北京东奥会志愿者报名系统 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对北…

数据挖掘Java——KNN算法的实现

一、KNN算法的前置知识 k-近邻&#xff08;kNN, k-NearestNeighbor&#xff09;是在训练集中选取离输入的数据点最近的k个邻居&#xff0c;根据这个k个邻居中出现次数最多的类别&#xff08;最大表决规则&#xff09;&#xff0c;作为该数据点的类别。 分类在数据挖掘中是一项…

底层网络知识详解:陌生的数据中心-第18讲-DNS协议:网络世界的地址簿

前面我们讲了平时常见的看新闻、支付、直播、下载等场景,现在网站的数目非常多,常用的网站就有二三十个,如果全部用IP地址进行访问,恐怕很难记住。于是,就需要一个地址簿,根据名称,就可以查看具体的地址。 例如,我要去西湖边的“外婆家”,这就是名称,然后通过地址簿…

Linux运维巡检流程工作总结

文章目录一 执行脚本获取数据二 登陆巡检环境2.1 将数据放在特定目录下2.2 在网页浏览器输入 ip:端口号/linux三 生成报告3.1 点击执行按钮&#xff0c;等待报告3.2 点击生成html文档&#xff0c;等待四 编写巡检文档4.1 提取所有检查的服务器IP、主机名、操作系统4.2 提取某些…

js实现放大镜效果

在我们平时见到很多购物网站都会有放大镜效果的出现&#xff0c;当我们将鼠标放在一个商品图片的上面&#xff0c;就会在旁边出现对应的放大效果。 效果图 实现步骤 实现原理是非常简单的&#xff0c;实际上是两张图片&#xff0c;一张原图和一张更大尺寸的图片。一开始通过c…

如何mount到网络为NAT方式的虚拟机

VMware Workstation我们一般两种虚拟机上网方式&#xff0c;一种bridge,一种NAT。bridge可以获得公网地址需要指定静态IP&#xff0c;而NAT是动态分配的内网地址了。设置bridge方式时往往指定的IP为内网IP&#xff0c;则无法正常上网&#xff1b;而设置NAT方式时共享本地网络可…