Step By Step创建你自己的游戏服务器(二)登录服务器与Nancy

首先,用VS新建一个项目,我使用的是VS2013。以我的风格命名为Roy.GameEngine.LoginServer。这是一个控制台应用。

准备工作

接下来安装NancyFx

我们通过NuGet来获取Nancy.Hosting.Self和Nancy.Owin两个包,因为依赖于Nancy,所以也会自动获取Nancy。

由于需要读取玩家的账号信息,所以还需要连接数据库,我使用的是MySQL,那么继续通过NuGet获取MySql.Data。添加之后在App.Config中将出现如下图的配置节点。

Nancy中大量用到了dynamic,而我也懒得用DateTabel去取数据,一堆一堆的赋值比较麻烦,所以,添加一个同样适用dynamic的类库来使用,添加引用->程序集->扩展->WebMatrix.Data

最后的引用大概如图:

好了,引用差不多添加完了,终于可以开始码code了。

启动服务器

启动nancy非常简单,使用Nancy.Hosting.Self中的NancyHost就可以了,这里我加了一个AppSetting,作为访问地址的配置。

<appSettings>
  <add key="Url" value="http://127.0.0.1:8080"/>
</appSettings>

在Main函数中启动Host。

static NancyHost Host;
static void Main(string[] args)
{
    string url = ConfigurationManager.AppSettings["Url"];
    Host = new NancyHost(new Uri(url));
    Host.Start();
    Console.WriteLine("你的服务器已经启动,访问地址是 {0}", url);
    Console.ReadLine();//可以在这里写一个循环,用于运行中的命令行控制。
}

你还可以继承DefaultNancyBootstrapper,override她的虚函数实现自己的启动配置。

注意因为NancyFx通过反射public class来加载实现的派生类,所以这里所有继承的类都得是public的

F5运行,如果你看到下面这张可爱的小怪兽,恭喜,通讯OK了。

实现第一个请求,与数据库访问

回忆上一篇中的那张草图,loginServer只要有一个对外接口[请求令牌]就可以了。

创建一个文件夹Modules,添加类LoginModule,继承NancyModule,码构造函数。因为只有一个请求,所以Get还是Post随意,中间传输的信息可能需要另外加密,这部分我就不写了。获取到客户端传来的账号密码后就查询数据库验证玩家是否存在,存在则生成一个令牌,标记到期时间记入内存,同时发送给网关服务器。

既然要连接数据库,那么加入数据库连接字符串的配置,这里providerName使用之前添加mysql.data时候提供的invariant。

<connectionStrings>
  <add name="db" providerName="MySql.Data.MySqlClient" connectionString="server=*;port=*;uid=root;pwd=*;database=*;pooling=true"/>
</connectionStrings>

在LoginModule中就这样写

public class LoginModule:NancyModule
{
    public LoginModule()
    {
        Get["/{uname}/{pwd}"] = p =>
        {
            using (Database db = Database.Open("db"))
            {
                var uid = db.QueryValue("select uid from t_users where username=@0 and password=PASSWORD(@1)", p.uname, p.pwd);//看到这行数据库表结构是怎样的我就不多说了
                if (uid != null)
                {
                    Guid token = Guid.NewGuid();
                    //todo: 发送给网关服务器
                    //...
                    return Response.AsJson(new {Result="OK", Token = token});
                }
                else
                {
                    return Response.AsJson(new {Result="Failed"});
                }
            }
        };
    }
}

你可以使用浏览器来访问这个地址:http://127.0.0.1:8080/username/password 来测试,将收到一个类似 {"result":"OK","token":"6f3f1249-5ed4-4a92-8194-55653cfc874a"}的JSON数据。

好了,一个登录服务器的基础结构差不多就完成了。

与网关的通信部分可以使用一个TcpClient来连接,然后网关使用TcpListener来接收。这部分的内容,等接下来搞网关服务器的时候再说明。

当然,一个严肃的登录服要做的事情还有很多。比如通信加密,错误日志等等,与网关的通信模块也还有很多事情,比如短线重连等等。这篇仅能说到这里啦,下篇见。


from: http://123.56.119.97/2015/04/step-by-step-2-login-server

你可能感兴趣的:(Step By Step创建你自己的游戏服务器(二)登录服务器与Nancy)