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

Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中

场景

SpringBoot+Vue整合WebSocket实现前后端消息推送:

SpringBoot+Vue整合WebSocket实现前后端消息推送_websocket vue3.0 springboot 往客户端推送-CSDN博客

上面实现ws推送数据流程后,需要在windows上使用ws客户端定时记录收到的数据到文件中,这里

文件使用SQLite数据库进行存储。

Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作:

Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作_winform sqllite-CSDN博客

Sqlite的操作参考如上。

注:

博客:
霸道流氓气质_C#,架构之路,SpringBoot-CSDN博客

实现

1、引入WebSocket4Net依赖

使用Nuget搜索并安装WebSocket4Net

2、设计页面布局如下

3、websocket客户端实现

声明客户端对象

public static WebSocket4Net.WebSocket webSocket4NetClient = null;

ws连接按钮的点击事件中

            try {var wsAddresss = textBox_ws_address.Text.Trim();webSocket4NetClient = new WebSocket4Net.WebSocket(wsAddresss);webSocket4NetClient.Opened += WebSocket4Net_Opened;webSocket4NetClient.Error += Websocket_Error;webSocket4NetClient.Closed += new EventHandler(Websocket_Closed);webSocket4NetClient.MessageReceived += WebSocket4Net_MessageReceived;webSocket4NetClient.Open();textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":ws开始连接");textBox_log.AppendText("\r\n");} catch (Exception exception) {textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":ws连接异常:"+ exception.Message);textBox_log.AppendText("\r\n");}

这里未添加对ws地址的校验,只关注中间ws相关的代码

                webSocket4NetClient = new WebSocket4Net.WebSocket(wsAddresss);webSocket4NetClient.Opened += WebSocket4Net_Opened;webSocket4NetClient.Error += Websocket_Error;webSocket4NetClient.Closed += new EventHandler(Websocket_Closed);webSocket4NetClient.MessageReceived += WebSocket4Net_MessageReceived;webSocket4NetClient.Open();

然后编写其各种事件的具体实现。

实现方法中具体逻辑根据业务进行确定。

建立连接事件实现

        private void WebSocket4Net_Opened(object sender, EventArgs e){//允许跨线程调用Control.CheckForIllegalCrossThreadCalls = false;textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":ws建立连接成功");textBox_log.AppendText("\r\n");//向服务端发送消息//webSocket4NetClient.Send("Client准备发送数据!");}

收到消息事件实现

        private void WebSocket4Net_MessageReceived(object sender, MessageReceivedEventArgs e){//允许跨线程调用Control.CheckForIllegalCrossThreadCalls = false;//textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":收到消息:");//textBox_log.AppendText("\r\n");receviceString = e.Message;}

出错事件实现

        private void Websocket_Error(object sender, EventArgs e){//允许跨线程调用Control.CheckForIllegalCrossThreadCalls = false;textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":Websocket_Error:"+e);textBox_log.AppendText("\r\n");}

连接关闭事件实现

        private void Websocket_Closed(object sender, EventArgs e){//允许跨线程调用Control.CheckForIllegalCrossThreadCalls = false;textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":Websocket_Closed");textBox_log.AppendText("\r\n");}

ws连接关闭按钮点击实现

        private void button_ws_disconnec_Click(object sender, EventArgs e){webSocket4NetClient.Close();}

4、定时存储实现

在上面收到消息时将数据赋值给变量

receviceString

声明变量

private string receviceString = String.Empty;

添加Timer定时器

Timer _timer = new Timer();

定时存储按钮点击事件实现

        private void button_start_store_Click(object sender, EventArgs e){if (webSocket4NetClient.State != WebSocket4Net.WebSocketState.Open && webSocket4NetClient.State != WebSocket4Net.WebSocketState.Connecting){textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":Websocket连接异常");textBox_log.AppendText("\r\n");}else {//清空数据库SQLiteDataReader reader = Global.Instance.sqlLiteHelper.ExecuteQuery("SELECT* FROM positions;");if (reader.HasRows){while (reader.Read()){Global.Instance.sqlLiteHelper.ExecuteQuery("DELETE FROM positions WHERE timestamp = " + reader.GetString(reader.GetOrdinal("timestamp")) + ";");}}_timer.Interval = (int)numericUpDown_rate.Value;_timer.Tick += _timer_Tick;_timer.Start();textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":定时存储已经启动!!");textBox_log.AppendText("\r\n");}}

首先判断ws是否连接上,如果连接上则将库清空,然后获取设置的定时频率并启动定时器

定时器具体实现

        private void _timer_Tick(object sender, EventArgs e) {try{if (webSocket4NetClient.State != WebSocket4Net.WebSocketState.Open && webSocket4NetClient.State != WebSocket4Net.WebSocketState.Connecting){textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":Websocket连接异常");textBox_log.AppendText("\r\n");}else {if (!String.IsNullOrEmpty(receviceString)){//获取ws数据并存储进数据库TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);string timeSpan = Convert.ToInt64(ts.TotalSeconds).ToString();//插入数据Global.Instance.sqlLiteHelper.InsertValues("positions", new string[] { timeSpan, receviceString });receviceString = String.Empty;}}}catch (Exception exception){textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":定时存储执行异常:" + exception.Message);textBox_log.AppendText("\r\n");}        }

首页也要判断是否连接,然后判断receviceString是否为空,避免ws未传输数据,会定时存储空数据。

不为空则将时间和收到的数据存储进数据库。

停止定时存储按钮点击事件

        private void button_stop_store_Click(object sender, EventArgs e){//停止定时器_timer.Tick -= _timer_Tick;_timer.Stop();textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":定时存储已经停止!!!");textBox_log.AppendText("\r\n");receviceString = String.Empty;}

5、运行效果

相关文章:

Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中

场景 SpringBootVue整合WebSocket实现前后端消息推送: SpringBootVue整合WebSocket实现前后端消息推送_websocket vue3.0 springboot 往客户端推送-CSDN博客 上面实现ws推送数据流程后,需要在windows上使用ws客户端定时记录收到的数据到文件中&#x…...

Jenkins修改全局maven配置后不生效解决办法、以及任务读取不同的settings.xml文件配置

一、修改Global Tool Configuration的maven配置不生效 说明:搭建好jenkins后,修改了全局的settings.xml,导致读取settings一直是之前配置的。 解决办法一 Jenkins在创建工作任务时,会读取当前配置文件内容,固定在这…...

【elfboard linux开发板】7.i2C工具应用与aht20温湿度寄存器读取

1. I2C工具查看aht20的温湿度寄存器值 1.1 原理图 传感器通过IIC方式进行通信,连接的为IIC1总线,且设备地址为0x38,实际上通过后续iic工具查询,这个设备是挂载在iic-0上 1.2 I2C工具 通过i2c工具可以实现查询i2c总线、以及上面…...

LeetCode-有效的字母异位词(242)

题目描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 思路: 这题还是比较简单的,首先将两个字符…...

【AIGC-图片生成视频系列-6】SSR-Encoder:用于主题驱动生成的通用编码器

目录 一. 贡献概述 二. 方法详解 a) 训练阶段 b) 推理生成阶段: 三. 综合结果 四. 注意力可视化 五. 选择性主题驱动图像生成 六. 人体图像生成 七. 可推广到视频生成模型 八. 论文 九. 个人思考 稳定扩散(Stable Diffusion)模型可…...

[C]jupyter中使用C

[C]jupyter中使用C 安装使用用处 安装 https://github.com/brendan-rius/jupyter-c-kernel 下拉找到3条命令,装就可以了 mac和linux可用 python3可用, 2不可以 第二条命令可以改为 : python3 install_c_kernel 小总结:如果有问题&#xff0…...

探讨一下WebINFO 下的一些思考

在平时的开发中,我们经常看到一个/WEB-INF 这个目录,这个是web 容器初始化加载的一个标准路径。官方解释:WEB-INF 是 Java 的 web 应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。也就是说,这…...

MySQL中的开发基于Python的SQL工具类操作数据库简单示例

操作数据库封装SQL工具类的两种方式 为了更方便的实现基于连接池和pymysql 连接数据库,需开发一个sql工具类来让sql操作更简洁用两张方式来封装SQL工具类 1 )单例模式 封装 db.py 工具类 import pymysql from dbutils.pooled_db import PooledDBclas…...

安卓Android Studio读写FM1208CPU卡源码

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-21818769070.11.6c46789elLwMzv&id615391857885 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout x…...

二、Redis的特性与应用场景

Redis是一个在内存中存储数据的中间件&#xff0c;主要用于作为数据库、数据缓存&#xff0c;在分布式系统中有着非常重要的地位。面试中可以围绕Redis的特性进行介绍。 一、Redis特性 1、在内存中存储数据 MySQL主要是“表”的方式来存储组织数据的&#xff0c;是“关系型数…...

编程笔记 html5cssjs 019 HTML实体

编程笔记 html5&css&js 019 HTML实体 一、HTML 字符实体二、HTML 符号实体小结 在HTML文档中&#xff0c;用一些标记表示特定的格式&#xff0c;那我们想使用这些标记字符本身时就出了问题&#xff0c;直接使用时&#xff0c;会被浏览器解析为标记的&#xff0c;要想显…...

数据结构:树详解

创建二叉树 给出了完整的先序遍历序列&#xff0c;子树为空用’#’表示&#xff0c;所以这样我们在通过先序遍历序列创建二叉树时我们直到先序遍历序列是先进行根结点&#xff0c;然后左子树最后右子树的顺序进行遍历的&#xff0c;所以对于完整的先序遍历序列我们可以直到先序…...

list1.Sort((m, n) => m.Id - n.Id); id是double类型的为什么回报错

问题产生的地方 原因 对于 double 类型的属性&#xff0c;不能直接使用减法运算符进行比较。减法运算符只能用于数值类型&#xff0c;而 double 是浮点数类型。 要在 double 属性上进行排序&#xff0c;可以使用 CompareTo 方法或者使用自定义的比较器。 更改 要在 double 属性…...

GoLang vs Python

Python和Go是两种非常不同的编程语言&#xff0c;它们在设计哲学、用途和特性方面有各自的优势和局限性。以下是它们的一些主要区别&#xff1a; 设计哲学: Python: 设计简洁明了&#xff0c;强调代码的可读性和简洁性。Python遵循"只有一种方式来做一件事"的原则。…...

Hello 2024(A~D,F1)

新年坐大牢 A - Wallet Exchange 题意&#xff1a;共有俩钱包&#xff0c;每回合从其中一个钱包中拿走一块钱&#xff0c;谁拿走最后一块钱谁赢。 思路&#xff1a;奇偶讨论即可。 // Problem: A. Wallet Exchange // Contest: Codeforces - Hello 2024 // URL: https://cod…...

Python+Torch+FasterCNN网络目标检测识别

程序示例精选 PythonTorchFasterCNN网络目标检测识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonTorchFasterCNN网络目标检测识别》编写代码&#xff0c;代码整洁&#xff0c;规…...

v8 pwn利用合集

文章目录 前置知识JS Object 相关Ignition 相关JIT - turboFan 相关starCTF2019 OOB【越界读写map字段】googleCTF2018 jit【浮点数精度丢失导致越界读写】数字经济线下 Browser【Object::toNumber中callback导致的越界写】前置知识 JS Object 相关 V8 中的对象表示 ==> 基…...

JVM:字节码

JVM&#xff1a;字节码 前言1. JVM概述1.1 JVM vs JDK vs JRE1.1.1 JVM1.1.2 JDK1.1.2.1 常用的JDK8是Oracle JDK 还是 OpenJDK 1.1.3 JRE1.1.4 三者之间的关系与区别 1.2 什么是字节码?采用字节码的好处是什么?1.3 Java 程序从源代码到运行的过程1.4 JVM的生命周期1.5 JVM架…...

常见网络设备及功能详解

网络设备 - 交换机 交换机&#xff1a;距离终端用户最近的设备&#xff0c;用于终端用户接入网络、对数据帧进行交换等。 交换机的功能&#xff1a; 终端设备&#xff08;PC、服务器等&#xff09;的网络接入二层交换&#xff08;Layer 2 Switching&#xff09; 网络设备 - …...

Python教程(20)——python面向对象编程基本概念

面向对象 类和对象初始化方法属性和方法self关键字继承多态 面向对象&#xff08;Object-oriented&#xff09;是一种常用的程序设计思想&#xff0c;它以对象作为程序的基本单元&#xff0c;将数据和操作封装在一起&#xff0c;通过对象之间的交互来实现程序的功能。 在面向对…...

C# Winform教程(一):MD5加密

1、介绍 在C#中&#xff0c;MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希函数&#xff0c;用于将任意长度的数据转换为固定长度的哈希值&#xff08;通常是128位&#xff09;。MD5广泛用于校验数据完整性、密码存储等领域。 2、示例 创建MD5加密…...

Mongodb使用指定索引删除数据

回顾Mongodb删除语法 db.collection.deleteMany(<filter>,{writeConcern: <document>,collation: <document>,hint: <document|string>} ) 删除语法中&#xff0c;除了指定过滤器外&#xff0c;还可以指定写入策略&#xff0c;字符序和使用的索引。 …...

虾皮怎么选品:虾皮(Shopee)跨境电商业务成功的关键步骤

在虾皮&#xff08;Shopee&#xff09;平台上进行跨境电商业务&#xff0c;选品是至关重要的一环。有效的选品策略可以帮助卖家更好地了解市场需求&#xff0c;提高销售业绩和客户满意度。以下是一些成功的选品策略&#xff0c;可以帮助卖家在虾皮平台上取得更好的业务成绩。 先…...

QML —— 使用Qt虚拟键盘示例(附完整源码)

示例效果 使用"虚拟键盘"注意 &#xff08;例子的Qt版本:5.12.4&#xff09; 注意一&#xff1a;      /* 必须在main.cpp开始处加入如下代码&#xff0c;否则无法使用"虚拟键盘" */      qputenv(“QT_IM_MODULE”,QByteArray(“qtvirtualkeybo…...

Nacos 持久化及集群的搭建【微服务】

文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务&#xff0c;管理起来非常简单&#xff0c;但…...

win10下vscode+cmake编译C代码操作详解

0 工具准备 1.Visual Studio Code 1.85.1 2.cmake 3.24.01 前言 当我们只有一个.c文件时直接使用vscodeCode Runner插件即可完成编译&#xff0c;如果我们的工程很复杂包含多个.c文件时建议使用cmake来生成对应的make&#xff0c;指导编译器完成编译&#xff0c;否则会提示各…...

网络安全红队常用的攻击方法及路径

一、信息收集 收集的内容包括目标系统的组织架构、IT资产、敏感信息泄露、供应商信息等各个方面&#xff0c;通过对收集的信息进行梳理&#xff0c;定位到安全薄弱点&#xff0c;从而实施下一步的攻击行为。 域名收集 1.备案查询 天眼查爱企查官方ICP备案查询 通过以上三个…...

【基于openGauss2.1.0企业版安装X-Tuner参数调优工具】

【基于openGauss2.1.0企业版安装X-Tuner参数调优工具】 一、前提条件二、安装X-Tuner 2.1.0: 一、前提条件 已安装了openGauss2.1.0企业版 二、安装X-Tuner 2.1.0: 以root用户登录到服务器 安装以下依赖&#xff1a; yum -y groupinstall "Development tools" yum…...

SpringBoot+Vue轻松实现考试管理系统

简介 本系统基于 Spring Boot 搭建的方便易用、高颜值的教学管理平台&#xff0c;提供多租户、权限管理、考试、练习、在线学习等功能。主要功能为在线考试、练习、刷题&#xff0c;在线学习。课程内容支持图文、视频&#xff0c;考试类型支持考试、练习、问卷。 源码下载 网…...

详解Keras:keras.preprocessing.image

keras.preprocessing.image Keras 库中的一个模块&#xff0c;用于处理和增强图像数据&#xff0c;它提供了一些实用的函数&#xff0c;如图像的加载、预处理、增强等。 常用函数 1、load_img 用于加载图像文件&#xff0c;并返回一个 NumPy 数组表示该图像 示例 from ker…...

网站keywords多少字/最近热搜新闻事件

ExtJS 4.1 TabPanel动态加载页面并执行脚本 知道extjs是很久以前的事情&#xff0c;但是一直没有机会用到。不怕大家笑话&#xff0c;直到上个星期准备用它了&#xff0c;这才开始接触&#xff0c;没想到一开始就碰到难题。TablePanel动态加载页面很简单的&#xff0c;官方有示…...

到位app做网站需要些程序/万网域名注册查询

1、model转json # model转json字典 def serialize(model):columns [c.key for c in class_mapper(model.__class__).columns]data dict()for c in columns:v getattr(model, c)if type(v) datetime: # 日期类型在转json字符时会出错&#xff0c;所以需要提前格式化v date…...

如何做 旅游网站内容/鸿星尔克网络营销

前言 呵呵 最近看到了一系列跟 java编译器 相关的一系列的问题, 所以整理了一下 一下部分代码, 截图 基于 : jdk7u40, idea2019 的 bytecode viewer, jls7, jdk7 的 javac 1. 关于 javap 里面看不到 "<init>", "<clinit>" https://hllv…...

html代码中align center/seo工资多少

1.介绍 熟悉C#的lambda 表达式&#xff0c;想要使用 LINQ 在 Java&#xff0c;是个问题&#xff0c;虽然 Java8用函数式接口已经实现了部分lambda 表达式&#xff0c;但是还是不够灵活。2.Linqer简介 Linqer 是在 Java 中的可以使用 LINQ 语言集成查询 (LINQ)。可以弥补目前Jav…...

温州地区做网站/seo培训中心

云计算等技术极大地促进了服务器资源的分配和系统的部署&#xff0c;但随之而来的是资产管理中的安全风险。有些人没有及时回收资源和更新资产&#xff0c;在网上形成了僵尸主机&#xff0c;很容易成为攻击者的肉机。为有效保障企业工作的发展&#xff0c;相关法律法规明确要求…...

忻州网站制作/百度关键词优化多少钱一年

从mysql插入查询中获取新记录主键ID&#xff1f;好的&#xff0c;所以我可以说我在我的一个表中做了一个mysql item_id&#xff0c;该表的列为item_id&#xff0c;设置为autoincrement和primary key。如何让查询在同一查询中输出新生成的主键item_id的值&#xff1f;目前我正在…...