只有你足够强,别人才会和你讲道理。
文章: 280
浏览: 2,984,331
  • 博主:笨木头
  • 关注:Unity、Net Core、Blazor
  • 邮箱:musicvs@163.com
笨木头  2013-10-08 11:46     其它     阅读(8219)     评论(2)
转载请注明,原文地址: http://www.benmutou.com/archives/718
文章来源:笨木头与游戏开发
最近一直在写游戏,几乎没有来写教程了,打算放慢一下脚步,学学新东西。

为嘛我要学FireFly呢?

 

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

 

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

 

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




声明:

本教程基于FireFly1.2.2版本、Python2.7版本。

本教程面向PythonFireFly初学者中的初学者(比如我)

本教程由笨木头花心贡献,花心?不,是用心~

转载请注明原文地址:http://www.benmutou.com/archives/718




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

 

1. 客户端

为什么先写客户端?因为它比较简单。

OK,上代码(client.py)

[cce_python]

#coding:utf8

from socket import AF_INET, SOCK_STREAM, socket

if __name__ == '__main__':

HOST = "localhost"  # 服务端地址

PORT = 1000         # 服务端端口

ADDR = (HOST, PORT)

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

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

while True:

pass

[/cce_python]

这就是FireFly的最简单的一个客户端实现...(小若:才怪~!这明显就是没有用到FireFly的任何东西!)

哦呵呵呵,那当然是没有用到FireFly的东西了,人家FireFly可是专业搞服务端的。

 

,因为本教程面向Python初学者,稍微解释一下代码。

第一行,你以为我想说的是from import?错了~!是#coding:utf8,这是声明代码用的编码格式,它有什么用?你应该反过来,没了它会怎么样?大家自己试试就知道了,反正没了它我运行不了代码,提示编码格式的问题。

 

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

 

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

 

后,创建socket,然后连接服务器,反正这些用的是PythonAPI或者是第三方库,细节就不管了。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 看代码

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

[cce_python]

#coding:utf8

import os

import sys

from firefly.netconnect.protoc import LiberateFactory

from firefly.utils import services

from twisted.internet import reactor

from twisted.python import log

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

from twisted.internet import epollreactor

epollreactor.install()

if __name__ == '__main__':

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

log.startLogging(sys.stdout)

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

service = services.Service("testService")

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

factory = LiberateFactory();

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

reactor = reactor

#添加服务通道

factory.addServiceChannel(service)

# 开始监听端口

reactor.listenTCP(1000, factory);

reactor.run()

[/cce_python]

开头判断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 <firefly.netconnect.protoc.LiberateFactory instance at 0x0000000002F4C508>

这就成功了,然后,运行客户端,服务端会输出以下日志:

2013-10-08 11:32:35+0800 [firefly.netconnect.protoc.LiberateFactory] Client 0 login in.[127.0.0.1,6297]

 

 

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

 

再次声明,我也是刚接触FireFlyPython,请带着批判的眼光看待本文,本文为木头个人学习记录,仅供参考。
2 条评论
  • Oo幻想oO 2013-10-08 12:26:59

    虽然暂时还是学客户端,可是感觉以后还是要学的,先留个名先 哇咔咔
    0回复
    • 博主 糟糕_树叶的mut 2013-10-08 14:02:47

发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发