首页 > 数据库 >Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息

Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息

时间:2024-01-13 14:07:19浏览次数:36  
标签:SQLite allSockets Websocket log socket message textBox 发消息 AppendText


场景

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

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

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

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

在上面实现Websocket客户端的基础上,如何实现Websocket服务端,并实现定时给所有的客户端群发消息。

群发的消息从SQLite中读取,循环进行群发。

Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息_客户端

注:

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

实现

1、Fleck

GitHub - statianzo/Fleck: C# Websocket Implementation

新建Winform项目,并使用Nuget引入依赖

搜索Fleck

Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息_服务端_02

按照官网说明,快速实现Websocket服务端只需要

var server = new WebSocketServer("ws://0.0.0.0:8181");
server.Start(socket =>
{
  socket.OnOpen = () => Console.WriteLine("Open!");
  socket.OnClose = () => Console.WriteLine("Close!");
  socket.OnMessage = message => socket.Send(message);
});

并且官方提供了一些示例demo,比如群发消息的实现,这里是在控制台项目中的示例

var allSockets = new List<IWebSocketConnection>();
            var server = new WebSocketServer("ws://0.0.0.0:8181");
            server.Start(socket =>
                {
                    socket.OnOpen = () =>
                        {
                            Console.WriteLine("Open!");
                            allSockets.Add(socket);
                        };
                    socket.OnClose = () =>
                        {
                            Console.WriteLine("Close!");
                            allSockets.Remove(socket);
                        };
                    socket.OnMessage = message =>
                        {
                            Console.WriteLine(message);
                            allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
                        };
                });

demo位置

Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息_服务端_03

2、这里基于Winform设计窗体布局如下

Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息_客户端_04

3、启动服务端/开始监听按钮点击事件

新建WebSocketServer服务端对象,便于停止监听

public WebSocketServer wsServer= null;

新建一个list用来存储所有的客户端连接信息

private List<IWebSocketConnection> allSockets = new List<IWebSocketConnection>();

然后在开始监听按钮的点击事件中

private void button_start_listen_Click(object sender, EventArgs e)
        {
            try
            {
                allSockets.Clear();
                string wsAddress = textBox_server_address.Text.Trim();
                wsServer = new WebSocketServer(wsAddress);    //创建webscoket服务端实例
                wsServer.Start(socket => {
                    socket.OnOpen = () =>
                    {
                        //Console.WriteLine("Open");
                        allSockets.Add(socket);
                    };
                    socket.OnClose = () =>
                    {
                        //Console.WriteLine("Close");
                        allSockets.Remove(socket);
                    };
                    socket.OnMessage = message => {
                        //Console.WriteLine(message);                  
                    };
                    socket.OnError = message =>
                    {
                        //Console.WriteLine(message);
                    };
                });
                textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":监听成功");
                textBox_log.AppendText("\r\n");
            }
            catch (Exception exception)
            {
                textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":监听异常:" + exception.Message);
                textBox_log.AppendText("\r\n");
            }         
        }

在建立连接和关闭事件中分别对客户端的list进行添加和删除。

4、停止监听的按钮点击事件中

遍历所有客户端的list,循环进行关闭,并销毁服务端对象

private void button_stop_listen_Click(object sender, EventArgs e)
        {
            allSockets.ToList().ForEach(s => s.Close());
            wsServer.Dispose();
            textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":监听停止");
            textBox_log.AppendText("\r\n");
        }

5、单次群发按钮点击事件

private void button_single_mass_Click(object sender, EventArgs e)
        {
            if (null != wsServer)
            {
                string message = textBox_message.Text.Trim();
                allSockets.ToList().ForEach(s => {
                    if (s.IsAvailable)
                    {
                        s.Send(message);
                    }
                });
            }
            else {
                textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":wsServer未启动");
                textBox_log.AppendText("\r\n");
            }
        }

判断服务端对象不为空,遍历所有客户端list,判断如果可用则调用send方法,发送string类型的消息。

6、加载数据按钮实现

用来从SQLite中读取需要循环群发的消息内容

首先声明string的list用来存储加载的数据

private List<string> loadDataList = new List<string>();

然后按钮的点击事件中

private void button_load_data_Click(object sender, EventArgs e)
        {
            try
            {
                if (null == wsServer)
                {
                    textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":wsServer未启动");
                    textBox_log.AppendText("\r\n");
                }
                else
                {
                    loadDataList.Clear();
                    SQLiteDataReader reader = Global.Instance.sqlLiteHelper.ExecuteQuery("SELECT* FROM positions;");
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            string data = reader.GetString(reader.GetOrdinal("data"));
                            loadDataList.Add(data);
                        }
                    }
                    textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":加载数据完成,共("+ loadDataList.Count+")条。");
                    textBox_log.AppendText("\r\n");
                }
            }
            catch (Exception exception)
            {
                textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":加载数据异常:" + exception.Message);
                textBox_log.AppendText("\r\n");
            }
        }

7、定时群发实现

首先新建定时器以及加载的数据的索引

Timer _timerMass = new Timer();

private int index = 0;

定时群发按钮点击事件实现

private void button_start_mass_Click(object sender, EventArgs e)
        {
            if (null == wsServer) {
                textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":wsServer未启动");
                textBox_log.AppendText("\r\n");
            } else {
                _timerMass.Interval = (int)numericUpDown_mass.Value;
                _timerMass.Tick += _timer_Tick_Mass;
                _timerMass.Start();
                textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":定时群发已经启动!!");
                textBox_log.AppendText("\r\n");
            }
        }

定时器执行方法具体实现

private void _timer_Tick_Mass(object sender, EventArgs e)
        {
            if (loadDataList.Count>0) {
                if (index > loadDataList.Count - 1)
                {
                    index = 0;
                }
                string data = loadDataList[index];
                allSockets.ToList().ForEach(s => {
                    if (s.IsAvailable) {
                        s.Send(data);
                    }             
                });
                index++;
            }
        }

8、停止定时群发按钮点击事件实现

private void button_stop_mass_Click(object sender, EventArgs e)
        {
            //停止定时器
            _timerMass.Tick -= _timer_Tick_Mass;
            _timerMass.Stop();
            textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":定时群发已经停止!!!");
            textBox_log.AppendText("\r\n");
            index = 0;
        }

标签:SQLite,allSockets,Websocket,log,socket,message,textBox,发消息,AppendText
From: https://blog.51cto.com/BADAOLIUMANGQZ/9232146

相关文章

  • Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中
    场景SpringBoot+Vue整合WebSocket实现前后端消息推送:SpringBoot+Vue整合WebSocket实现前后端消息推送_websocketvue3.0springboot往客户端推送上面实现ws推送数据流程后,需要在windows上使用ws客户端定时记录收到的数据到文件中,这里文件使用SQLite数据库进行存储。Winform中操作S......
  • http和websocket的一些思考
    InCivetWeb,thetermsCivetHandlerandCivetWebSocketHandlerarerelatedtodifferenttypesofrequesthandling.CivetHandler:CivetHandlerisagenericclassinCivetWebthatisusedforhandlingHTTPrequests.Whenyoucreateaclassthatinheritsfr......
  • WebSocket与JavaScript:实现实时地理位置定位系统的关键技术
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • 如何使用WebSocket和JavaScript实现在线人脸识别系统
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • SpringBoot WebSocket 样例
    SpringBootWebSocket样例pom.xml依赖配置<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><dependency><groupId>javax.webso......
  • 用 Socket.D 替代原生 WebSocket 做前端开发
    socket.d.js是基于websocket包装的socket.d协议的实现。就是用ws传输数据,但功能更强大。功能原生websocketsocket.d说明listen有有监听消息send有有发消息sendAndRequest无有发消息并接收一个响应(类似于http)sendAndSubscribe无有发消息......
  • SpringBoot集成WebSocket实现消息推送
    一、前言WebSocket是一种新型的通信协议,它可以在客户端和服务端之间实现双向通信,具有低延迟、高效性等特点,适用于实时通信场景。它是一种基于TCP协议实现的全双工通信协议,使用它可以实现实时通信,不必担心HTTP协议的短连接问题。SpringBoot可以很方便的集成WebSocket实现高效实时的......
  • SQLite
    SQLite是一个轻量级的数据库系统,常用于嵌入式系统和桌面应用程序。以下是使用SQLite的基本步骤:安装SQLite:首先,确保你的系统上安装了SQLite。大多数Linux发行版和macOS都预装了SQLite。对于Windows,你可以从SQLite的官方网站下载。打开数据库连接:在Python中,你可以使用sqlite3模块来与......
  • go SSH远程终端及WebSocket
      目前chisel基于tcphttpwebsocket的ssh代理!!所以这个东西不就是可以直接远程登录了吗?就行jumpserver一样和chisel一样使用ssh goget"github.com/gorilla/websocket"goget"golang.org/x/crypto/ssh"//等库基于Web的Terminal终端控制台完成这样一个WebTermi......
  • aspnetcore使用websocket实时更新商品信息
    先演示一下效果,再展示代码逻辑。中间几次调用过程省略。。。暂时只用到了下面四个项目1.产品展示页面中第一次通过接口去获取数据库的列表数据///<summary>///获取指定的商品目录///</summary>///<paramname="pageSize"></param>///<paramname="pageIndex"></p......