From a70384370a3aa63099de064ad7f44988f93044bf Mon Sep 17 00:00:00 2001 From: Hinse <756681202@qq.com> Date: Wed, 11 Aug 2021 08:19:44 +0800 Subject: [PATCH] =?UTF-8?q?websocket=E6=B5=8B=E8=AF=95=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + Waste.sln | 7 + .../DesignTimeBuild/.dtbcache.v2 | Bin 0 -> 75742 bytes .../.vs/WasteConsoleTest/v16/.suo | Bin 0 -> 52224 bytes WasteConsoleTest/.vs/slnx.sqlite | Bin 0 -> 90112 bytes WasteConsoleTest/.vs/slnx.sqlite-journal | Bin 0 -> 21032 bytes WasteConsoleTest/WasteConsoleTest.sln | 25 ++ WasteConsoleTest/WasteConsoleTest/Program.cs | 395 ++++++++++++++++++ .../WasteConsoleTest/WSocketClientHelp.cs | 239 +++++++++++ .../WasteConsoleTest/WasteConsoleTest.csproj | 16 + 10 files changed, 684 insertions(+) create mode 100644 WasteConsoleTest/.vs/WasteConsoleTest/DesignTimeBuild/.dtbcache.v2 create mode 100644 WasteConsoleTest/.vs/WasteConsoleTest/v16/.suo create mode 100644 WasteConsoleTest/.vs/slnx.sqlite create mode 100644 WasteConsoleTest/.vs/slnx.sqlite-journal create mode 100644 WasteConsoleTest/WasteConsoleTest.sln create mode 100644 WasteConsoleTest/WasteConsoleTest/Program.cs create mode 100644 WasteConsoleTest/WasteConsoleTest/WSocketClientHelp.cs create mode 100644 WasteConsoleTest/WasteConsoleTest/WasteConsoleTest.csproj diff --git a/.gitignore b/.gitignore index 31f9861..6166492 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ /Waste.Web.Entry/bin /Waste.Web.Entry/obj /.vs +/WasteConsoleTest/WasteConsoleTest/obj +/WasteConsoleTest/WasteConsoleTest/bin diff --git a/Waste.sln b/Waste.sln index 4fcd07c..cc775ed 100644 --- a/Waste.sln +++ b/Waste.sln @@ -25,6 +25,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Waste.Socket", "Waste.Socke EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Waste.MessageHandler", "Waste.MessageHandler\Waste.MessageHandler.csproj", "{49EB30D4-FEB7-42FB-87A1-BE0440413392}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WasteConsoleTest", "WasteConsoleTest\WasteConsoleTest\WasteConsoleTest.csproj", "{AB59B811-AADC-439B-9394-73CFF8F64C6F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -67,6 +69,10 @@ Global {49EB30D4-FEB7-42FB-87A1-BE0440413392}.Debug|Any CPU.Build.0 = Debug|Any CPU {49EB30D4-FEB7-42FB-87A1-BE0440413392}.Release|Any CPU.ActiveCfg = Release|Any CPU {49EB30D4-FEB7-42FB-87A1-BE0440413392}.Release|Any CPU.Build.0 = Release|Any CPU + {AB59B811-AADC-439B-9394-73CFF8F64C6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB59B811-AADC-439B-9394-73CFF8F64C6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB59B811-AADC-439B-9394-73CFF8F64C6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB59B811-AADC-439B-9394-73CFF8F64C6F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -81,6 +87,7 @@ Global {AE2A0447-5722-4D5B-89A5-6355E29FB706} = {A10953C4-FF58-42A1-AAEF-7B68018F5EDB} {82C5EF90-C84C-4A83-A732-B82E0E429BDF} = {A10953C4-FF58-42A1-AAEF-7B68018F5EDB} {49EB30D4-FEB7-42FB-87A1-BE0440413392} = {A10953C4-FF58-42A1-AAEF-7B68018F5EDB} + {AB59B811-AADC-439B-9394-73CFF8F64C6F} = {A10953C4-FF58-42A1-AAEF-7B68018F5EDB} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {086B267B-9152-4816-8D48-30032ACB8A2C} diff --git a/WasteConsoleTest/.vs/WasteConsoleTest/DesignTimeBuild/.dtbcache.v2 b/WasteConsoleTest/.vs/WasteConsoleTest/DesignTimeBuild/.dtbcache.v2 new file mode 100644 index 0000000000000000000000000000000000000000..a2bfc5a30420be09e72b4511fc4c479128c870d5 GIT binary patch literal 75742 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 literal 0 HcmV?d00001 diff --git a/WasteConsoleTest/.vs/slnx.sqlite b/WasteConsoleTest/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..c0861d31178a148f8505719a85319e4995cd830f GIT binary patch literal 90112 zcmeI4&u<&Y6~{?Y)=HFUDv4ztbjTh8SX+ydCD;Aoz(6T-Wp7N86o1GORDxKEYkLuL zX_G6*0&=0<7-$R_$e++tbM0TyOMw0l&9#T#dMHpJ$fYy8JNsjHX)|?KN`Bbu1M*>(9gz39@AIgS ziP*-^#YZ6%TisV%;h2@*#+EH-WrZikh37I@G^KP`6CAF(X8+Un(ah~QFlc-=*%$JKr>T9W- z&(&n<%R5U#CYz0al{MAlj>fyrAEz8+>baew9N~E?xn^?-K~&mJ!nZEpm8)W{Q=9+tgbRl^vWZoK;0tG=ZqD2a@G93Ty<^x)-B03nB&S+ zc27H$(W}Qxv7>X`hE>v3H`<{H*pqAMF4W%J({_T_Y@)N=n1cMIqB7dDXJ=%ChuC zH4LqvS5F>mt+45Kmhpm1!7SsONA}~(IbMgvUU>AT^sxj(FV_rG1$`_V_Xz?>E*pyyGZA~BJHEa+j%LNAbhhg zMfj%krHXB{7v&SIL`KemSL>`gM%PpHb&e&$yH$8)K-o0K9VNUBEUE*ud_2(l&or_u z@+z;hS`-WNZmvfB*=900@8p2!H?xfB*=900@A<^blB#CsyOmcMuXu;#VU5Z7luQ^tb7M zOplZB1Oz|;1V8`;KmY_l00ck)1V8`;rj5W#Vly84YCz&jA{*zw7%;P(xV8}Z5&(Vv zPyXm1FAx9$5C8!X009sH0T2KI5C8!X0D&ncK%f6(|3AeO4A(#a1V8`;KmY_l00ck) z1V8`;K!6ay{vTlg0w4eaAOHd&00JNY0w4eaAOHf>PXPP>>7QeG2m&Ag0w4eaAOHd& z00JNY0w4ea`1^mv00@8p2!H?xfB*=900@8p2!H?xOg{lU|DXOjhKC>k0w4eaAOHd& z00JNY0w4eaAb{uphyf4)0T2KI5C8!X009sH0T2KI5SV@fc>X{Aa|{nb00ck)1V8`; zKmY_l00ck)1V8}K{}BTq00JNY0w4eaAOHd&00JNY0w6H`1n~TS`sWxPf&d7B00@8p z2!H?xfB*=900@8p_Wy_h5C8!X009sH0T2KI5C8!X009t~eggRZ|Mbr>JOlv{009sH z0T2KI5C8!X009sH0lNQB3W-?y7nlEbd9d`&((>Z{V|IWJ)>oRG#>5h9ZhMslqjKezAESHvZ#~_ z@~7g_M13?~yK+^m zRF%D4^-#PoABwp~y{wc-w|jD_POKt7jbd@#>7~-|J=5D-->=PNY!NyMRe4vg%B8$q z6OWjNY?!)v)?9N>kS-)oh0I%{QlKCRhJ3Cd2bv0UQTCdcF*d-`L9Uv=m#eOA-?}Ba z26J4Q%I;~WbGCn~cJzn3){g2RI3G;!K8X^K7xS34=1xwu!9YLOJJdxND=)^yU`Wn$ z*$B(GXl zURjo&sD`2S^XkcCtra%i&N5zbDVSw^^T>XDImhde*b9%|lwLNHR>r+*S{cV{@yCn7 zjN_Zh_$=f2CV$RMka5n0M%f&SoIu7|^Iyi50i0~eBs5~9LLBthMloZ<_d}1dZ6_OB+){Z|3z$G$VgKB<;PYWvd--8 zgGUR&7z{T0B9JxsCuxGnvm?Vb*mlP&vp2?8SvIcg>Lki^%5DonM$WP+;{&->QTv)< zwrJVr+vX$ZkC*cI;G0Tbj4l|WuFmV^a%P#pE6`XT?#v09&q(Dv^D3V&3!S0En!fty z6BitRoFx#iHm0{RzP-hXl}r9*QD|67CEDP*F$Q~@V~mReFTK1sYZvLfSEPNkcsnlz z6NGQ}r3l}2zErVo_M&`(mB`3B@M@h^$LM;BzRs~Ec()3#3@DqXxTA!Zfkky-mX8No z|CvUXMPB7~R*Pam-pw_Nb@Al1Z)L2>$}~yxUP8!ht;UBRT4_?#Oj9==Svl>jx9u~t z!FUSGSz%-?_icqyNh?)m<}%l>#}BQ@89XIxG_5tzo}Ow3S+xZZ6M?wl8rKXG{Od$h z8s3cynbpi0?=4`p=Bb_Y(5rutL44Ws9xrh^+>to9oklU$JFx5Mud4mk=@$Hk2g2eg=PL1Ux?R! zdrc&7l?~TT;)maB^RcIE`^QZsm9BU)N~uJ4p`Va_XNUxq+^vyqy(dkaiI}B3etT%q zVc1E@NhR6r);4~&&e=V110$7uo3WD^NlYDOTX>F0fZik9K=gk(&e(%^eCveqgg0>rPyOZ*^os@SO z7{87`$Fjz`*wp1ugEx-qYX6aDMqPzQ+^Na;3{!hPi3Z&`Y`;hDI@}E0b+DF)Rqdfh ziouE2azD{{U^gDU*l?S#j7k<)BD$-{ba8daY`LFp1IUJ9dwHDE1?`Duv{l0#WAq2( zjgIVUtkIlSQ+lZXM literal 0 HcmV?d00001 diff --git a/WasteConsoleTest/.vs/slnx.sqlite-journal b/WasteConsoleTest/.vs/slnx.sqlite-journal new file mode 100644 index 0000000000000000000000000000000000000000..22e3f2c1b07d029fd0cb12e0ac6dfafce87f197b GIT binary patch literal 21032 zcmeI(%?ScA5C+hR!5 + { + services.AddHttpClient(); + services.AddTransient(); + }).UseConsoleLifetime(); + var host = builder.Build(); + wSocketClient = new WSocketClientHelp("wss://api.device.suzhou.ljflytjl.cn/device_rpc"); + wSocketClient.OnOpen -= WSocketClient_OnOpen; + wSocketClient.OnMessage -= WSocketClient_OnMessage; + wSocketClient.OnClose -= WSocketClient_OnClose; + wSocketClient.OnError -= WSocketClient_OnError; + + wSocketClient.OnOpen += WSocketClient_OnOpen; + wSocketClient.OnMessage += WSocketClient_OnMessage; + wSocketClient.OnClose += WSocketClient_OnClose; + wSocketClient.OnError += WSocketClient_OnError; + wSocketClient.Open(); + var myService = host.Services.GetRequiredService(); + SetTimeOut(); + while (true) + { + string cmd = Console.ReadLine(); + //退出 + if (cmd == "exit") + { + Console.WriteLine("退出请求"); + wSocketClient.Close(); + break; + } + else + //测试sayhello + if (cmd.ToLower() == "sayhello") + { + var senddata = @"{ + ""type"": 1, + ""invocationId"": ""Nil"", + ""target"": ""sayHello"", + ""arguments"": [ + ""Hello Test Message"" + ] +}"; + wSocketClient.Send(senddata); + } + //获取token + else if (cmd.ToLower() == "gettoken") + { + var senddata = @"{ + ""type"": 1, + ""invocationId"": ""Nil"", + ""target"": ""getToken"", + ""arguments"": [ + ""sz_data"" + ] +}"; + wSocketClient.Send(senddata); + } + //测试token的有效期 + else if (cmd.ToLower() == "testtoken") + { + await myService.TestTokenAsync(); + } + //测试上报 + else if (cmd.ToLower() == "postdata") + { + await myService.Garbages(); + } + } + } + private static void WSocketClient_OnError(object sender, Exception ex) + { + Console.WriteLine($"发生异常:{ex.Message}"); + } + + private static void WSocketClient_OnClose(object sender, EventArgs e) + { + Console.WriteLine($"已关闭"); + } + + private static void WSocketClient_OnMessage(object sender, string data) + { + //处理的消息错误将会忽略 + try + { + //查看数据是否有token + var jsondata = JsonConvert.DeserializeObject(data); + if (jsondata != null && jsondata.type == 1 && !string.IsNullOrEmpty(jsondata.target) && jsondata.target.ToLower() == "token" && jsondata.arguments != null && jsondata.arguments.Count == 1) + { + var token = jsondata.arguments.First(); + //保存token到文件中 + var path = AppDomain.CurrentDomain.BaseDirectory + "File"; + var filePath = path + @"\token.txt"; + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + using (var fileStream = new FileStream(filePath, FileMode.CreateNew)) + { + byte[] content = Encoding.UTF8.GetBytes(token); + fileStream.Write(content, 0, content.Length); + } + } + Console.WriteLine($"{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")},收到的消息:{data}"); + } + catch (Exception ex) + { + + } + + } + + public interface IMyService + { + /// + /// 测试token有效期 + /// + Task TestTokenAsync(); + /// + /// 传送垃圾数据 + /// + /// + Task Garbages(); + } + + public class MyService : IMyService + { + private readonly IHttpClientFactory _clientFactory; + + public MyService(IHttpClientFactory clientFactory) + { + _clientFactory = clientFactory; + } + /// + /// 传送垃圾数据 + /// + /// + public async Task Garbages() + { + try + { + string token = gettoken(); + if (!string.IsNullOrEmpty(token)) + { + int timestamp = GetTimestamp(); + var garbageC2SDto = new GarbageC2SDto + { + weight = 10.01, + trash = "251658245", + scanningTime = timestamp, + d_status = 0, + type = 1 + }; + int nonce = GetNonce(); + string[] paramlist = new string[] { + garbageC2SDto.weight.ToString(),garbageC2SDto.trash,garbageC2SDto.type.ToString(),garbageC2SDto.scanningTime.ToString(),garbageC2SDto.d_status.ToString() + }; + string sign = GetUserApiSign(Secret, paramlist); + var request = new HttpRequestMessage(HttpMethod.Post, +"https://api.data.suzhou.ljflytjl.cn/api/Garbages"); + request.Headers.Add("Authorization", $"Bearer {token}"); + request.Headers.Add("secret", Secret); + request.Headers.Add("nonce", nonce.ToString()); + request.Headers.Add("time", timestamp.ToString()); + request.Headers.Add("sign", sign); + var message = JsonConvert.SerializeObject(garbageC2SDto); + request.Content = new StringContent(message, Encoding.UTF8, "application/json"); + var client = _clientFactory.CreateClient(); + var response = await client.SendAsync(request); + var result = await response.Content.ReadAsStringAsync(); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"上报成功:{result}"); + } + else + { + Console.WriteLine($"上报失败:{response.StatusCode},{result}"); + } + } + else + { + Console.Write("token未找到"); + } + } + catch (Exception ex) + { + + + } + } + + /// + /// 测试token有效期 + /// + public async Task TestTokenAsync() + { + var request = new HttpRequestMessage(HttpMethod.Get, + "https://api.data.suzhou.ljflytjl.cn/api/hello/device"); + string token = gettoken(); + if (!string.IsNullOrEmpty(token)) + { + request.Headers.Add("Authorization", $"Bearer {token}"); + var client = _clientFactory.CreateClient(); + var response = await client.SendAsync(request); + var result = await response.Content.ReadAsStringAsync(); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"token可用:{result}"); + } + else + { + Console.WriteLine($"token已过期:{response.StatusCode},{result}"); + } + } + else + { + Console.Write("token未找到"); + } + } + /// + /// 获取时间戳 + /// + /// + private int GetTimestamp() + { + DateTime utcTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now); + DateTime utcStartTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); + int timestamp = Convert.ToInt32((utcTime-utcStartTime).TotalSeconds); + return timestamp; + } + /// + /// 获取随机数 + /// + /// + public int GetNonce() + { + var random = new Random(); + int nonce = random.Next(1, Int32.MaxValue); + return nonce; + } + /// + /// 获取签名 + /// + /// + /// + /// + public string GetUserApiSign(string secret, params string[] dataparams) + { + StringBuilder sb = new StringBuilder(); + string ApiSecret = "EtifGTppTL0TTjie"; + if (dataparams != null && dataparams.Length > 0) + { + foreach (var item in dataparams) + { + sb.Append(item); + } + } + if (!string.IsNullOrEmpty(secret)) + { + sb.Append(secret); + } + else + { + sb.Append(ApiSecret); + } + string str = sb.ToString(); + MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); + string sign = System.BitConverter.ToString(md5.ComputeHash(System.Text.UTF8Encoding.Default.GetBytes(str)), 4, 8).Replace("-", ""); + sign = sign.ToLower(); + return sign; + } + /// + /// 获取token + /// + /// + private string gettoken() + { + var filePath = AppDomain.CurrentDomain.BaseDirectory + @"File\token.txt"; + string token = string.Empty; + if (File.Exists(filePath)) + { + token = File.ReadAllText(filePath); + } + return token; + } + } + /// + /// 向服务端推送测试用垃圾采集数据 + /// + public class GarbageC2SDto //客户端向服务端请求的DTO + { + /// + /// 垃圾称重数据,64位浮点进度,单位为千克 + /// + public double weight { get; set; } + /// + /// 垃圾桶编码 + /// + public string trash { get; set; } + /// + /// 垃圾类型,缺省类型 : 0,厨余垃圾 : 1,可回收物 : 2,有害垃圾 : 3,其他垃圾 : 4 + /// + + public int type { get; set; } + /// + /// 数据扫描时间,UNIX时间戳 + /// + public int scanningTime { get; set; } + /// + /// 设备状态,使用中 : 0:使用中,异常 : 1,检修 : 2,检修结束 : 3,启用 : 4,未知 : 5 + /// + public int d_status { get; set; } + } + /// + /// 响应的数据 + /// + public class ResponseData + { + /// + /// 类型,6-心跳包,1-token,3-其他 + /// + public int type { get; set; } + /// + /// 请求id + /// + public string invocationId { get; set; } + /// + /// 结果 + /// + public string result { get; set; } + /// + /// 目标 + /// + public string target { get; set; } + /// + /// 参数 + /// + public List arguments { get; set; } + } + + private static void WSocketClient_OnOpen(object sender, EventArgs e) + { + Console.WriteLine($"已连接"); + } + public static void SetTimeOut() + { + Task.Run(() => + { + DateTime startime = DateTime.Now; + while (wSocketClient.State == WebSocketState.Open) + { + if ((DateTime.Now - startime).TotalSeconds >= 13) + { + //发送心跳包 + var message = @"{ + ""type"": 6 + }"; + wSocketClient.Send(message); + } + } + }); + } + private static byte[] RemoveSeparator(byte[] data) + { + List t = new List(data); + t.Remove(0x1e); + return t.ToArray(); + } + } +} diff --git a/WasteConsoleTest/WasteConsoleTest/WSocketClientHelp.cs b/WasteConsoleTest/WasteConsoleTest/WSocketClientHelp.cs new file mode 100644 index 0000000..5262937 --- /dev/null +++ b/WasteConsoleTest/WasteConsoleTest/WSocketClientHelp.cs @@ -0,0 +1,239 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.WebSockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace WasteConsoleTest +{ + public class WSocketClientHelp + { + ClientWebSocket ws = null; + Uri uri = null; + bool isUserClose = false;//是否最后由用户手动关闭 + public static string Secret = "g8OEiOAaKjYK38aj"; + public static string SecretHash = "9729e43752011ad4"; + public static string deviceid = "08d95bb6-a0f1-4964-85ac-9786b3571656"; + + // + /// WebSocket状态 + /// + public WebSocketState? State { get => ws?.State; } + + /// + /// 包含一个数据的事件 + /// + public delegate void MessageEventHandler(object sender, string data); + public delegate void ErrorEventHandler(object sender, Exception ex); + + /// + /// 连接建立时触发 + /// + public event EventHandler OnOpen; + /// + /// 客户端接收服务端数据时触发 + /// + public event MessageEventHandler OnMessage; + /// + /// 通信发生错误时触发 + /// + public event ErrorEventHandler OnError; + /// + /// 连接关闭时触发 + /// + public event EventHandler OnClose; + + public WSocketClientHelp(string wsUrl) + { + uri = new Uri(wsUrl); + ws = new ClientWebSocket(); + } + + /// + /// 打开链接 + /// + public void Open() + { + Task.Run(async () => + { + if (ws.State == WebSocketState.Connecting || ws.State == WebSocketState.Open) + return; + + string netErr = string.Empty; + try + { + //初始化链接 + isUserClose = false; + ws = new ClientWebSocket(); + // ws.Options.AddSubProtocol("protocol1"); //使用的协议 + ws.Options.SetRequestHeader("device", deviceid); //设备ID + ws.Options.SetRequestHeader("secret", SecretHash); //设备secrethash + ws.Options.SetRequestHeader("time", GetTimestamp().ToString()); //时间戳 + ws.Options.SetRequestHeader("os", "12"); //操作系统,Android ArmV7 + ws.Options.SetRequestHeader("script", "2"); //设备支持的脚本语言运行环境,1-lua5.4 2-javascript + ws.Options.SetRequestHeader("baseProgrameLang", "10"); //宿主程序语言,java + ws.Options.SetRequestHeader("dev", "true");//开发环境,bool类型 + await ws.ConnectAsync(uri, CancellationToken.None); //建立连接 + + if (OnOpen != null) + OnOpen(ws, new EventArgs()); + + Send(@"{""protocol"":""json"", ""version"":1}");//建立之后第一步进行握手,使用json类型 + + //全部消息容器 + List bs = new List(); + //缓冲区 + var buffer = new byte[1024 * 4]; + //监听Socket信息 + WebSocketReceiveResult result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); + //是否关闭 + while (!result.CloseStatus.HasValue) + { + //文本消息 + if (result.MessageType == WebSocketMessageType.Text) + { + bs.AddRange(buffer.Take(result.Count)); + + //消息是否已接收完全 + if (result.EndOfMessage) + { + var arr = RemoveSeparator(bs.ToArray());//过滤掉记录分隔符 + + //发送过来的消息 + string userMsg = Encoding.UTF8.GetString(arr, 0, arr.Length); + + if (OnMessage != null) + OnMessage(ws, userMsg); + + //清空消息容器 + bs = new List(); + } + } + //继续监听Socket信息 + result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); + } + ////关闭WebSocket(服务端发起) + //await ws.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); + } + catch (Exception ex) + { + netErr = "发生错误" + ex.Message; + + if (OnError != null) + OnError(ws, ex); + + //if (ws != null && ws.State == WebSocketState.Open) + // //关闭WebSocket(客户端发起) + // await ws.CloseAsync(WebSocketCloseStatus.Empty, ex.Message, CancellationToken.None); + } + finally + { + if (!isUserClose) + Close(ws.CloseStatus.Value, ws.CloseStatusDescription + netErr); + } + }); + + } + /// + /// 增加记录分隔符 + /// + /// + /// + private static byte[] AddSeparator(byte[] data) + { + List t = new List(data) { 0x1e };//0x1e record separator + return t.ToArray(); + } + //删除记录分隔符 + private static byte[] RemoveSeparator(byte[] data) + { + List t = new List(data); + t.Remove(0x1e); + return t.ToArray(); + } + /// + /// 获取时间戳 + /// + /// + private int GetTimestamp() + { + DateTime dateTimeStart = TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970, 1, 1, 8, 0, 0)); + int timestamp = Convert.ToInt32((DateTime.Now - dateTimeStart).TotalSeconds); + return timestamp; + } + /// + /// 使用连接发送文本消息 + /// + /// + /// + /// 是否尝试了发送 + public bool Send(string mess) + { + if (ws.State != WebSocketState.Open) + return false; + + Task.Run(async () => + { + Console.WriteLine($"{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")},发送数据:{mess}"); + var replyMess = Encoding.UTF8.GetBytes(mess); + //发送消息,结尾必须携带记录分隔符 + await ws.SendAsync(new ArraySegment(AddSeparator(replyMess)), WebSocketMessageType.Text, true, CancellationToken.None); + }); + + return true; + } + + /// + /// 使用连接发送字节消息 + /// + /// + /// + /// 是否尝试了发送 + public bool Send(byte[] bytes) + { + if (ws.State != WebSocketState.Open) + return false; + + Task.Run(async () => + { + //发送消息 + await ws.SendAsync(new ArraySegment(bytes), WebSocketMessageType.Binary, true, CancellationToken.None); + }); + + return true; + } + + /// + /// 关闭连接 + /// + public void Close() + { + isUserClose = true; + Close(WebSocketCloseStatus.NormalClosure, "用户手动关闭"); + } + + public void Close(WebSocketCloseStatus closeStatus, string statusDescription) + { + Task.Run(async () => + { + try + { + //关闭WebSocket(客户端发起) + await ws.CloseAsync(closeStatus, statusDescription, CancellationToken.None); + } + catch (Exception ex) + { + + } + + ws.Abort(); + ws.Dispose(); + + if (OnClose != null) + OnClose(ws, new EventArgs()); + }); + } + } +} diff --git a/WasteConsoleTest/WasteConsoleTest/WasteConsoleTest.csproj b/WasteConsoleTest/WasteConsoleTest/WasteConsoleTest.csproj new file mode 100644 index 0000000..10d3985 --- /dev/null +++ b/WasteConsoleTest/WasteConsoleTest/WasteConsoleTest.csproj @@ -0,0 +1,16 @@ + + + + Exe + net5.0 + + + + + + + + + + +