Ejemplo n.º 1
0
 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}");
     }
 }
Ejemplo n.º 2
0
        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();
                    }
                }
            }
        }
Ejemplo n.º 3
0
 public static string ToJson(this WsMessage message)
 {
     if (message == null)
     {
         throw new InvalidProgramException();
     }
     return(VirtualRoot.JsonSerializer.Serialize(message));
 }
Ejemplo n.º 4
0
 public static byte[] ToBytes(this WsMessage message)
 {
     if (message == null)
     {
         throw new InvalidProgramException();
     }
     return(VirtualRoot.BinarySerializer.Serialize(message));
 }
Ejemplo n.º 5
0
        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}");
            }
        }
Ejemplo n.º 6
0
 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));
 }
Ejemplo n.º 7
0
 public static byte[] SignToBytes(this WsMessage message, string password)
 {
     if (message == null)
     {
         throw new InvalidProgramException();
     }
     message.Sign = message.CalcSign(password);
     return(ToBytes(message));
 }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
 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}");
     }
 }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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}");
            }
        }
Ejemplo n.º 12
0
        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}");
            }
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
 public static string CalcSign(this WsMessage message, string password)
 {
     return(HashUtil.Sha1(GetSignData(message).Append(password).ToString()));
 }