using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NetFrame { public class UserTokenPool { private Stack<UserToken> pool; public UserTokenPool(int max) { pool = new Stack<UserToken>(max); } 取出一个连接对象 --创建连接 UserToken pop() { return pool.Pop(); } push(UserToken token) { if (token != null) pool.Push(token); } public int Size { get { return pool.Count; } } } }
在这里我们定义了客户端连接、收到客户端消息和客户端断开连接的抽象类,标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NetFrame { AbsHandlerCenter { 客户端连接 ClientConnect(UserToken token); 收到客户端消息 MessageReceive(UserToken token, object message); 客户端断开连接 ClientClose(UserToken token, string error); } }
接下来具体实现客户端连接、断开连接以及收到消息后的协议分发到具体的逻辑处理模块,代码如下:
using GameProtocol; using LOLServer.logic; using LOLServer.logic.fight; using LOLServer.logic.login; using LOLServer.logic.match; using LOLServer.logic.select; using LOLServer.logic.user; using NetFrame; using NetFrame.auto; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LOLServer { public class HandlerCenter:AbsHandlerCenter { HandlerInterface login; HandlerInterface user; HandlerInterface match; HandlerInterface select; HandlerInterface fight; public HandlerCenter() { login = new LoginHandler(); user = new UserHandler(); match = new MatchHandler(); select = new SelectHandler(); fight = new FightHandler(); } ClientClose(UserToken token, string error) { Console.WriteLine(); select.ClientClose(token, error); match.ClientClose(token, error); fight.ClientClose(token, error); //user的连接关闭方法 一定要放在逻辑处理单元后面 //其他逻辑单元需要通过user绑定数据来进行内存清理 //如果先清除了绑定关系 其他模块无法获取角色数据会导致无法清理 user.ClientClose(token, error); login.ClientClose(token, error); } ClientConnect(UserToken token) { Console.WriteLine(); } MessageReceive(UserToken token, object message) { SocketModel model = message as SocketModel; switch (model.type) { case Protocol.TYPE_LOGIN: login.MessageReceive(token, model); break; case Protocol.TYPE_USER: user.MessageReceive(token, model); break; case Protocol.TYPE_MATCH: match.MessageReceive(token, model); break; case Protocol.TYPE_SELECT: select.MessageReceive(token, model); break; case Protocol.TYPE_FIGHT: fight.MessageReceive(token, model); break; default: ; } } } }
写到这里,服务器终于可以启来了,不管你激不激动,反正坐在这里写写画画了一天我是激动了,总算要大功告成了。 : )
启动服务器->监听IP(可选)->监听端口,服务器处理流程如下图:
让我们来具体看看代码实现,均给了详细的注释: