Unity教程之-创建你自己的游戏服务器(二)

 

上篇文章《创建你自己的游戏服务器(一)》,本篇unity3d教程我们继续来学习下,登录服务器与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,作为访问地址的配置。

</p><p>&lt;appSettings&gt;<br /> &lt;add key="Url" value="http://127.0.0.1:8080"/&gt;<br /> &lt;/appSettings&gt;</p><p>

在Main函数中启动Host。

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

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

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

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

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

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

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

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

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

在LoginModule中就这样写

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

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

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

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

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