利用nginx的事件模型开发自己的应用

Nginx拥有大名鼎鼎的事件模型,在初始化介绍后循环调用ngx_process_events_and_timers(cycle),来处理各种事件。并且其高效的时间模块,能很方便地控制各event的超时等。

这样的一套机制,不仅适用于http,mail等应用,甚至我们可以不管nginx里的网络功能,利用这套event机制,开发一个本地的小应用。这样做很好玩,也可以更好的学习nginx的事件、时间模型。


这里以一个简单的游戏服务器为例。

首先看一下nginx作为服务器,其网络功能的实现情况。

Init_cycle()
	Parse_conf();			//解析配置文件,找到所有的listen ip:port
	Listen_fd = listen()		//打开所有的监听
	Listen_fd 分配一个connection结构
	R/W事件则依附于connection结构,listen_fd的R->handler = ngx_event_accept()

这些构建过程可详细参考http、listen等指令的set()函数。这些listen_connection就是所有事件的起源,接受连接后,ngx_event_accept()会得到con_fd,并分配给它一个connection结构,并初始化之。ngx_event_accept()的最后会调用listen->handler,以确保用于不同功能的con_fd得到各自相应的初始化。

其中最重要的就是设置con_fd的R/W->handler,如http功能的R->handler= ngx_http_init_request()。当该con_fd接收到数据时,就会初始化http流程。


现在就可以来开发我们自己的功能模块了,首先看配置文件:

/* nginx.conf */
……
Event {
……
}
http {
……
}
Tplay {
Server {
    Listen  ip:port;
    Game  exnumber;
    ……
}
Server {
    Listem *:port;
    Game rld;
    ……
}
}

其中tplay,listen的set()函数,参考http的来写就行了,最后tplay_listen->handler()作为tplay_connect_fd的最后初始化,可以根据需要来写。

比如以这里的exnumber游戏为例(就是猜数,每次server返回偏大或偏小,直到猜对):最终设置con_fd的R->handler()为ngx_tplay_exnumber_judge(),来判断所猜数字偏大还是偏小,并且可以为R->ev->timer设置超时值,提高游戏的挑战性。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值