首先,用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