Jun 21

前期文章: 网络游戏的架构

大厅服务器(Hall Server)接受房间服务器(传输服务器)的连接并保持, 向房间服务器发送指令, 指示创建和销毁临时登录口令. 销毁口令的指令一般由房间服务器发给大厅服务器, 在用户断开与房间服务器的连接时.

大厅服务器有控制接口, 接受TCP短连接发来的指令, 如创建口令, 销毁口令, 转交给相应的房间服务器.

大厅服务器维护着一个关于所有房间服务器的状态的列表, 并向外提供查询接口. 该查询是TCP短连接的形式.

控制接口和查询接口使用相同的访问点.

Written by benegg at 2009-06-21 15:02:21 | tags: ,

Jun 20

前期文章: 网络游戏的架构

传输服务器(Transport Server), 也即传输服务器(Room Server)需要和三种角色进行交互: 一个或者多个游戏客户端, 一个大厅服务器, 一个游戏服务器(逻辑服务器).

传输服务器接受游戏客户端的连接, 读取客户端指令, 周期地转发给游戏服务器. 在一个周期内, 为每一个客户端最多转发一个指令.

传输服务器读取来自大厅服务器的指令, 动态地创建客户端口令(口令可能由大厅服务器生成). 传输服务器将口令放在内存中, 当客户端连接登录时, 只用很少的计算周期便可完成验证, 避免数据库查询等慢速操作.

传输服务器读取来自游戏服务器的指令, 立即转发给相应的客户端.

角色C/S关系:

  • 传输服务器连接大厅服务器
  • 传输服务器连接游戏服务器
  • 游戏客户端连接传输服务器

Written by benegg at 2009-06-20 18:04:06 | tags: ,

Jun 20

整个系统只有一个大厅服务器(Hall Server), 大厅服务器收集房间服务器(Room Server)的连接信息, 提交给Web Server. 为了让Room Server的实现简单, 不让Room Server直接同Web Server交互.

当用户请求进入某个房间时, Web Server向Hall Server发送指令, Hall Server将指令转交给相应的Room Server. Room Server在这里可视为游戏服务器(Game Server)的接口.

当用户的请求得到允许后, 他将得到一个密钥, 用于进入Room Server. Web Client创建一个游戏进程, 并将密钥和其它信息通过参数或者stdio传给新起的游戏进程. 游戏进程连接Room Server, 开始进行游戏.

Written by benegg at 13:50:16 | tags: ,

May 10

整个传输层被抽象成为transport, 简写成xprt, 程序中一般只有一个实例. xprt使用时有两个重要的方法, 一般在主循环中使用:

1
2
3
4
5
/* 等待一条就绪的连接(新连接, 已断开, 读取完报文). */
struct link *xprt_wait(struct xprt *xprt);
 
/* 传输层接受一条连接. */
int xprt_accept(struct xprt *xprt, struct link *link);

连接(link)是socket的封装, 所以会有多个实例. link有两个方法:

1
2
3
4
5
/* 在连接读就绪后(LINK_FLAG_IN)调用, 从连接的接收缓冲中读取报文. */
int link_recv(struct link *link, struct packet *pkt);
 
/* 发送一个报文, 返回已发送(也可能仅仅是拷贝到发送缓冲)的字节数. */
int link_send(struct link *link, struct packet *pkt);

Continue reading »

Written by benegg at 2009-05-10 17:02:14 | tags: