客户端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游戏服务器之六服务端登录消息处理的更多相关文章

  1. Netty入门——客户端与服务端通信

    Netty简介Netty是一个基于JAVA NIO 类库的异步通信框架,它的架构特点是:异步非阻塞.基于事件驱动.高性能.高可靠性和高可定制性.换句话说,Netty是一个NIO框架,使用它可以简单快速 ...

  2. Netty游戏服务器之一

    所谓磨刀不误砍柴工,所以在搭建netty游戏服务器之前,我们先要把要准备的东西做好. 首先进入netty的官网下载最新版本的netty的jar包,http://netty.io/downloads.h ...

  3. 客户端(springmvc)调用netty构建的nio服务端,获得响应后返回页面(同步响应)

    后面考虑通过netty做一个真正意义的简约版RPC框架,今天先尝试通过正常调用逻辑调用netty构建的nio服务端并同步获得返回信息.为后面做铺垫 服务端实现 我们先完成服务端的逻辑,逻辑很简单,把客 ...

  4. Linux搭建SVN服务器(服务端)

    Linux搭建SVN服务器(服务端) 1 安装SVN SVN客户端:TortoiseSVN,官网下载:https://tortoisesvn.net/downloads.html(客户端) # yum ...

  5. Java实现:服务端登录系统并跳转到系统内的指定页面(不调用浏览器)

    Java实现:服务端登录系统并跳转到系统内的指定页面(不调用浏览器) 1,思路:根据爬虫思想: 2,代码: /** * ClassName:AuthFr * Function: TODO * Reas ...

  6. Netty源码解析---服务端启动

    Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...

  7. Netty(6)源码-服务端与客户端创建

    原生的NIO类图使用有诸多不便,Netty向用户屏蔽了细节,在与用户交界处做了封装. 一.服务端创建时序图 步骤一:创建ServerBootstrap实例 ServerBootstrap是Netty服 ...

  8. Netty实现客户端和服务端通信简单例子

    Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象. 在Netty里面,Accept连接可以使用单独的线程池去处理,读写操作又是另外的线程池来处理. Accept连接和读写 ...

  9. Netty游戏服务器之四protobuf编解码和黏包处理

    我们还没讲客户端怎么向服务器发送消息,服务器怎么接受消息. 在讲这个之前我们先要了解一点就是tcp底层存在粘包和拆包的机制,所以我们在进行消息传递的时候要考虑这个问题. 看了netty权威这里处理的办 ...

随机推荐

  1. 写微信API所遇到的问题

    1.接口还没出来之前. 根据微信网页版的页面,自己做了页面,分成了两个页面,一个是登录之后的,一个是登录之前的.后来接口出来之后我师兄说要做成只有一个页面时,我就有点吓到了,想想都觉得难,后来用了JQ ...

  2. leetcode 141 142. Linked List Cycle

    题目描述: 不用辅助空间判断,链表中是否有环 /** * Definition for singly-linked list. * struct ListNode { * int val; * Lis ...

  3. django “如何”系列3:如何编写模型域(model filed)

    django自带很多的域类--CharField,DateField等等--,如果django的这些域都不能满足你精确的要求,那么你可以编写自己的模型域. django自带的域没有和数据库列类型一一对 ...

  4. vscode的go插件安装

    vscode安装go的很多插件都是失败,如下: Installing 5 tools at E:\www\go_project\bin go-symbols guru gorename goretur ...

  5. php上传文件限制

    客户端限制(客户端限制在实际上是无法阻止上传): 通过表单隐藏域限制上传文件的最大值 <input type=’hidden’ name=’MAX_FILE_SIZE’ value=’字节数’ ...

  6. OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. OpenCL安装 安装我不打算 ...

  7. TCP Socket Port Check

    写了两个小程序,主要是用于linux和windows下TCP端口的检测,自带的telnet无法满足我批量检测的需要,在我眼里这类端口检测程序最为关键的是超时的限制,若端口不能却要老久才返回结果,有点不 ...

  8. 【剑指offer】(第 2 版)Java 题解

    [剑指offer](第 2 版)Java 题解 第一章 面试的流程 略... 第二章 面试需要的基础知识 面试题 1. 赋值运算符函数 面试题 2. 实现 Singleton 模式 Solution ...

  9. Linux NFS服务器的简明配置6.8

    Linux NFS服务器的简明配置6.8   Linux NFS服务器的简明配置 一.NFS服务简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的 ...

  10. Attacking JavaScript Engines: A case study of JavaScriptCore and CVE-2016-4622(转)

    转:http://phrack.org/papers/attacking_javascript_engines.html Title : Attacking JavaScript Engines: A ...