public static void HandleMinerClientMessage(IWsSessionAdapter session, WsMessage message) { if (message == null) { return; } if (!MinerClientSessionSet.TryGetByWsSessionId(session.SessionId, out IMinerClientSession minerSession)) { session.CloseAsync(WsCloseCode.Normal, "意外,会话不存在,请重新连接"); return; } else if (WsMessageFromMinerClientHandler.TryGetHandler(message.Type, out Action <IMinerClientSession, Guid, WsMessage> handler)) { try { handler.Invoke(minerSession, minerSession.ClientId, message); } catch (Exception ex) { Logger.ErrorDebugLine(ex); } } else { NTMinerConsole.UserWarn($"{nameof(HandleMinerClientMessage)} Received InvalidType {message.Type}"); } }
static void Main() { using (var ws = new WebSocket("ws://localhost:8088/")) { ws.OnOpen += (sender, e) => { Write.UserWarn($"WebSocket Open"); ws.Send("Hi!"); }; ws.OnMessage += (sender, e) => { if (string.IsNullOrEmpty(e.Data) || e.Data[0] != '{' || e.Data[e.Data.Length - 1] != '}') { return; } WsMessage message = VirtualRoot.JsonSerializer.Deserialize <WsMessage>(e.Data); if (message == null) { return; } switch (message.GetType()) { case WsMessageType.GetSpeed: ws.SendAsync(new WsMessage().SetType(WsMessageType.Speed) .SetData(new Dictionary <string, object> { { "str", "hello" }, { "num", 111 }, { "date", DateTime.Now } }).ToJson(), completed: null); break; default: Write.UserInfo(e.Data); break; } }; ws.OnError += (sender, e) => { Write.UserError(e.Message); }; ws.OnClose += (sender, e) => { Write.UserWarn($"WebSocket Close {e.Code} {e.Reason}"); }; ws.Log.Level = LogLevel.Trace; ws.Connect(); Windows.ConsoleHandler.Register(ws.Close); Console.WriteLine("\nType 'exit' to exit.\n"); while (true) { Console.Write("> "); var action = Console.ReadLine(); if (action == "exit") { break; } if (!ws.IsAlive) { ws.Connect(); } } } }
public static string ToJson(this WsMessage message) { if (message == null) { throw new InvalidProgramException(); } return(VirtualRoot.JsonSerializer.Serialize(message)); }
public static byte[] ToBytes(this WsMessage message) { if (message == null) { throw new InvalidProgramException(); } return(VirtualRoot.BinarySerializer.Serialize(message)); }
protected override void OnMessage(MessageEventArgs e) { if (e.IsPing) { WsRoot.MinerStudioSessionSet.ActiveByWsSessionId(base.ID, out _); return; } WsMessage message = e.ToWsMessage <WsMessage>(); if (message == null) { return; } if (!WsRoot.MinerStudioSessionSet.TryGetByWsSessionId(this.ID, out IMinerStudioSession minerSession)) { this.CloseAsync(CloseStatusCode.Normal, "意外,会话不存在,请重新连接"); return; } if (!minerSession.IsValid(message)) { this.CloseAsync(CloseStatusCode.Normal, "意外,签名验证失败,请重新连接"); return; } if (message.Type == WsMessage.QueryClientDatas) { if (message.TryGetData(out QueryClientsRequest query)) { // 走的内网,因为WsServer启动时会设置内网Rpc地址 RpcRoot.OfficialServer.ClientDataBinaryService.QueryClientsForWsAsync(QueryClientsForWsRequest.Create(query, minerSession.LoginName), (QueryClientsResponse response, Exception ex) => { if (response.IsSuccess()) { var userData = WsRoot.ReadOnlyUserSet.GetUser(UserId.CreateLoginNameUserId(minerSession.LoginName)); if (userData != null) { this.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.ClientDatas) { Data = response }.SignToBytes(userData.Password), completed: null); } } }); } return; } if (MinerStudioWsMessageHandler.TryGetHandler(message.Type, out Action <string, WsMessage> handler)) { try { handler.Invoke(minerSession.LoginName, message); } catch (Exception ex) { Logger.ErrorDebugLine(ex); } } else { NTMinerConsole.UserWarn($"{_behaviorName} {nameof(OnMessage)} Received InvalidType {e.Data}"); } }
public static string SignToJson(this WsMessage message, string password) { if (message == null) { throw new InvalidProgramException(); } message.Sign = message.CalcSign(password); return(VirtualRoot.JsonSerializer.Serialize(message)); }
public static byte[] SignToBytes(this WsMessage message, string password) { if (message == null) { throw new InvalidProgramException(); } message.Sign = message.CalcSign(password); return(ToBytes(message)); }
private static StringBuilder GetSignData(this WsMessage message) { if (message == null) { throw new InvalidProgramException(); } StringBuilder sb = new StringBuilder(); sb.Append(nameof(message.Id)).Append(message.Id.ToString()).Append(nameof(message.Type)).Append(message.Type).Append(nameof(message.Timestamp)).Append(message.Timestamp.ToString()); sb.Append(nameof(message.Data)).AppendData(message.Data); return(sb); }
public static void HandleMinerStudioMessage(IWsSessionAdapter session, WsMessage message) { if (message == null) { return; } if (!WsRoot.MinerStudioSessionSet.TryGetByWsSessionId(session.SessionId, out IMinerStudioSession minerSession)) { session.CloseAsync(WsCloseCode.Normal, "意外,会话不存在,请重新连接"); return; } if (!minerSession.IsValid(message)) { session.CloseAsync(WsCloseCode.Normal, "意外,签名验证失败,请重新连接"); return; } if (message.Type == WsMessage.QueryClientDatas) { if (message.TryGetData(out QueryClientsRequest query)) { // 走的内网,因为WsServer启动时会设置内网Rpc地址 RpcRoot.OfficialServer.ClientDataBinaryService.QueryClientsForWsAsync(QueryClientsForWsRequest.Create(query, minerSession.LoginName), (QueryClientsResponse response, Exception ex) => { if (response.IsSuccess()) { var userData = WsRoot.ReadOnlyUserSet.GetUser(UserId.CreateLoginNameUserId(minerSession.LoginName)); if (userData != null) { session.SendAsync(new WsMessage(Guid.NewGuid(), WsMessage.ClientDatas) { Data = response }.SignToBytes(userData.Password)); } } }); } return; } if (MinerStudioWsMessageHandler.TryGetHandler(message.Type, out Action <string, WsMessage> handler)) { try { handler.Invoke(minerSession.LoginName, message); } catch (Exception ex) { Logger.ErrorDebugLine(ex); } } else { NTMinerConsole.UserWarn($"{session.TypeName} {nameof(HandleMinerStudioMessage)} Received InvalidType {message.Type}"); } }
public void Test1() { SpeedDto speedDto1 = VirtualRoot.JsonSerializer.Deserialize <SpeedDto>(File.ReadAllText(Path.Combine(TestUtil.DataDirFullName, "speedData.json"))); WsMessage message = new WsMessage(Guid.NewGuid(), WsMessage.Speed) { Data = speedDto1 }; byte[] data = Encoding.UTF8.GetBytes(VirtualRoot.JsonSerializer.Serialize(message)); double dataSize = data.Length / NTKeyword.DoubleK; Console.WriteLine($"原始大小 {dataSize.ToString()} kb"); data = message.SignToBytes(HashUtil.Sha1("password1")); double dataNewSize = data.Length / NTKeyword.DoubleK; Assert.IsTrue(VirtualRoot.BinarySerializer.IsGZipped(data)); Console.WriteLine($"序列化后大小 {dataNewSize.ToString()} kb,是原来大小的 {(dataNewSize * 100 / dataSize).ToString()} %"); message = VirtualRoot.BinarySerializer.Deserialize <WsMessage>(data); Assert.IsTrue(message.TryGetData(out SpeedDto speedDto2)); Assert.AreEqual(speedDto1.ClientId, speedDto2.ClientId); }
protected override void OnMessage(MessageEventArgs e) { if (e.IsPing) { WsRoot.MinerStudioSessionSet.ActiveByWsSessionId(base.ID, out _); return; } WsMessage message = e.ToWsMessage <WsMessage>(); if (message == null) { return; } if (!WsRoot.MinerStudioSessionSet.TryGetByWsSessionId(this.ID, out IMinerStudioSession minerSession)) { this.CloseAsync(CloseStatusCode.Normal, "意外,会话不存在,请重新连接"); return; } if (!minerSession.IsValid(message)) { this.CloseAsync(CloseStatusCode.Normal, "意外,签名验证失败,请重新连接"); return; } if (MinerStudioWsMessageHandler.TryGetHandler(message.Type, out Action <string, WsMessage> handler)) { try { handler.Invoke(minerSession.LoginName, message); } catch (Exception ex) { Logger.ErrorDebugLine(ex); } } else { Write.UserWarn($"{_behaviorName} {nameof(OnMessage)} Received InvalidType {e.Data}"); } }
protected override void OnMessage(MessageEventArgs e) { IMinerClientSession minerSession; if (e.IsPing) { if (WsRoot.MinerClientSessionSet.ActiveByWsSessionId(base.ID, out minerSession)) { WsRoot.MinerClientMqSender.SendMinerClientWsBreathed(minerSession.LoginName, minerSession.ClientId); } return; } WsMessage message = e.ToWsMessage <WsMessage>(); if (message == null) { return; } if (!WsRoot.MinerClientSessionSet.TryGetByWsSessionId(this.ID, out minerSession)) { this.CloseAsync(CloseStatusCode.Normal, "意外,会话不存在,请重新连接"); return; } else if (MinerClientWsMessageHandler.TryGetHandler(message.Type, out Action <MinerClientBehavior, string, Guid, WsMessage> handler)) { try { handler.Invoke(this, minerSession.LoginName, minerSession.ClientId, message); } catch (Exception ex) { Logger.ErrorDebugLine(ex); } } else { Write.UserWarn($"{_behaviorName} {nameof(OnMessage)} Received InvalidType {e.Data}"); } }
protected override void OnMessage(MessageEventArgs e) { if (string.IsNullOrEmpty(e.Data) || e.Data[0] != '{' || e.Data[e.Data.Length - 1] != '}') { return; } WsMessage message = VirtualRoot.JsonSerializer.Deserialize <WsMessage>(e.Data); if (message == null) { return; } switch (message.GetType()) { case WsMessageType.Speed: Write.DevDebug(e.Data); break; default: base.Send(new WsMessage().SetType(message.GetType()).SetCode(400).SetDes("invalid action").SetPhrase("invalid action").ToJson()); break; } Write.DevWarn("Sessions Count: " + base.Sessions.Count); }
public static string CalcSign(this WsMessage message, string password) { return(HashUtil.Sha1(GetSignData(message).Append(password).ToString())); }