分享
 
 
 

一步一步开发Game服务器(二)登陆2

王朝学院·作者佚名  2016-05-20
窄屏简体版  字體: |||超大  

一步一步开发Game服务器(二)登陆2上一篇文章,讲解了简单的登陆情况。接下来我们继续讲解登陆模块。

在正常的游戏服务器情况下。在尚未登录前可以查看服务器大区情况,登陆后也可以查看服务器大区情况,然后选择大区服务器。进行登录操作。

这样的情况就需要我们有一个登录服务器来负责,目前大区服务器的状态,是正常。拥挤,爆满。还是停服维护。那么这样登录服务器,如果进行控制和输出呢?

如何与大区服务器正常进行通信已经同步登录状态呢?

登录服务器,可以看作是我们其他大区服务器的网关服务器。那么势必为了保证服务器的高可用性,已经内存等资源消耗。我们这里的数据交换肯定不能依赖于socket连接进行。这样消耗会很大,这里其实只需要查看服务器状态和登陆即可。那么我们需要http就能顺利完成的工作。无需长连接,就无需考虑连接状态。

那么这种情况,http虽然能减少消耗,返回服务器状态。但是也要保证玩家的登陆状态,还要与其他服务器保持同步状态。那么基于IIS或者tomcat肯定是无法完成了。

这里就有了自定义开发的基于Socket 的服务器程序来今天http协议监听。具体的文章之前有过介绍(详见)。

今天我们就来真正完成http登陆模块。

1 Sz.Network.SocketPool.ListenersBox.GetInstance.SetParams(new MessagePool(), typeof(MarshalEndian));2 Sz.Network.SocketPool.ListenersBox.GetInstance.Start("tcp:*:9527", "http://*:8001/login/");

依旧是上一篇文章的代码,进行http的绑定的 login 进行监听。

在 MessagePool 类的 函数

1 public void ActiveHttp(HttpClient client, string bind, Dictionary<string, string> parms) 2 { 3 if (bind.Equals("/login/")) 4 { 5 string strHtml = "ret="; 6 strHtml += "Login OK!"; 7 client.OutputStream.WriteLine(strHtml); 8 client.Close(); 9 }10 }

这样我们可以判断出,请求 bind 是来至于 login的绑定,后面的parms 是此处请求的参数信息,不管是post还是get请求方式。这里如果需要了解参数的获取方式请详见以前的文章 《C# 利用socekt做到http监听,怎么样才能做到高性能》

那么我们开启服务器先测试一下,

可以看到,我们监听login是成功的,

我们可以开始登陆操作了,登陆我们要解决的就是一个http的连接如何保持登陆状态。

这里的灵感来至于腾讯,百度等api接口的思路创建的登陆验证方式。

为了方便进行,我们需要从nuget处获取一个第三方类库 json.net 进行数据的json格式输出。

修改一下ActiveHttp

1 string strHtml = "ret="; 2 if (bind.Equals("/login/")) 3 { 4 foreach (var item in parms) 5 { 6 Console.WriteLine("参数:"+item.Key + ":" + item.Value); 7 8 } 9 strHtml += "Login OK!";10 }11 client.OutputStream.WriteLine(strHtml);12 client.Close();

在浏览器输入http://127.0.0.1:8001/login/?username=test1&pwd=test1&logintime=2015-4-16%2012:00

请不要在意密码是不是明文传输的。

1 [2015-04-16 12:10:38:287:Info ] Create Http Socket Remote Socket LocalEndPoint:127.0.0.1:8001 RemoteEndPoint:127.0.0.1:43322 参数:username:test13 参数:pwd:test14 参数:logintime:2015-4-16 12:00

正常接收到get传来的登陆数据。

我们想创建一个密钥 key值

string key = "89bf54aca24a457ea32a6a0d81cbcc4e";

在创建一个回复类

1 class LoginRet2 {3 public string Ret { get; set; }4 5 public string PWDKey { get; set; }6 }

1 public void ActiveHttp(HttpClient client, string bind, Dictionary<string, string> parms) 2 { 3 LoginRet loginRet = new LoginRet(); 4 if (bind.Equals("/login/")) 5 { 6 if (parms["username"] == "test1" && parms["pwd"] == "test1") 7 { 8 loginRet.Ret = "Login OK!"; 9 string pwdkey = parms["username"] + parms["pwd"] + key + parms["logintime"];10 byte[] pwdkeyBuffer = UTF8Encoding.Default.GetBytes(pwdkey);11 loginRet.PWDKey = Convert.ToBase64String(pwdkeyBuffer);12 Logger.Info("用户 " + parms["username"] + " 登陆完成 密钥:" + loginRet.PWDKey);13 }14 else { loginRet.Ret = "Login Error!"; }15 }16 else17 {18 loginRet.Ret = "Login Error!";19 }20 string jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(loginRet);21 client.OutputStream.WriteLine(jsonStr);22 client.Close();23 }

修改一下处理方法,这里我采用的加密方式,仅仅是最简单的,就是把 登陆名 + 登陆密码 + 密钥 + 登录时间 转换成64为字符串,(这里各位同学可以根据自己项目的实际情况和需求改为md5也好,自己写算法也好,都可以)

这样就得到了登陆成功后的凭证,拿着这个凭证可以在我们任何服务器相同规则下进行无需第二次验证登陆。

在浏览器输入http://127.0.0.1:8001/login/?username=test1&pwd=test1&logintime=2015-4-16%2012:00再一次使用这个 url 测试

接下来我们抛弃浏览器,用客户端程序来试试,

WebRequest request = WebRequest.Create("http://127.0.0.1:8001/login/?username=test1&pwd=test1&logintime=2015-4-16%2012:00"); request.Method = "GET"; string str = new System.IO.StreamReader(request.GetResponse().GetResponseStream(), UTF8Encoding.Default).ReadToEnd(); Ret = Newtonsoft.Json.JsonConvert.DeserializeObject<LoginRet>(str); if (Ret != null && Ret.Ret) { ConnectManager.GetInstance.AddMsg("登陆成功" + Ret.PWDKey); }

修改一下访问模式

客户端登陆代码更改为

1 BufferWriter bw = new BufferWriter(1);2 bw.Write(ConnectManager.GetInstance.Ret.PWDKey);//发送登陆凭据3 bw.Write("test1");//发送用户名4 bw.Write("2015-4-16 12:00");//发送时间5 bw.Write(this.username.Text.TrimEnd());6 ConnectManager.GetInstance.Client.SendMsg(bw.GetMessage());7 bw.Dispose();

服务器socket 登陆验证。

1 string pwdkey = this.bufferReader.ReadString(); 2 string username = this.bufferReader.ReadString(); 3 string loginTime = this.bufferReader.ReadString(); 4 string name = this.bufferReader.ReadString(); 5 6 if (pwdkey == Convert.ToBase64String(UTF8Encoding.Default.GetBytes(username + ServerManager.key + loginTime))) 7 { 8 if (!LoginManager.GetInstance.LoginNames.Contains(username)) 9 {10 LoginManager.GetInstance.LoginNames.Add(username);11 if (!LoginManager.GetInstance.Loginips.ContainsKey(session.ID))12 {13 LoginManager.GetInstance.LoginIPs[Session.ID] = username;14 LoginManager.GetInstance.Sessions.Add(Session);15 }16 srWriter.Write(true);17 srWriter.Write(name + " 登陆聊天室");18 Logger.Info(Session.RemoteEndPoint + " " + name + " 登陆成功");19 ServerManager.GetInstance.Tell_All(srWriter.GetMessage());20 }21 else22 {23 srWriter.Write(false);24 srWriter.Write("登录名称重复,请换一个");25 Logger.Info(Session.RemoteEndPoint + " " + name + " 登录名称重复!");26 Session.SendMsg(srWriter.GetMessage());27 }28 }

此时我们在socket登陆验证只需要验证传入的参数,pwdkey能否生成相同的。则为登陆成功。

完成了正常的游戏登陆流程,莫倩,页游,手游,都是第三方运营平台,登陆账号和密码,都是第三方的。如果需要http登陆,密钥key到游戏内部验证。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有