Ejemplo n.º 1
0
        private void UserLoginReq(Player player, byte[] byteArray)
        {
            UserLoginReqPayload.ParsePayload(byteArray, out var infoData);
            var dbContext = SockerManager.Instance.GetApplicationContext();
            //SingleOrDefault will return null if no exist.
            var user = dbContext.Users.Where(u => u.UserId == infoData.UserId).SingleOrDefault();

            //如果用戶不存在則自動幫他創帳號
            if (user == null)
            {
                Console.WriteLine("not found equal userid, created new user.");
                user = new User
                {
                    UserId  = infoData.UserId,
                    UserPwd = infoData.UserPwd
                };
                dbContext.Users.Add(user);
                dbContext.SaveChanges();
                user = dbContext.Users.Where(u => u.UserId == infoData.UserId).SingleOrDefault();
                //更新該玩家的資料
                player.PlayerData.PlayerUid = user.PlayerUid;
                //未來會做成存在DB或REDIS
                PlayerDataSystem.Instance.SaveOneInfoDataToRedis(RedisHelper.GetRedisDb(RedisHelper.RedisDbNum.Connect), player.PlayerData);
            }

            //建立完帳戶、確認用戶帳密是否一致
            //不一致就傳送失敗訊號,並且剔除使用者
            if (infoData.UserPwd != user.UserPwd)
            {
                Send(player, PacketBuilder.BuildPacket((int)SystemCategory.UserSystem, (int)UserCommand.UserLoginResp, UserLoginRespPayload.CreatePayload(UserAck.AuthFail)));
                return;
            }

            //更新Player資料 從DB重撈
            player.PlayerData = PlayerDataSystem.Instance.GetOneInfoDataFromRedis(RedisHelper.GetRedisDb(RedisHelper.RedisDbNum.Connect), user.PlayerUid);

            //驗證成功就通知在線上的伺服器,把人踢下線
            SockerManager.Instance.PublishLoginToRedis(user.PlayerUid);
            //回傳成功訊息給對應的人
            Send(player, PacketBuilder.BuildPacket((int)SystemCategory.UserSystem, (int)UserCommand.UserLoginResp, UserLoginRespPayload.CreatePayload(UserAck.Success)));
            //傳送玩家資料給他
            Send(player, PacketBuilder.BuildPacket((int)SystemCategory.PlayerDataSystem, (int)PlayerDataCommand.PlayerDataResp, PlayerDataRespPayload.CreatePayload(PlayerDataAck.Success, player.PlayerData)));
            //儲存玩家資料進Redis
            PlayerDataSystem.Instance.SaveOneInfoDataToRedis(RedisHelper.GetRedisDb(RedisHelper.RedisDbNum.Connect), player.PlayerData);
            //回傳留言版最後一百筆資料
            MessageSystem.Instance.SendLastMessage(player);
            //更新玩家資料
            SockerManager.Instance.SavePlayerConnect(player.Connection.RemoteEndPoint.ToString(), player);
        }
Ejemplo n.º 2
0
        public void StartClientAndLogin(User userInfo)
        {
            // Connect to a remote device.
            try
            {
                // Establish the remote endpoint for the socket.
                // The name of the
                // remote device is "host.contoso.com".
                IPHostEntry ipHostInfo = Dns.GetHostEntry("127.0.0.1");
                IPAddress   ipAddress  = ipHostInfo.AddressList[0];
                IPEndPoint  remoteEP   = new IPEndPoint(ipAddress, _serverPort);

                // Create a TCP/IP socket.
                _socketClient = new Socket(ipAddress.AddressFamily,
                                           SocketType.Stream, ProtocolType.Tcp);

                // Connect to the remote endpoint.
                _socketClient.BeginConnect(remoteEP,
                                           new AsyncCallback(ConnectCallback), _socketClient);
                connectDone.WaitOne();

                // Send test data to the remote device.
                Send(PacketBuilder.BuildPacket((int)SystemCategory.UserSystem, (int)UserCommand.UserLoginReq, UserLoginReqPayload.CreatePayload(userInfo)));
                sendDone.WaitOne();

                // Receive the response from the remote device.
                Receive();
                receiveDone.WaitOne();
            }
            catch (Exception e)
            {
                Program.mainUI.OnShowSystemLog(e.ToString());
            }
        }