Netty游戏服务器之六服务端登录消息处理
客户端unity3d已经把消息发送到netty服务器上了,那么ServerHandler类的public void channelRead(ChannelHandlerContext ctx, Object msg) 就会触发,
所有我们在这里吧消息发送至各自处理的类,这里呢我根据不同的消息类型,定义了不同的消息分派类。如login消息就制定LoingDispatch类,专门处理登录这个模块。
public class LoginProtocol {
/*
* Login_Area
* **/
public static final int Area_LoginRequest = 0; // 登陆请求
public static final int Area_LoginResponse = 1; //登录应答
/*
* Login_Command
* **/
public static final int Login_InvalidMessage = 0;//无效消息
public static final int Login_InvalidUsername = 1;//无效用户名
public static final int Login_InvalidPassword = 2;//密码错误
public static final int Login_Succeed = 10;//登陆成功
}
public class LoginDispatch {
private static LoginDispatch instance = new LoginDispatch();
public static LoginDispatch getInstance()
{
return instance;
}
public void dispatch(ChannelHandlerContext ctx, SocketModel message)
{
switch (message.getArea()) {
case LoginProtocol.Area_LoginRequest:
//处理登录的事务
break;
default:
break;
}
}
}
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception//当客户端发送数据到服务器会触发此函数
{
SocketModel message = (SocketModel) msg;
switch (message.getType()) {
case TypeProtocol.TYPE_LOGIN:
LoginDispatch.getInstance().dispatch(ctx, message);//分派登录消息
break;
case TypeProtocol.TYPE_WIZARD:
WizardDispatch.getInstance().dispatch(ctx, message);
break;
case TypeProtocol.TYPE_USER:
UserDispatch.getInstance().dispatch(ctx, message);
break;
case TypeProtocol.TYPE_BATTLE:
BattleDispatch.getInstance().dispatch(ctx, message);
default:
break;
}
接着我们处理登录事务搞出点事情,你也可以尝试这打印几句话,看客户端和服务端能否正常的通信,如果可以请看下面:
测试好了之后,我们要把客户端发送过来的消息,其中捎带的账号和密码给解析出来,然后放到数据库中验证,再把是否成功类型赋给SocketModel的Command,返发送给客户端。
这样客户端就根据command的值做不同的处理。
当然这只是我个人的观点,有问题可以和我谈谈。
这个你们应该可以自己写了吧,无非就是一些逻辑的判断,通过这句ctx.writeAndFlush(消息(SocketModel));发送给客户端。
public class LoginDispatch {
private static LoginDispatch instance = new LoginDispatch();
public static LoginDispatch getInstance()
{
return instance;
}
public User user = null;
public Wizard wizard = null;
public void dispatch(ChannelHandlerContext ctx, SocketModel message)
{
switch (message.getArea()) {
case LoginProtocol.Area_LoginRequest:
LoginResponse(ctx,message);
break;
default:
break;
}
}
/*
* **检测用户登录是否密码错误,用户名不存在等,返回int对应的不同类型
*/
public int LoginCheck(ChannelHandlerContext ctx,SocketModel request)
{
List<String> message = request.getMessage();
String username = message.get(0);
String password = message.get(1);
//System.out.println(username);
//System.out.println(password);
if (message.isEmpty())
{
return LoginProtocol.Login_InvalidMessage;
}else{
if (UserMySQL.getInstance().usernameExit(username))
{
user = UserMySQL.getInstance().userExit(username, password,ctx.channel());
if (user != null){
return LoginProtocol.Login_Succeed;
}else{
return LoginProtocol.Login_InvalidPassword;
}
}else{
return LoginProtocol.Login_InvalidUsername;
}
}
}
public void LoginResponse(ChannelHandlerContext ctx,SocketModel request)
{
SocketModel response = new SocketModel();
int command = LoginCheck(ctx, request);
response.setType(TypeProtocol.TYPE_LOGIN);
response.setArea(LoginProtocol.Area_LoginResponse);
response.setCommand(command);
response.setMessage(request.getMessage());
ctx.writeAndFlush(response);
if (command == LoginProtocol.Login_Succeed)
{
LoginUser(ctx,request);//如果成功就登陆用户,并开始新手向导
}
}
/**
* 登陆用户,并开始新手向导
* @param ctx
*/
public void LoginUser(ChannelHandlerContext ctx,SocketModel socketModel)
{
user = UserMySQL.getInstance().initUser(User.getUserByChannel(ctx.channel()));
user.setWizard(WizardMySQL.getInstance().initWizard(user.getUserID()));
SocketModel message = new SocketModel();
message.setType(TypeProtocol.TYPE_WIZARD);
message.setArea(WizardProtocol.Wizard_Create_Request);
message.setCommand(user.getWizard().getStepIndex());
message.setMessage(null);
ctx.writeAndFlush(message);
}
}
这里是我写的分派类,思路大概就是这样。注意我这是有数据库的,需要去数据库里面验证正确性。你们可以自己写,因为每个人都不同。
我推荐用phpamdin来管理mysql数据库,简单方便。

里面存有4个账号
好了运行试试,我随便输一个账号,
可以看到服务器收到了客户端发送的账户密码,
我们在看看客户端,由于我写了登陆成功的话就跳转场景,并在console中可以看到“登陆成功”的debug

Netty游戏服务器之六服务端登录消息处理的更多相关文章
- Netty入门——客户端与服务端通信
Netty简介Netty是一个基于JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速 ...
- Netty游戏服务器之一
所谓磨刀不误砍柴工,所以在搭建netty游戏服务器之前,我们先要把要准备的东西做好. 首先进入netty的官网下载最新版本的netty的jar包,http://netty.io/downloads.h ...
- 客户端(springmvc)调用netty构建的nio服务端,获得响应后返回页面(同步响应)
后面考虑通过netty做一个真正意义的简约版RPC框架,今天先尝试通过正常调用逻辑调用netty构建的nio服务端并同步获得返回信息.为后面做铺垫 服务端实现 我们先完成服务端的逻辑,逻辑很简单,把客 ...
- Linux搭建SVN服务器(服务端)
Linux搭建SVN服务器(服务端) 1 安装SVN SVN客户端:TortoiseSVN,官网下载:https://tortoisesvn.net/downloads.html(客户端) # yum ...
- Java实现:服务端登录系统并跳转到系统内的指定页面(不调用浏览器)
Java实现:服务端登录系统并跳转到系统内的指定页面(不调用浏览器) 1,思路:根据爬虫思想: 2,代码: /** * ClassName:AuthFr * Function: TODO * Reas ...
- Netty源码解析---服务端启动
Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...
- Netty(6)源码-服务端与客户端创建
原生的NIO类图使用有诸多不便,Netty向用户屏蔽了细节,在与用户交界处做了封装. 一.服务端创建时序图 步骤一:创建ServerBootstrap实例 ServerBootstrap是Netty服 ...
- Netty实现客户端和服务端通信简单例子
Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象. 在Netty里面,Accept连接可以使用单独的线程池去处理,读写操作又是另外的线程池来处理. Accept连接和读写 ...
- Netty游戏服务器之四protobuf编解码和黏包处理
我们还没讲客户端怎么向服务器发送消息,服务器怎么接受消息. 在讲这个之前我们先要了解一点就是tcp底层存在粘包和拆包的机制,所以我们在进行消息传递的时候要考虑这个问题. 看了netty权威这里处理的办 ...
随机推荐
- NFS+inotify实时同步
Inotify简介 Inotify是一种文件系统事件通告机制,能够实时监控文件系统下文件的访问.修改.删除等各种变化情况并将其作为事件通告给用户态应用程序.Linux内核从2.6.13版本后已经集成了 ...
- Github精选 – 适合移动端的HTML5 Datepicker
2016-01-12 (updated: 2017-01-07) 15731 通过 HTML5 的 <input> 新属性可以简单方便地调用手机的原生 Datepicker,但功能较弱, ...
- 应用程序有bug崩溃重启的案例2
------解决思路----------------------另外做一个服务或者程序定时监控系统进程.程序奔溃的话,都会在入口函数出现异常处理一下winform可以有两个事件来捕获主线程异常和线程异 ...
- leetcode 之Gas Station(11)
这题的思路很巧妙,用两个变量,一个变量衡量当前指针是否有效,一个衡量整个数组是否有解,需要好好体会. int gasStation(vector<int> &gas, vector ...
- django-1366, "Incorrect string value: '\\xE6\\x88\\x9A\\xE4\\xBC\\x9F...'
今天把之前的一些代码转移到另外一台电脑的时候, python manage.py syncdb 的时候报了 (1366, "Incorrect string value: '\\xE6\\x ...
- for in 对象时,属性为非负整数的情况
在我做一个需求的时候 for in 一个对象,对象的属性都是数字 但是我想给这个对象加一个默认的属性跟值 原对象是{5446:"广州市"}.....类似于下去 然后我想给我页面展示 ...
- 部署Nginx
部署Nginx #下载nginx wget http://nginx.org/download/nginx-1.12.2.tar.gz#安装依赖 yum install pcre-devel open ...
- AC日记——[LNOI2014]LCA bzoj 3626
3626 思路: 离线操作+树剖: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #defin ...
- 安卓APP安全测试基础
学习牛人经验,结合自己的测试,做简单总结: 简介:安卓APP安全测试目前主要覆盖以下方面:1)自身组件安全2)本地敏感数据保护3)web接口安全 一.自身组件安全目前手动.开源或免费工具均能检测此类漏 ...
- 【cocos2d-js网络教程篇】cocos2d-js http网络请求
前言 刚入手cocos2d-js,看到网上的JS的http网络请求,大部分都是错的.原因在于,js-tests里面的网络请求实例没有给出加载完成事件.正确的加载完成事件如下: var xhr = cc ...