[笨木头FireFly01]入门篇1·最简单的服务端和客户端连接

原地址:http://www.9miao.com/question-15-53938.html

最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西。
那为嘛我要学FireFly呢?

之前我自己写了一个网络游戏,服务端和客户端都自己写,虽然运行起来没什么大碍,但毕竟我对服务端没什么经验,自己写的服务端安全性和扩展性不太行,稳定性自然也不靠谱(即使它还没有出现问题)。

正好,最近FireFly这个开源的游戏服务器引擎出来了,虽然还不太完善,但是觉得还不错,起码我用是足够了~
无奈,FireFly的文档和demo奇缺,虽然有几个大项目的demo,但对于初学Python和FireFly的我来说,我更需要的是文档以及小demo。

好吧,别人是免费贡献的,我不能要求太多,现在只好自己硬着头皮一点点研究了。

声明:
本教程基于FireFly1.2.2版本、Python2.7版本。
本教程面向Python和FireFly初学者中的初学者(比如我)

本教程由笨木头花心贡献,花心?不,是用心~!
【大鸡蛋补充一下原著链接地址】转载请注明原文地址:http://www.benmutou.com/blog/archives/727
转载请注明原文地址:可恶,竟然不然我发url..没法放出处,我亏了~噗,来自[笨木头与游戏开发]博客

既然FireFly是游戏服务器引擎,那自然就是用来开发网游了,本教程的目的是使用它,不是解剖它,所以,我们最先要了解的就是,怎么创建服务端和客户端,并且连接上。

1. 客户端


为什么先写客户端?因为它比较简单。
OK,上代码(client.py):

  1. #coding:utf8

  2. from socket import AF_INET, SOCK_STREAM, socket

  3.  

  4. if __name__ == '__main__':

  5.     HOST = "localhost"  # 服务端地址

  6.     PORT = 1000         # 服务端端口

  7.     ADDR = (HOST, PORT)

  8.  

  9.     client = socket(AF_INET, SOCK_STREAM)   # 创建socket,TCP

  10.     client.connect(ADDR)                    # 连接服务器

  11.     while True:

  12.         pass

复制代码

这就是FireFly的最简单的一个客户端实现...(小若:才怪~!这明显就是没有用到FireFly的任何东西!)
哦呵呵呵,那当然是没有用到FireFly的东西了,人家FireFly可是专业搞服务端的。

好,因为本教程面向Python初学者,稍微解释一下代码。
第一行,你以为我想说的是from import?错了~!是#coding:utf8,这是声明代码用的编码格式,它有什么用?你应该反过来,没了它会怎么样?大家自己试试就知道了,反正没了它我运行不了代码,提示编码格式的问题。

于是,第二行,from import的东西,这就是导入,类似于Java的import语句以及C++的include,详情请玩一遍Python新手指导(有中文的)~

然后,那个什么 if __name__ == ‘__main__’又是什么意思?可以理解为入口函数,只要这个py文件是直接运行的,它的__name__属性的值就是__main__。反正就是在运行这个py文件的时候开始要做的事情。

最后,创建socket,然后连接服务器,反正这些用的是Python的API或者是第三方库,细节就不管了。Socket创建的方式默认大家已经有所了解(小若:不了解),哦呵呵呵,不了解的话,那怎么写服务端呢?~度娘会帮你的~

2.服务端


喂,如果你觉得刚刚的客户端有点难度的话,那恭喜你了,接下来的服务端更难了(小若:那我走了,关浏览器)

2.1 一个Python的网络框架-Twisted


据说Twisted是一个很强大的网络框架,用Python写的,并且是开源的。FireFly使用了它。
我自己也还没有深入了解,所以不深入了。

2.2 Service-服务


Service(服务)是一个什么东西呢?就我个人的理解,它用于处理客户端发过来的数据,但它并不是去解析这些数据,不是去处理什么分包粘包。它只是处理逻辑,也就是数据解析后要进行的操作的判断。
算,这些都不仔细说,以后等我研究清楚了再说,免得害人,嘿嘿。

2.3 LiberateFactory-协议工厂


协议工厂就是专门处理通信数据的了,按照FireFly其中一个教程帖子的说明,协议工厂主要处理如下的事情:服务端与客户端通信的一些处理方法,包括发送数据的封装,协议头的封装,tcp通信时进行分包,处理粘包问题。

协议工厂可以绑定一个Service服务,这样,当数据包解析好之后,就可以传给Service进行下一步的游戏逻辑处理。(小若:如果你觉得我已经听懂了的话,你就继续说,我闪人~!)

好,我相信大家已经蒙了。
服务端大致的流程是这样的:
1)利用Twisted框架来处理网络方面的事情,最直白的就是监听端口,然后客户端才能连上服务器
2)客户端的数据到达时,LiberateFactory协议工厂就会开始解析
3)数据解析完了,就丢给Service服务来处理,比如是登录请求还是战斗请求什么的。

2.5 看代码


废话唠叨完了,来看看代码吧:

  1. #coding:utf8

  2. import os

  3. import sys

  4.  

  5. from firefly.netconnect.protoc import LiberateFactory

  6. from firefly.utils import services

  7. from twisted.internet import reactor

  8. from twisted.python import log

  9.  

  10. if os.name!='nt':#对系统的类型的判断,如果不是NT系统的话使用epoll

  11.     from twisted.internet import epollreactor

  12.     epollreactor.install()

  13.  

  14.  

  15. if __name__ == '__main__':

  16.     # 有了它,就能看到日志的输出

  17.     log.startLogging(sys.stdout)

  18.     

  19.     # 服务,我个人理解为对客户端数据的逻辑处理

  20.     service = services.Service("testService")

  21.     

  22.     # 处理数据封装、协议头封装、分包、粘包处理的类

  23.     factory = LiberateFactory();    

  24.     

  25.     # 关于twisted的知识,暂时忽略吧,我也还没研究,是一个Python的网络框架

  26.     reactor = reactor

  27.     

  28.     #添加服务通道

  29.     factory.addServiceChannel(service)

  30.     

  31.     # 开始监听端口

  32.     reactor.listenTCP(1000, factory);

  33.     reactor.run()

复制代码

开头判断NT系统的,就不管了,因为我还没了解Twisted。

来看看整个服务的启动流程:
1) 创建一个Service服务对象,参数是服务名字,自己随便取就好
2) 创建LiberateFactory协议工厂
3) 给协议工厂添加一个服务,也就是我们上面创建的service
4) 开始监听端口,传入factory对象,用于处理发送过来的数据

好了,这是一个服务端的最基本要有的东西。现在,大家先运行服务端,使用Eclipse作为IDE的就按Ctrl+F11,使用Python自带编辑器的,就按F5。
于是,我们会看到类似下面的日志输出:
2013-10-08 11:31:47+0800 [-] Log opened.
2013-10-08 11:31:47+0800 [-] LiberateFactory starting on 1000
2013-10-08 11:31:47+0800 [-] Starting factory

这就成功了,然后,运行客户端,服务端会输出以下日志:
2013-10-08 11:32:35+0800 [firefly.netconnect.protoc.LiberateFactory] Client 0 login in.[127.0.0.1,6297]


完美,这就是我们对FireFly的初体验了。

posted @ 2014-08-11 16:41  ing...  阅读(1417)  评论(0编辑  收藏  举报