firefly笔记一之http模块

  Firefly是免费开源的游戏服务器端框架,开发语言是python,基于twisted框架开发,作为一名前端人员都有一颗后端的梦。。希望能坚持下去一直把自己的学习新东西的过程记录下来,不对的地方能够及时一起探讨。

  首先确认好Firefly的搭建环境已经OK,没有搭建的可以参考官方网站:

http://www.9miao.com/forum.php?mod=viewthread&tid=33009&fromuid=87

http://www.9miao.com/forum.php?mod=viewthread&tid=43956&fromuid=87

为了更好的熟悉整个流程以及学习(这正是开源的力量)Firefly我们先从头新建一个工程一步步来

  1:创建工程

  2:由于新建的工程默认是支持一个长连接的配置,所以先把配置改成web的配置

    (1)修改config.json文件 把testserver的key改为我们的webport:

     (2)修改app/apptest.py

      (3) 启动Firefly

          (4)(打开浏览器输入http://localhost:1000/snoy)(因为我是远程其他电脑所以IP是另外一个台电脑IP,本地直接写localhost即可)

  3 再深入了解一下,我们真正开发时肯定是要传入参数的,例如一般弱联网游戏通过json来相互交互协议数据等,google查了下最常用的json库是simplejson。

首先下载安装simplejson,官网是https://pypi.python.org/pypi/simplejson/ 直接下载安装即可。

    (1)重新修改app/apptest文件

  

 1 #coding:utf8
 2
 3 from firefly.server.globalobject import webserviceHandle
 4 from twisted.web import resource
 5 import simplejson as json
 6
 7 @webserviceHandle('snoy')
 8 class helloFirefly(resource.Resource):
 9     def render(self, request):
10         length = request.getHeader('content-length')
11         print length
12         version = request.getHeader('Version')
13         print version
14         code = request.code
15         print code
16         method = request.method
17         print method
18         print request.path
19         print request.transport
20         value = request.args
21         jsonData = json.dumps(value)
22         print jsonData
23         s = json.loads(jsonData)
24         print s
25         print s["uid"]
26
27         #test
28         value1 = '{"name":"test", "type":{"name":"seq", "parameter":["1", "2"]}}'
29         s = json.loads(value1)
30         print s
31         print s.keys()
32         print s["name"]
33         print s["type"]["name"]
34         print s["type"]["parameter"][1]
35
36         return s

 (2)关闭Firefly 再重新打开

  关闭: pkill -9 -f python*

  打开: python startmaster.py

 (浏览器输入http://localhost:1000/snoy?uid=1&passwd=hello&acc=xiuxinming)

  注意查看服务器打印内容:

  (3)代码解析:

   通过看Twisted文档知道Twisted技术体系包含2个层次:协议和工厂。协议负责连接成功以后对交互的处理,而工厂则是负责连接过程。在HTTP协议中,连接之后还有个生成HTTP请求报文的过程,所以构造出了一个Request对象来处理具体的一个HTTP请求的报文。在HTTP中的请求报文处理对象是 twisted.web.http.Request 类;HTTP的协议类是 twisted.web.http.HTTPChannel ;HTTP工厂是 twisted.web.http.HTTPFactory类;

   这里知道客户端发给服务器的信息在request里面,那么通过request我们知道所有关于客户端的信息,其中对我们最主要的就是后面的内容了。

   看打印效果request.args是所以参数的内容,但是看内容格式是字典格式,所以首先通过simplejson把字典转化为json格式内容然后再读取出来value;

   基本上到这里对于客户端的解析部分应该就OK了。再来看下封包的格式,主要是simplejson的使用看simplejson文档主要就4个方法详细请  看http://blog.sina.com.cn/s/blog_7ca42bff010185ha.html。

  4:基本上如果只是应用的话对于弱社交部分够使用了以上,但是既然是开源为什么不进去看看到底咋回事呢,虽然一点不懂Twisted和Firefly。。。

    反过来追踪看看Firefly到底做了什么,首先追踪webserviceHandle在哪里出现,发现是在firefly-master\firefly\firefly\server\globalobject里面,看里面几个方法有

  

def masterserviceHandle(target):
def netserviceHandle(target):
def rootserviceHandle(target):
class webserviceHandle:"""这是一个修饰符对象"""def __init__(self,url=None):"""@param url: str http 访问的路径"""self._url = urldef __call__(self,cls):""""""if self._url:GlobalObject().webroot.putChild(self._url, cls())else:GlobalObject().webroot.putChild(cls.__name__, cls())
class remoteserviceHandle:

  虽然不懂具体是什么意思,但是看名字应该是各种服务的注册,刚入手从最简单的开始,看web部分的处理,大概意思应该是注册的功能。搜索putChild果然出现在Twisted官方文档里面

def putChild(self, path, child): (source)
from twisted.web.resource.IResource
Register a static child.You almost certainly don't want '/' in your path. If you intended to have the root of a folder, e.g. /foo/, you want path to be ''.def render(self, request): (source)
from twisted.web.resource.IResource
overridden in twisted.flow.web.Resource, twisted.web.distrib.ResourceSubscription, twisted.web.error.ErrorPage, twisted.web.proxy.ReverseProxyResource, twisted.web.rewrite.RewriterResource, twisted.web.script.PythonScript, twisted.web.script.ResourceScriptDirectory, twisted.web.script.ResourceScriptWrapper, twisted.web.soap.SOAPPublisher, twisted.web.static.ASISProcessor, twisted.web.static.Data, twisted.web.static.DirectoryLister, twisted.web.static.File, twisted.web.static.Redirect, twisted.web.twcgi.CGIDirectory, twisted.web.twcgi.CGIScript, twisted.web.util.DeferredResource, twisted.web.util.ParentRedirect, twisted.web.util.Redirect, twisted.web.vhost.NameVirtualHost, twisted.web.widgets.Gadget, twisted.web.widgets.Page, twisted.web.widgets.WidgetResource, twisted.web.woven.controller.BlankPage, twisted.web.woven.controller.Controller, twisted.web.woven.form.FormProcessor, twisted.web.woven.guard.SessionWrapper, twisted.web.woven.tapestry.Tapestry, twisted.web.woven.template.DOMController, twisted.web.woven.template.DOMTemplate
Render a given resource. See IResource's render method.

I delegate to methods of self with the form 'render_METHOD' where METHOD is the HTTP that was used to make the request. Examples: render_GET, render_HEAD, render_POST, and so on. Generally you should implement those methods instead of overriding this one.render_METHOD methods are expected to return a string which will be the rendered page, unless the return value is twisted.web.server.NOT_DONE_YET, in which case it is this class's responsibility to write the results to request.write(data), then call request.finish().

Old code that overrides render() directly is likewise expected to return a string or NOT_DONE_YET.

  通过阅读文档大概了解到resource是一个总节点会往下分发Resource,根据需求可以添加不同的child,render()方法是回调具体处理每一个节点的方法。那基本上有些疑问就解决了,为什么建立好render()方法之后客户端发来请求会自动调用,为什么注册一个webserviceHandle传个参数"snoy"就会自动找到这里来处理。那如果建立多个webserviceHandle传不同参数会不会都会被调用呢?经过测试时可以的,但是只能建立一级目录例如只能是http://172.16.3.229:1000/snoy  而不能是http://172.16.3.229:1000/snoy/test1/test2/   具体原因等以后深入了细看。

  再仔细想我们是直接处理的逻辑,那么包头啊 解析啊 发送等等哪里帮我们处理的呢?还是打开源代码看到个web文件夹进去看一下只有一个delayrequest.py文件,进去看了下很像是引擎帮我们封装了细节问题,我们只要处理逻辑就OK了,具体是不是还等待确定。

  

      

转载于:https://www.cnblogs.com/liunianing/p/3425865.html

Firefly笔记一之http模块相关推荐

  1. Python学习笔记:常用第三方模块3

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  2. Python学习笔记:常用第三方模块(1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. Python学习笔记:常用内建模块7XML

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. Python学习笔记:常用内建模块5

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. Python学习笔记:常用内建模块2:collections

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. 张高兴的 Windows 10 IoT 开发笔记:RTC 时钟模块 DS3231

    原文:张高兴的 Windows 10 IoT 开发笔记:RTC 时钟模块 DS3231 GitHub:https://github.com/ZhangGaoxing/windows-iot-demo/ ...

  7. Arduino笔记实验(初级阶段)—继电器模块

    Arduino笔记实验(初级阶段)-继电器模块 文章目录 Arduino笔记实验(初级阶段)-继电器模块 前言 一.电路图 二.继电器模块实验 代码 实验效果展示 三.继电器模块 实验总结 前言 自学 ...

  8. 微赞php.ini_微赞微擎二开笔记开发手册之模块开发指南(九)

    微赞微擎二开笔记开发手册之模块开发指南(九) 阅读本章内容之前请确定已了解微赞工作流程. 本章内容主要介绍如何编写及发布微赞功能模块. 微赞功能模块是微赞系统中扩展的独立功能, 微赞系统提供了相应的机 ...

  9. NodeJS学习笔记(四) events,util模块

    开发指南中讲到的node核心模块有events,util,fs,http.介于篇幅的原因,在这里我想分两个次总结笔记. Events模块 Events是node最重要的模块.Nodejs本身架构就是基 ...

最新文章

  1. 集合框架源码分析四(Collections类详细分析)
  2. 抠图为什么要用绿布_《暮白首》为什么如此火爆?五个原因带你深度剖析
  3. 莫斯科国立大学更新VQMT的测量指标
  4. 神器在手,代码命名从此高大上!
  5. 王道考研 计算机网络5 分层结构 协议 服务 接口
  6. 大数据-03-Spark入门
  7. WPF TreeView 绑定(demo 转)
  8. MFC_recvfrom
  9. 红帽linux5.6,Redhat Enterpris linux 5.6 安装
  10. python 关联分析算法的包_Python 极简关联分析(购物篮分析)
  11. Java中三层架构与MVC之间的显著区别
  12. Java ListIterator 与 Iterator 异同
  13. 制作pip源(按需,非镜像方式)
  14. winrar 解决广告弹窗及restorator简介
  15. 功能测试Ⅷ——业务流程测试
  16. 独自封装windows 10系统详细教程(二)
  17. 雪上加霜!吴秀波在《雪豹》中被除名
  18. 服务端通过AWS SNS创建消息推送记录
  19. Air Jordan 32 Performance Review
  20. 连接可用AP,提示“已连接,但无法访问互联网”,过一会变成“网络连接受限”,实际可以上网

热门文章

  1. 液晶面板价格高涨,OLED电视或迎来春天
  2. AI如何实现安全生产智能监控
  3. 嵌入式arm-linux的优点,ARM嵌入式主板有哪些优点和缺点
  4. gitlab 更新文件_烂泥:gitlab版本升级
  5. springboot发送邮件的一些坑与代码示例
  6. 软件测试入门篇(五)测试点提炼
  7. x264 代码重点详解 详细分析
  8. Redis应用详解(一)分布式锁
  9. 金蝶应收应付模块流程_金蝶应收应付手册
  10. reduceByKeyAndWindow基于滑动窗口的热点搜索词实时统计(Scala版本)