登录服务器
一.登录模块loginserver流程
1、主函数
(1)取到端口PORT和PORT2,分别是30001和8188
(2)新建服务器引导,服务器引导ServerBootstrap——服务器套接字管道工厂NioServerSocketChannelFactory——由实施者Executors来开启缓存的线程Executors.
newCachedThreadPool()。
ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
(3)设置管道工厂bootstrap.setPipelineFactory(new ServerPipelineFactory());
(4)服务器引导绑定端口PORT
bootstrap.bind(new InetSocketAddress(PORT));
(5)重复上述步骤,绑定端口PORT+2和端口PORT2作为游戏服的管理端口
(6)使用init()函数进行初始化,并设置GM链接管理器的端口为(PORT+3),并打印listen on+端口PORT。
GmServer.connect(PORT + 3);
2、init()初始化函数
(1)config.init()此函数主要是用于对配置文件server.xml的解析,拿到其中服务器列表的一些数据。1、config.java中读取server.xml文件,解析该文件,并用document来拿到file文件内的元素。2、拿到version和loginversion和游戏IP,以及server服务器列表文件元素。3.取到服务器文件元素里面的游戏服信息,打印名字和IP,并把他们存入到服务器列表容器中。4.拿到最新的jar包对应的SDK文件元素,将SDK文件元素存放到map中,并打印出来。5.关闭file
(2)I18N.init()国际化的初始化
(3)GameProtocolHandler.parseOpConfig();协议解析器的初始化,主要是解析opclass.ini文件。输出一下内容:(ini文件后缀就是初始化文件)
0x00+0:C2SLogin
0x00+1:C2SRegUser
0x00+2:CSCheckRC
0x50+0x00:C2SCmdParser
0x50+0x01:C2SPlayerUpdate
0x50+0x02:C2SUpdatePassword
0x10+0x01:C2SAccountInfo
0x50+0x03:C2SCallOnline
0x50+0x04:C2SGetServerInfo
(4)new OnlineServer().start();启动在线的服务器
OnlineServer()的run()——getOnline()
主要作用是启动所有的在线服务器,对服务器列表中的所有服务器地址IP1发送请求,若返回http状态码不为0,则服务器启动正常,为0,则启动失败。
启动完所有服务器,记录时间,自动推荐服务器。若用户连接等待时间小于5分钟,等到5分钟;若等待时间大于5分钟,等待5分钟。
(5)LoginLogs.startLogThread();//启动日志配置和守护线程
两个方法init()和LogWorker(),其中init()主要是用于初始化日志文件的写入路径,
在D:\java-workspace\Gamelog/log_login_01/路径文件不存在的情况下,
将日志的路径设置为logsPath:D:\java-workspace\HunterLoginServer/log_login_01/。
而LogWorker()的作用是调用刷新方法flush(),在之前的日志路径下以时间为命名文件夹,以0-9的数字为日志文件,向文件中写入数据,以@作为分隔符。
二、各渠道登录接入口流程Meizu渠道 M360LoginImpl.java
(1)actionLogin()函数返回值为loginBean,
1、先拿到账号,查询第三方SDK平台是否有登录的账号信息,若没有,则返回为空。若第三方登录平台有返回信息rc,则将返回的信息变成json的格式jb,拿到响应jb中的access_token参数 2、访问另外一个URL,得到响应,拿到响应中的id信息。通过“id+127_360”和渠道id在数据库中用SQL拿到loginBean的信息。如果数据库中loginBean信息不存在的话,就自己根据已传入的用户信息生成一个loginBean。最后拿到的loginBean不为空,且loginbean状态码正常为0,就返回。
(2)M360LoginImpl.java的主函数main会发送请求对appid,appkey,appsecret等参数进行赋值。同时登录页面提交form表单的时候,就会调用actionLogin()来执行登录过程。
三、M360LoginImpl.java的父类absLoginImpl.java
ThridLoginService.java的作用是根据不同的渠道Id来调用不同渠道的登录接入口,并且重写父类抽象线程类absLoginImpl的actionLogin()方法。
ThridLoginService.login() 函数拿到第三方的unionid,调用loginAdt(),拿到对应渠道id的渠道接入口LenovoLoginImpl.java.启动这个文件,实现第三方的登录。
例如渠道为91010,代表要新建一个联想设备的接口。
} else if ("91010".equals(unionId)) {
impl = new LenovoLoginImpl();// 联想
四、S2CLoginFail()函数主要的功能是给客户端发送登录失败的信息,发送完后断开连接。
支付服务器
一、本地渠道json包——unions.json
主要用于存储渠道的相关属性,如果本地要取得渠道的属性值,就可以调用json包。比如支付服务器要构建渠道表单页面,就可以解析json包的params属性来得到有哪些文本项。
二、payservice中iTools.jsp
这个文件主要是对第三方支付服务器发送过来的请求进行验证。如果我们用MD5加密后得到的sign值与发送过来的签名内容一致的话,支付通过。这样主要是防止中间有修改支付发送json包的可能,避免刷单。