添加获取用户信息的子操作码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Protocol.Code
{/// <summary>/// 账号模块下的操作码/// </summary>public class AccountCode{public const int Register_CREQ = 0;//客户端注册的子操作码public const int Register_SRES = 1;//注册Server端回应的操作码public const int Login_CREQ = 2;//登陆的子操作码public const int LOgin_SRES = 3;//登陆server端回应的操作码public const int GetUserInfo_CREQ = 4;//获得用户信息的子操作码public const int GetUserInfo_SRES = 5;//获得用户信息的Server端回应的操作码}
}

在AccountHandler中登陆成功后,发送获取用户信息的请求

using Protocol.Code;
using Protocol.Dto;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AccountHandler : BaseHandler
{public override void OnReceive(int subCode, object value){switch (subCode){case AccountCode.Register_SRES:Register_SRES((int)value);break;case AccountCode.LOgin_SRES:Login_SRES((int)value);break;case AccountCode.GetUserInfo_SRES:GetUserInfo_SRES(value as UserDto);break;}}/// <summary>/// 处理服务器端注册后的回应/// </summary>private void Register_SRES(int value){if (value==-1){EventCenter.Broadcast(EventDefine.Hint,"该用户已经被注册");return;}if (value==0){EventCenter.Broadcast(EventDefine.Hint, "注册成功");}}/// <summary>///  处理服务器端登陆后的回应/// </summary>private void Login_SRES(int value){switch (value){case -3:EventCenter.Broadcast(EventDefine.Hint, "当前用户已在线");break;              case -2:EventCenter.Broadcast(EventDefine.Hint, "账号密码不匹配");break;case -1:EventCenter.Broadcast(EventDefine.Hint, "用户名不存在");break;case 0://请求获得用户信息               NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetUserInfo_CREQ,null);EventCenter.Broadcast(EventDefine.Hint, "登陆成功");break;}}

Server端处理客户端获取用户信息的请求

  • 创建一个用户信息的数据模型
  • 在数据库操作的脚本中,构建出来
  • 在Server端回应中把数据模型发送给客户端

用户信息的数据模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Protocol.Dto
{/// <summary>/// 传递用户信息的数据模型/// </summary>[Serializable]public class UserDto{public int UserId;public string UserName;public string IconName;public int Coin;public UserDto(int UserId,string UserName, string IconName, int Coin){this.UserId = UserId;this.UserName = UserName;this.IconName = IconName;this.Coin = Coin;}public void Change(int UserId, string UserName, string IconName, int Coin){this.UserId = UserId;this.UserName = UserName;this.IconName = IconName;this.Coin = Coin;}}
}

构建数据模型

using MyServer;
using MySql.Data.MySqlClient;
using Protocol.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace GameServer.DadaBase
{public class DatabaseManager{private static MySqlConnection sqlConnect;/// <summary>/// 根据ID保存Client的字典/// </summary>private static Dictionary<int, ClientPeer> idClientDic;public static void StartConnect(){idClientDic = new Dictionary<int, ClientPeer>();string conStr = "database=zjhgame;data source=127.0.0.1;port=3306;User=root;pwd=zhao19971225";sqlConnect = new MySqlConnection(conStr);sqlConnect.Open();//开启和数据库的连接}/// <summary>/// 判断该用户名是否存在数据库中/// </summary>public static bool IsExistUserName(string userName){//查询命令MySqlCommand cmd = new MySqlCommand("select UserName from userinfo where UserName=@name", sqlConnect);//设置参数,填入参数cmd.Parameters.AddWithValue("name", userName);//开始查询MySqlDataReader reader = cmd.ExecuteReader();//是否存在bool result = reader.HasRows;//关闭查询reader.Close();return result;}/// <summary>/// 创建用户/// </summary>public static void CreatUser(string userName,string pwd){//创建命令MySqlCommand cmd = new MySqlCommand("insert into userinfo set UserName=@name,Password=@pwd,OnLine=0,IconName=@iconName",sqlConnect);//对参数进行赋值cmd.Parameters.AddWithValue("name",userName);cmd.Parameters.AddWithValue("pwd",pwd);Random random = new Random();int index= random.Next(0,19);cmd.Parameters.AddWithValue("iconName","headIcon_"+index.ToString());cmd.ExecuteNonQuery();//只执行不查询}/// <summary>/// 账号密码是否一致/// </summary>public static bool IsMatch(string userName,string pwd){MySqlCommand cmd = new MySqlCommand("select * from userinfo where UserName=@name",sqlConnect);cmd.Parameters.AddWithValue("name",userName);//开始查询MySqlDataReader reader = cmd.ExecuteReader();if (reader.HasRows)//如果查询到了{reader.Read();//读取//读取Password的内容和传入的密码相判断bool result = reader.GetString("Password") == pwd;reader.Close();return result;}reader.Close();return false;}/// <summary>/// 是否在线/// </summary>public static bool IsOnline(string userName){MySqlCommand cmd = new MySqlCommand("select OnLine from userinfo where UserName=@name",sqlConnect);cmd.Parameters.AddWithValue("name",userName);MySqlDataReader reader = cmd.ExecuteReader();if (reader.HasRows){reader.Read();bool result = reader.GetBoolean("OnLine");reader.Close();return result;}reader.Close();return false;}/// <summary>/// 登陆上线/// </summary>public static void Login(string userName,ClientPeer client){//更新在线状态MySqlCommand cmd = new MySqlCommand("update userinfo set OnLine=true where UserName=@name",sqlConnect);cmd.Parameters.AddWithValue("name",userName);cmd.ExecuteNonQuery();//获取ID和用户名MySqlCommand cmd1 = new MySqlCommand("select * from userinfo where UserName=@name",sqlConnect);cmd1.Parameters.AddWithValue("name",userName);MySqlDataReader reader = cmd1.ExecuteReader();if (reader.HasRows){reader.Read();int Id = reader.GetInt32("ID");client.id = Id;client.userName = userName;if (idClientDic.ContainsKey(Id))idClientDic.Add(Id,client);reader.Close();}reader.Close();}/// <summary>/// 下线/// </summary>public static void OffLine(ClientPeer client){if (idClientDic.ContainsKey(client.id))idClientDic.Remove(client.id);MySqlCommand cmd = new MySqlCommand("update userinfo set OnLine=0 where ID=@id",sqlConnect);cmd.Parameters.AddWithValue("id",client.id);cmd.ExecuteNonQuery();}/// <summary>/// 根据UserID获得Client/// </summary>public static ClientPeer GetClientBuyUserId(int id){if (idClientDic.ContainsKey(id)){return idClientDic[id];}return null;}/// <summary>/// 构造UserDto/// </summary>public static UserDto GetUserInfo(ClientPeer client){MySqlCommand cmd = new MySqlCommand("select * from userinfo where ID=@id",sqlConnect);cmd.Parameters.AddWithValue("id",client.id);MySqlDataReader reader = cmd.ExecuteReader();if (reader.HasRows){reader.Read();UserDto dto = new UserDto(client.id,reader.GetString("UserName"),reader.GetString("IconName"),reader.GetInt32("Coin"));reader.Close();return dto;}reader.Close();return null;}}
}

Server端处理客户端获取用户信息的请求并回应

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GameServer.DadaBase;
using MyServer;
using Protocol.Code;
using Protocol.Dto;namespace GameServer.Logic
{/// <summary>/// 账号模块的处理/// </summary>public class AccountHandler : IHandler{public void DisConnected(ClientPeer clientPeer){DatabaseManager.OffLine(clientPeer);}public void Receive(ClientPeer client, int subCode, object value){switch (subCode){case AccountCode.Register_CREQ:Register(client,value as AccountDto);break;case AccountCode.Login_CREQ:Login(client,value as AccountDto);break;case AccountCode.GetUserInfo_CREQ:GetUserInfo(client);break;}}/// <summary>/// 客户端请求获得用户信息的处理/// </summary>private void GetUserInfo(ClientPeer client){SingleExecute.Instacne.Execute(()=> {UserDto dto = DatabaseManager.GetUserInfo(client);client.SendMsg(OpCode.Account, AccountCode.GetUserInfo_SRES, dto);});}/// <summary>/// 客户端请求登陆的处理/// </summary>private void Login(ClientPeer client, AccountDto dto){SingleExecute.Instacne.Execute(()=> {if (DatabaseManager.IsExistUserName(dto.userName)==false){//用户名不存在client.SendMsg(OpCode.Account, AccountCode.LOgin_SRES, -1);return;}if (DatabaseManager.IsMatch(dto.userName,dto.password)==false){//账号密码不匹配client.SendMsg(OpCode.Account, AccountCode.LOgin_SRES, -2);return;}if (DatabaseManager.IsOnline(dto.userName)){//当前用户已在线client.SendMsg(OpCode.Account, AccountCode.LOgin_SRES, -3);return;}DatabaseManager.Login(dto.userName,client);//登陆成功client.SendMsg(OpCode.Account, AccountCode.LOgin_SRES, 0);});}/// <summary>///客户端注册请求的处理/// </summary>private void Register(ClientPeer client, AccountDto dto){///单线程执行///作用:防止多个线程同时访问,数据错乱SingleExecute.Instacne.Execute(()=> {//判断数据库中是否存在该用户,存在就给客户端返回-1if (DatabaseManager.IsExistUserName(dto.userName)){client.SendMsg(OpCode.Account, AccountCode.Register_SRES, -1);return;}//判断数据库中是否存在该用户,不存在就创建该用户并给客户端返回0DatabaseManager.CreatUser(dto.userName, dto.password);client.SendMsg(OpCode.Account, AccountCode.Register_SRES, 0);});}}
}

客户端处理服务器的响应

  • 保存用户信息
  • 创建一个GameModel,创建一个UserDto变量
  • 创建一个静态类Models,定义一个静态的GameModel和构造方法
  • 在客户端的AccountHandler中处理,把server端发来的Userdto保存在GameModel中

GameModel

sing Protocol.Dto;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 游戏数据中心
/// </summary>
public class GameModel
{/// <summary>/// 用户信息/// </summary>public UserDto userDto { get; set; }
}

Models

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public static class Models
{public static GameModel GameModel;static Models(){GameModel = new GameModel();}
}

客户端处理

using Protocol.Code;
using Protocol.Dto;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AccountHandler : BaseHandler
{public override void OnReceive(int subCode, object value){switch (subCode){case AccountCode.Register_SRES:Register_SRES((int)value);break;case AccountCode.LOgin_SRES:Login_SRES((int)value);break;case AccountCode.GetUserInfo_SRES:GetUserInfo_SRES(value as UserDto);break;}}/// <summary>/// 处理服务器端注册后的回应/// </summary>private void Register_SRES(int value){if (value==-1){EventCenter.Broadcast(EventDefine.Hint,"该用户已经被注册");return;}if (value==0){EventCenter.Broadcast(EventDefine.Hint, "注册成功");}}/// <summary>///  处理服务器端登陆后的回应/// </summary>private void Login_SRES(int value){switch (value){case -3:EventCenter.Broadcast(EventDefine.Hint, "当前用户已在线");break;              case -2:EventCenter.Broadcast(EventDefine.Hint, "账号密码不匹配");break;case -1:EventCenter.Broadcast(EventDefine.Hint, "用户名不存在");break;case 0://请求获得用户信息NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetUserInfo_CREQ,null);EventCenter.Broadcast(EventDefine.Hint, "登陆成功");break;}}/// <summary>/// 处理获取用户信息服务器端的回应/// </summary>private void GetUserInfo_SRES(UserDto dto){Models.GameModel.userDto = dto;//把用户信息存储到数据中心(model层)Debug.Log(Models.GameModel.userDto.UserName+" "+Models.GameModel.userDto.UserId+" "+Models.GameModel.userDto.IconName+" "+Models.GameModel.userDto.Coin);}
}

有需要学习视频的欢迎关注微信公众号:

Zjh游戏(十三)获取用户信息相关推荐

  1. Spring boot 项目(十三)——实现微信公众号授权登录获取用户信息

    引言 微信公众号开发中,必不可少的一环:公众号授权登录.获取微信用户信息 前期准备 内网渗透=>生成本地指定端口映射的外网域名 链接:内网渗透工具natapp使用详解 域名生成之后修改yml文件 ...

  2. 【HMS Core】华为登录后返回错误码 8 、账号服务如何授权、推送服务端获取用户信息异常

    1.[HMS core][游戏登陆][问题描述] 调用华为登录后返回错误码 8 [解决方案] 错误码8的话一般在定义为内部错误(引起该错误码的原因很多),但是一般重试基本可以解决该问题(错误码).如果 ...

  3. 微信小程序获取用户信息接口

    wx.getUserInfo(OBJECT) 注意:微信团队为优化用户体验,使用 wx.getUserInfo 接口直接弹出授权框的开发方式将逐步不再支持.从2018年4月30日开始,小程序与小游戏的 ...

  4. uniapp同步获取用户信息_微信小程序云开发教程微信小程序的API入门获取用户身份信息系列API...

    同学们大家好,我是小伊同学,上一节我们介绍了一些常用API,今天我们接着来学习一组API,那就是获取用户身份信息的API. 在微信小程序中,我们往往需要获取用户的身份信息,比如昵称.头像.性别.地区等 ...

  5. 微信小程序如何进行登录授权和获取用户信息

    微信小程序如何进行登录授权和获取用户信息

  6. 微信小程序用户未授权bug解决方法,微信小程序获取用户信息失败解决方法

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: bug示例图: 导致这个bug的原因是 wx.getUserInfo(OBJECT) 接口做了调整: ...

  7. 【CURL】模拟登录网站并获取用户信息

    模拟登录网站并获取用户信息 前言 这次来做的是通过代码的方式,模拟登录秒拍官网,获取登录用户的信息. 前后端分离 本文的标题是CURL,传统的网站是PHP代码直接渲染项目视图,通过表单提交到控制器直接 ...

  8. 通过微信公众号获取用户信息(java版)

    最近由于公司业务,就开始研究微信开发的流程,说实话,这东西刚开始看到时候和看天书的一样,总算,看了一天的文档,测试代码终于出来了. 1.首先需要到微信网站去设置一下,我是直接用的微信测试号. 接口配置 ...

  9. php 获取企业号用户,微信企业号 获取用户信息(示例代码)

    业务操作最基础的一个功能是获取访客的身份,传统的获取方式是提供一个登录页面用以访客登录. 在微信企业号中,用户在微信中访问页面时,可以根据相关API获取此用户的微信账号信息,以此来匹配业务服务器存储的 ...

最新文章

  1. 提取某一个镇的行政边界_池店镇消防安全违法典型案例通报(一)
  2. 流量不够用?Facebook要帮你发现附近的免费WiFi
  3. static、final、abstract基本作用
  4. QTableView操作 双击 单机事件信号
  5. FIFA的完整形式是什么?
  6. Linux下快速安装MySQL教程
  7. 全球云端数据仓库领导者 MaxCompute 将于本月10日正式开服美东节点
  8. TCP转输控制协议(转)
  9. A卡比N卡画质好,真有此事吗?
  10. ajax 解析gzip,javascript – 如何让浏览器gunzip一个Ajax获取gziped文本文件?
  11. MyBatis条件查询
  12. 《如何阅读一本书》读书计划
  13. 计算机的硬盘如何查看,怎样查看电脑硬盘信息 电脑中的硬盘信息
  14. python乒乓球比赛规则介绍_乒乓球比赛的简要规则
  15. 如何给PDF文件加密?PDF加密的3种方法
  16. java面试问题你遇到的难题_在Java面试中常遇到的技术问题汇总
  17. “菩提本无树,明镜亦非台,本来无一物,何处惹尘埃”的典故
  18. 笔记本 ubuntu18.04双系统
  19. 游戏推广的引流软件有用吗
  20. 浅谈HTTP缓存以及后端,前端如何具体实现HTTP缓存

热门文章

  1. mysql插入2000万数据_Mysql千万级别数据批量插入,性能提高
  2. Android 应用访问权限设置
  3. Go 1.16 即将到来的函数:ReadDir 和 DirEntry
  4. MWC世界移动通信大会
  5. acwing4652.纸张尺寸
  6. AVR单片机开发10——Nrf2401 模拟spi
  7. 2016年1月全国网络媒体技术联盟第七届年会的几个关键词
  8. 用户体验设计案例分析 # “南通大学教务管理系统微信公众号” 用户体验分析...
  9. LabVIEW开发移动车辆的识别和特征提取
  10. 超声波换能器谐振电路线路板设计