C# 实现WebScoket客户端

C# 实现WebScoket客户端
含登录授权功能

using System;
using System.Text;
using System.Threading;
using System.Collections.Concurrent;
using System.Net.WebSockets;
using Newtonsoft.Json.Linq;
using System.Net;
using System.IO;using MultiCore.ViewModel;namespace MultiCore.Common
{public class WebSocketClient{private static GlobalViewModel globalModel = GlobalViewModel.GetInstance();private static LogHelper log = new LogHelper(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);private static BlockingCollection<string> msgRecords = new BlockingCollection<string>();private static object locker_send = new object();private static bool sendToken = false;private static int seqno;private static string tokenstr = string.Empty;public static void HandleMsgs(){while (true){try{var msg = WebSocketClient.msgRecords.Take();JObject jObj = JObject.Parse(msg);JToken typeToken = jObj["type"];JToken dataToken = jObj["data"];var typestr = typeToken.ToString();var datastr = dataToken.ToString();if (typestr == "Msglog"){globalModel.logRecords.Add(datastr);}else if (typestr == "fi_msg_rsp"){log.LogInfo("Got fi_msg_rsp:" + datastr);JObject jObj2 = JObject.Parse(datastr);JToken codeToken = jObj2["code"];if ((int)codeToken != 0){log.LogError("wrong fi_msg_rsp!");}}else{log.LogError("Unknown websocket message type:" + msg);}}catch (Exception ex){log.LogError("WebSocketClient.HandleMsgs exception:" + ex.Message);log.LogError(ex.StackTrace);}}}public static void Start(){//resetsendToken = false;seqno = 0;tokenstr = string.Empty;var wsCfg = ClientConfig.GetConfig().WebSocket;//用户登录验证,获取tokenif (wsCfg.SkipAuth){tokenstr = "99999999";}else{try{JObject submsg = new JObject();submsg.Add(new JProperty("user_name", wsCfg.Username));submsg.Add(new JProperty("password", wsCfg.Password));JObject sendmsg = new JObject();sendmsg.Add(new JProperty("data", submsg));var senddatastr = sendmsg.ToString();log.LogInfo("http post data:" + senddatastr);var senddata = Encoding.UTF8.GetBytes(senddatastr);string url = string.Format($"http://{wsCfg.Host}:{wsCfg.HTTPPort}/auth/login");var request = (HttpWebRequest)WebRequest.Create(url);request.Method = "POST";request.ContentType = "application/json";var requestStream = request.GetRequestStream();requestStream.Write(senddata, 0, senddata.Length);using (var response = (HttpWebResponse)request.GetResponse()){using (var reader = new StreamReader(response.GetResponseStream())){var content = reader.ReadToEnd();log.LogInfo("http response stream:" + content);JObject jObj = JObject.Parse(content);JToken codeToken = jObj["code"];//JToken msgToken = jObj["msg"];if ((int)codeToken == 0){// cookiestr:"token=7278972820774715393;Path=/, token_5555=7278972820774715393;Path=/"var cookiestr = response.Headers.Get("Set-Cookie");//获取Cookielog.LogInfo("cookiestr:" + cookiestr);int pos1 = cookiestr.IndexOf("token");if (pos1 >= 0){int pos2 = cookiestr.IndexOf("=", pos1);if (pos2 > 0){int pos3 = cookiestr.IndexOf(";", pos2);tokenstr = cookiestr.Substring(pos2 + 1, pos3 - pos2 - 1);}}if (string.IsNullOrWhiteSpace(tokenstr)){log.LogError("tokenstr is null or empty!");LogHelper.LogRecords.Add(new Model.LogInfo(CommonData.GuicmdCode, CommonData.GuiError, "tokenstr is null or empty!"));}}else{log.LogError("http auth error!" + content);LogHelper.LogRecords.Add(new Model.LogInfo(CommonData.GuicmdCode, CommonData.GuiError, "http auth error!" + content));}}}}catch (Exception ex){log.LogError("http auth exception:" + ex.Message);LogHelper.LogRecords.Add(new Model.LogInfo(CommonData.GuicmdCode, CommonData.GuiError, "http auth exception:" + ex.Message));}}log.LogInfo("tokenstr:" + tokenstr);if (string.IsNullOrWhiteSpace(tokenstr)){log.LogError("http auth failed!");LogHelper.LogRecords.Add(new Model.LogInfo(CommonData.GuicmdCode, CommonData.GuiError, "http auth failed!"));return;}using (ClientWebSocket wsclient = new ClientWebSocket()){try{var uri = string.Format($"ws://{wsCfg.Host}:{wsCfg.WSPort}");wsclient.ConnectAsync(new Uri(uri), CancellationToken.None).Wait(5 * 1000); // timeout = 5秒log.LogInfo("WebSocket ConnectAsync State: " + wsclient.State);}catch (Exception ex){log.LogError("Websocket connect exception:" + ex.Message);throw ex;}if (wsclient.State != WebSocketState.Open){log.LogError("Websocket state error: " + wsclient.State);throw (new Exception("Websocket state error"));}log.LogInfo("Websocket connected " + wsclient.State);LogHelper.LogRecords.Add(new Model.LogInfo(CommonData.GuiWebsocketErr, CommonData.Guicmd, "Websocket connected state:" + wsclient.State));if (wsCfg.SubMsgTypes.Contains("Msglog")){Subscribe(wsclient, "Msglog");}try{const int BUFLEN = 1024 * 1024;byte[] buf = new byte[BUFLEN];int offset = 0;while (wsclient.State == WebSocketState.Open){//var result = await ws.ReceiveAsync(new ArraySegment<byte>(buf, offset, BUFLEN - offset), CancellationToken.None);var task = wsclient.ReceiveAsync(new ArraySegment<byte>(buf, offset, BUFLEN - offset), CancellationToken.None);task.Wait();var result = task.Result;if (result.MessageType == WebSocketMessageType.Close){log.LogError("==WebSocketMessageType.Close== WebSocket State: " + wsclient.State);throw (new Exception("WebSocket is closed by server"));}else{//log.LogInfo("==WebSocket== Received Count:[" + result.Count + "] EndOfMessage:[" + result.EndOfMessage + "] data:" + Encoding.ASCII.GetString(buf, offset, result.Count));//should comment out in prodoffset += result.Count;if (result.EndOfMessage){string msg = Encoding.UTF8.GetString(buf, 0, offset);WebSocketClient.msgRecords.Add(msg);//DateTime dt2 = DateTime.Now;//log.LogInfo(typestr + " spend:" + (dt2 - dt1).TotalMilliseconds);offset = 0;}//else//{//    log.LogInfo("WebSocket Received Count:[" + result.Count + "] EndOfMessage:[" //        + result.EndOfMessage + "] data:" + Encoding.ASCII.GetString(buf, 0, offset));//}}}}catch (Exception ex){log.LogError("WebSocket Recv excpetion: " + ex.Message);log.LogError("WebSocket state: " + wsclient.State);//wsclient.CloseAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None).Wait();throw ex;}}}private static void Subscribe(ClientWebSocket wsclient, string msgname, int interval_ms = 0){lock (locker_send){if (!sendToken){JObject sendmsg = new JObject();sendmsg.Add(new JProperty("type", "token_sub"));JObject submsg = new JObject();submsg.Add(new JProperty("token", tokenstr));submsg.Add(new JProperty("disable_sub_all", 1));sendmsg.Add(new JProperty("data", submsg));string request = sendmsg.ToString();log.LogInfo(string.Format("WebSocket send request {0}", request));//log.LogInfo(string.Format("WebSocket send tokenmsg {0}", submsg.ToString()));byte[] data = Encoding.ASCII.GetBytes($"{request}");wsclient.SendAsync(new ArraySegment<byte>(data), WebSocketMessageType.Text, true, CancellationToken.None).Wait();sendToken = true;seqno++;}{JObject sendmsg = new JObject();sendmsg.Add(new JProperty("seqno", seqno++));sendmsg.Add(new JProperty("type", "table_action"));JObject submsg = new JObject();submsg.Add(new JProperty("msg_name", msgname));submsg.Add(new JProperty("action", "sub"));submsg.Add(new JProperty("interval_ms", interval_ms));submsg.Add(new JProperty("disable_snap", 1));sendmsg.Add(new JProperty("data", submsg));string request = sendmsg.ToString();log.LogInfo(string.Format("WebSocket send request {0}", request));//log.LogInfo(string.Format("WebSocket send tokenmsg {0}", submsg.ToString()));byte[] data = Encoding.ASCII.GetBytes($"{request}");wsclient.SendAsync(new ArraySegment<byte>(data), WebSocketMessageType.Text, true, CancellationToken.None).Wait();}}}}
}

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

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

相关文章

【CanMV K230】外接传感器

【CanMV K230】外接传感器 外接LED灯 B站视频链接 抖音链接 我们后面主要做是机器视觉。K230能帮我们捕捉到图像信息。更多小功能需要我们自己来做。 比如舵机抬杆&#xff0c;测温报警等 都需要我们外接传感器。 本篇就来分享一下如何使用K230外接传感器 首先需要知道K230…

栈OJ题——有效的括号

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 有效的括号 题目描述&#xff1a;给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。括号匹配。 二、…

Windows Edge浏览器对Web Authentication API的支持分析与实践应用

随着网络技术的发展&#xff0c;Web安全认证方式也在不断进步。Web Authentication API&#xff08;通常称为WebAuthn&#xff09;是一个现代的Web标准&#xff0c;旨在提供更安全、更便捷的认证机制。它支持多种认证方式&#xff0c;包括生物识别技术、硬件令牌和手机认证等。…

Pycharm module ‘serial‘ has no attribute ‘Serial‘

已经pip install serial 已经提示安装成功了&#xff0c;提示没有Serial的属性&#xff0c;经过查询 &#xff0c;发现安装的模块不对&#xff0c;应该安装pyserial模块。 解决步骤 第一步&#xff1a;卸载serial pip uninstall serial 第二步&#xff1a;安装pyserial pip u…

【2025校招】4399 NLP算法工程师笔试题

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/19 &#x1f504; 输入输出&#xff1a;ACM格式 ⏳ 时长&#xff1a;2h 本试卷分为单选&#xff0c;自我评价题&#xff0c;编程题 单选和自我评价这里不再介绍&#xff0c;4399的编程题一如既往地抽象&#xff…

高级调度1

一.初始化容器InitContainer 1.定义 initContainers 是 Kubernetes Pod 中的一个功能&#xff0c;用于在主容器启动之前执行初始化任务。initContainers 与主容器的作用不同&#xff0c;它们在主容器启动之前运行&#xff0c;并且可以完成准备工作&#xff0c;如下载依赖、配…

Nginx: 反向代理之upstream模块以及完整配置反向代理示例

upstream模块 对于upstream模块而说&#xff0c;它默认已经被编译进Nginx中了想禁用的话&#xff0c;通过 –without-http_upstream_model 这样一个参数来明确的禁用 1 &#xff09;基本用法 1.1 upstream 语法&#xff1a; upstream name { … }默认值&#xff1a;无上下文…

xss-labs通关攻略 11-15关

第十一关&#xff1a;less-11 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;添加referer:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第十二关&#xff1a;less-12 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;修改User A…

springboot集成elasticsearch(7.17.22)

官方文档地址&#xff1a;Javadoc | Elasticsearch Java API Client [7.17] | Elastic springboot版本2.1.3 1.pom文件 以下是如何使用maven作为依赖关系管理器配置依赖关系。将以下内容添加到pom.xml文件中&#xff1a; 注&#xff1a;版本号一定要和elasticsearch的版本号…

IDEA2022配置JDK1.8版本与Maven3.3依赖包

第一步&#xff1a; 根据window / linux环境&#xff0c;安装不同IDEA2022 和 下载不同JDK1.8。 Maven依赖包可在不同环境共用&#xff0c;但需要更换Maven依赖包中conf > settings.xml。 第二步&#xff1a; 配置IEDA中JDK1.8版本 File > Project Structure > Proj…

如何使用JMeter的JSON提取器解析JSON响应

在性能测试和API测试中&#xff0c;经常需要处理JSON格式的数据。Apache JMeter提供了一个强大的工具——JSON提取器&#xff0c;用于从JSON响应中提取特定的值。本文将通过一个实际的例子&#xff0c;演示如何使用JMeter的JSON提取器来解析JSON响应。 背景 假设我们收到了一…

gevent 入门篇

gevent 入门篇 并发编程模型主要有: 多进程,多线程,事件驱动, 协程. gevent 是基于协程的异步框架,它需要依赖于greenlet.gevent有什么样的优势? 先来通过一个简单的例子对比同步执行一个方法和使用gevent的异步方式. 普通的单线程同步执行任务 import timedef sync_task()…

Chrome 渲染器中的对象转换到 RCE

在本文中,我将利用CVE-2024-5830,这是 Chrome 的 JavaScript 引擎 v8 中的一个类型混淆错误,我于 2024 年 5 月将其报告为错误 342456991。该错误已在版本126.0.6478.56/57中修复。此错误允许通过一次访问恶意网站在 Chrome 的渲染器沙箱中执行远程代码执行 (RCE)。 V8 中的…

前端Html5/Css3—div盒子模型

文章目录 第六章 盒子模型6.1 border边框6.2 border-width粗细6.3 border-style边框样式6.4 border简写6.5 margin外边距6.6 padding内边距6.7 盒子模型尺寸6.8 box-sizing6.9 border-radius圆角边框6.9.1 制作圆形6.9.2 半圆6.9.3 四分之一圆 6.10 box-shadow盒子阴影 第六章 …

速盾:中小企业网站cdn加速方案?

中小企业网站在如今的互联网时代中起到了非常重要的作用&#xff0c;能够帮助企业提升品牌形象、增加曝光度、吸引潜在客户等。然而&#xff0c;随着用户对网页加载速度的要求越来越高&#xff0c;网站的访问速度成为决定用户是否留在网站的关键因素之一。为了提升网站的访问速…

通过css,js html结合实现第一个页面

html以及 js代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><link …

react调用子组件方法`TS2304: Cannot find name ‘Ref‘`

文章目录 发现宝藏1. 使用正确的 React.Ref 类型2. 使用 React.Ref 或 React.RefObject 作为 ref 类型3. 确保你的 tsconfig.json 设置正确总结 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

【机器学习】独立成分分析的基本概念、应用领域、具体实例(含python代码)以及ICA和PCA的联系和区别

引言 独立成分分析&#xff08;Independent Component Analysis&#xff0c;简称ICA&#xff09;是一种统计方法&#xff0c;用于从多个观察到的混合信号中提取出原始的独立信号源 文章目录 引言一、独立成分分析1.1 定义1.2 独立成分分析的基本原理1.3 独立成分分析的步骤1.3.…

Java重修笔记 第四十三天 Set 集合、HashSet 类

Set 接口 1. 它是无序的&#xff08;添加和取出的顺序不一致&#xff0c;但取出的结果是固定的&#xff09;&#xff0c;没有索引 2. Set 接口也是 Collection 的子接口&#xff0c;所以继承了 Collection 的方法 3. Set 接口的遍历方式有两种&#xff0c;迭代器和增强 for…

计算机专业的真正的就业情况

首先听到计算机行业&#xff0c;大多数人岗位已经饱和&#xff0c;前端已死&#xff0c;程序员35岁危机。但是事实上这些认知都是片面的&#xff0c;今天由我来为大家分析计算机行业的内幕。 疫情过后&#xff0c;过内各种行业都受到了冲击&#xff0c;你们敢说除了体制内的行业…