場景
SpringBoot+Vue整合WebSocket實現(xiàn)前后端消息推送:
SpringBoot+Vue整合WebSocket實現(xiàn)前后端消息推送_websocket vue3.0 springboot 往客戶端推送-CSDN博客
上面實現(xiàn)ws推送數(shù)據(jù)流程后,需要在windows上使用ws客戶端定時記錄收到的數(shù)據(jù)到文件中,這里
文件使用SQLite數(shù)據(jù)庫進行存儲。
Winform中操作Sqlite數(shù)據(jù)增刪改查、程序啟動時執(zhí)行創(chuàng)建表初始化操作:
Winform中操作Sqlite數(shù)據(jù)增刪改查、程序啟動時執(zhí)行創(chuàng)建表初始化操作_winform sqllite-CSDN博客
Sqlite的操作參考如上。
注:
博客:
霸道流氓氣質(zhì)_C#,架構(gòu)之路,SpringBoot-CSDN博客
實現(xiàn)
1、引入WebSocket4Net依賴
使用Nuget搜索并安裝WebSocket4Net
2、設(shè)計頁面布局如下
3、websocket客戶端實現(xiàn)
聲明客戶端對象
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地址的校驗,只關(guān)注中間ws相關(guān)的代碼
??????????????? 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();
然后編寫其各種事件的具體實現(xiàn)。
實現(xiàn)方法中具體邏輯根據(jù)業(yè)務(wù)進行確定。
建立連接事件實現(xiàn)
??????? private void WebSocket4Net_Opened(object sender, EventArgs e)
??????? {
??????????? //允許跨線程調(diào)用
??????????? Control.CheckForIllegalCrossThreadCalls = false;
??????????? textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":ws建立連接成功");
??????????? textBox_log.AppendText("\r\n");
??????????? //向服務(wù)端發(fā)送消息
??????????? //webSocket4NetClient.Send("Client準(zhǔn)備發(fā)送數(shù)據(jù)!");
??????? }
收到消息事件實現(xiàn)
??????? private void WebSocket4Net_MessageReceived(object sender, MessageReceivedEventArgs e)
??????? {
??????????? //允許跨線程調(diào)用
??????????? Control.CheckForIllegalCrossThreadCalls = false;
??????????? //textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":收到消息:");
??????????? //textBox_log.AppendText("\r\n");
??????????? receviceString = e.Message;
??????? }
出錯事件實現(xiàn)
??????? private void Websocket_Error(object sender, EventArgs e)
??????? {
??????????? //允許跨線程調(diào)用
??????????? Control.CheckForIllegalCrossThreadCalls = false;
??????????? textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":Websocket_Error:"+e);
??????????? textBox_log.AppendText("\r\n");
??????? }
連接關(guān)閉事件實現(xiàn)
??????? private void Websocket_Closed(object sender, EventArgs e)
??????? {
??????????? //允許跨線程調(diào)用
??????????? Control.CheckForIllegalCrossThreadCalls = false;
??????????? textBox_log.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":Websocket_Closed");
??????????? textBox_log.AppendText("\r\n");
??????? }
ws連接關(guān)閉按鈕點擊實現(xiàn)
??????? private void button_ws_disconnec_Click(object sender, EventArgs e)
??????? {
??????????? webSocket4NetClient.Close();
??????? }
4、定時存儲實現(xiàn)
在上面收到消息時將數(shù)據(jù)賦值給變量
receviceString
聲明變量
private string receviceString = String.Empty;
添加Timer定時器
Timer _timer = new Timer();
定時存儲按鈕點擊事件實現(xiàn)
??????? 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 {
??????????????? //清空數(shù)據(jù)庫
??????????????? 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") + ":定時存儲已經(jīng)啟動!!");
??????????????? textBox_log.AppendText("\r\n");
??????????? }
??????? }
首先判斷ws是否連接上,如果連接上則將庫清空,然后獲取設(shè)置的定時頻率并啟動定時器
定時器具體實現(xiàn)
??????? 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數(shù)據(jù)并存儲進數(shù)據(jù)庫
??????????????????????? TimeSpan ts = DateTime.Now.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
??????????????????????? string timeSpan = Convert.ToInt64(ts.TotalSeconds).ToString();
??????????????????????? //插入數(shù)據(jù)
??????????????????????? 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") + ":定時存儲執(zhí)行異常:" + exception.Message);
??????????????? textBox_log.AppendText("\r\n");
??????????? }????????
??????? }
首頁也要判斷是否連接,然后判斷receviceString是否為空,避免ws未傳輸數(shù)據(jù),會定時存儲空數(shù)據(jù)。
不為空則將時間和收到的數(shù)據(jù)存儲進數(shù)據(jù)庫。
停止定時存儲按鈕點擊事件
??????? 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") + ":定時存儲已經(jīng)停止!!!");
??????????? textBox_log.AppendText("\r\n");
??????????? receviceString = String.Empty;
??????? }
5、運行效果文章來源:http://www.zghlxwxcb.cn/news/detail-835054.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-835054.html
到了這里,關(guān)于Winform中使用Websocket4Net實現(xiàn)Websocket客戶端并定時存儲接收數(shù)據(jù)到SQLite中的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!