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

Firefly是免费开源的游戏服务器端框架,开发语言是python,基于twisted框架开发,作为一名前端人员都有一颗后端的梦。。希望能坚持下去一直把自己的学习新东西的过程记录下来,不对的地方能够及时一起探讨。
        首先确认好Firefly的搭建环境已经OK,没有搭建的可以参考官方网站:
        http://bbs.9miao.com/forum.php?m ... 3009&fromuid=87
        http://bbs.9miao.com/forum.php?m ... 3956&fromuid=87
        为了更好的熟悉整个流程以及学习(这正是开源的力量)Firefly我们先从头新建一个工程一步步来
       <ignore_js_op>

2:由于新建的工程默认是支持一个长连接的配置,所以先把配置改成web的配置
                (1)修改config.json文件 把testserver的key改为我们的webport:
                       <ignore_js_op>

(2)修改app/apptest.py
                       <ignore_js_op>

(3) 启动Firefly
                       <ignore_js_op>

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

3 再深入了解一下,我们真正开发时肯定是要传入参数的,例如一般弱联网游戏通过json来相互交互协议数据等,google查了下最常用的json库是simplejson。首先下载安装simplejson,官网是https://pypi.python.org/pypi/simplejson/ 直接下载安装即可。
                (1)重新修改app/apptest文件

  1. #coding:utf8

  2. from firefly.server.globalobject import webserviceHandle

  3. from twisted.web import resource

  4. import simplejson as json

  5. @webserviceHandle('snoy')

  6. class helloFirefly(resource.Resource):

  7. def render(self, request):

  8. length = request.getHeader('content-length')

  9. print length

  10. version = request.getHeader('Version')

  11. print version

  12. code = request.code

  13. print code

  14. method = request.method

  15. print method

  16. print request.path

  17. print request.transport

  18. value = request.args

  19. jsonData = json.dumps(value)

  20. print jsonData

  21. s = json.loads(jsonData)

  22. print s

  23. print s["uid"]

  24. #test

  25. value1 = '{"name":"test", "type":{"name":"seq", "parameter":["1", "2"]}}'

  26. s = json.loads(value1)

  27. print s

  28. print s.keys()

  29. print s["name"]

  30. print s["type"]["name"]

  31. print s["type"]["parameter"][1]

  32. return s

复制代码

(2)关闭Firefly 再重新打开
                        关闭: pkill -9 -f python*
                          打开: python startmaster.py
                 (浏览器输入http://localhost:1000/snoy?uid=1&passwd=hello&acc=xiuxinming)
                注意查看服务器打印内容:
               <ignore_js_op>

(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里面,看里面几个方法有
       <ignore_js_op>

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

  1. def putChild(self, path, child): (source)

  2. from twisted.web.resource.IResource

  3. Register a static child.

  4. 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 ''.

  5. def render(self, request): (source)

  6. from twisted.web.resource.IResource

  7. 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

  8. Render a given resource. See IResource's render method.

  9. 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.

  10. 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().

  11. 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了,具体是不是还等待确定。
        最后想问一下很二的问题。。。python既然是脚本语言为什么我在运行服务器代码之后,修改了py文件但是发现测试效果并没有变化呢,一定要重新启动服务器才管用,按理来说不会啊,例如lua 都是运行起来之后动态随时可以看到更改效果。

firefly笔记一之http模块的更多相关文章

  1. NodeJS学习笔记之Connect中间件模块(一)

    NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...

  2. Python:笔记(2)——函数与模块

    Python:笔记(2)——函数与模块 Python函数 关于函数 1.我们可以使用Help来查看函数的帮助信息 2.调用函数的时候,如果传入的参数数量或者类型不符合均会报错. 3.函数名其实就是一个 ...

  3. nodejs学习笔记之包、模块实现

        简单了解了node的安装和一些基本的常识之后,今天学习了node中很重要的包和模块的一些知识点.       首先学习一下包的规范,它由包结构和包描述两部分组成.包结构用于组织包的各种文件,包 ...

  4. python学习笔记(六)— 模块

    一.os.sys模块 import os print(os.getcwd())#取当前工作目录,绝对路径 print(os.chdir("../"))#更改当前目录 print(o ...

  5. Python基础笔记系列十:模块

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 模块 #1.类比于java中的jar包,模块能让你能够有逻辑地组织你的Py ...

  6. 《java并发编程实战》读书笔记4--基础构建模块,java中的同步容器类&并发容器类&同步工具类,消费者模式

    上一章说道委托是创建线程安全类的一个最有效策略,只需让现有的线程安全的类管理所有的状态即可.那么这章便说的是怎么利用java平台类库的并发基础构建模块呢? 5.1 同步容器类 包括Vector和Has ...

  7. python3-cookbook笔记:第十章 模块与包

    python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...

  8. Spring4读书笔记(1)-模块

    Srping主要模块 Core Container spring-core,spring-beans: 提供基础功能,包括IoC和DI等特性.对依赖起到解耦作用(BeanFactory). sprin ...

  9. Angularjs学习笔记(二)----模块

    一.定义 如何将全局定义的控制器模块化 先看下全局定义的控制器 var HelloCtrl=function($scope){ $scope.name='World'; } 模块化后代码 angula ...

随机推荐

  1. asp.net php asp jsp 301重定向的代码

    介绍一下针对各类程序系统实施301重定向的代码: 1.Linux主机重定向 Godaddy的Liunx主机,Godaddy本身已经支持Apache,所以直接创建一个.htaccess文件就可以了,一般 ...

  2. VS2012生成不依赖运行时不依赖MFC的MFC程序

    转载请注明来源:http://www.cnblogs.com/xuesongshu/ 1.新建MFC或者Win32工程,全部使用默认设置 2.设置工程属性,展开配置属性,转到:常规~MFC的使用,修改 ...

  3. ios Swift 国外资源

    Swift国外资源汇总(No.1) 此类分享贴暂定每2天更新一次,主要目的是让大家能跟国外开发者们同步,共享知识和共同提高. 对于一些非常有价值的文章,大家有兴趣可以自行翻译(回贴跟我说一声,避免重复 ...

  4. Objective-c中的对象间的消息传递以及消息路由

    刚开始使用Objective-C时,总是习惯将对象间发送消息之间称呼为方法调用.心想,这和c#不是一回事吗?不就是调用实例方法吗,还搞个消息发送作甚,最后还不是要转化为方法的调用?通过一段时间的理解学 ...

  5. 找不到System.Runtime.Serialization.Json的解决方案

    System.ServiceModel System.ServiceModel.Web System.Runtime.Serialization 三者均要添加引用

  6. eclipse注册码生成,在eclipse3.3.x上测试可用

    这段时间刚加入一个新的项目组,项目组使用的Flex框架. 开发工具由项目组统一提供,使用的是Eclipse 3.3.0,里面包含了其他开发人员集成上去的许多插件,个人感觉比较实用.但是这个版本Ecli ...

  7. EL表达式获取Map和List中的值

    EL表达式获取Map和List中的值   EL表达式取Map中的值: 当Map中是String,String时 后台servlet中: Map<String, String> map1 = ...

  8. 详解null

    前言 在java中初始化的时候经常用到null,也经常会碰到空指针异常(NullPointerException),由于碰到的频率比较高,我认为有必要进行一下了解,揭开它的神秘面纱. 一.null是代 ...

  9. ThreadPool 线程池的作用

    相关概念: 线程池可以看做容纳线程的容器: 一个应用程序最多只能有一个线程池: ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...

  10. ◆◆◆◆◆◆◆◆◆◆◆linux下软件包的管理◆◆◆◆◆◆◆◆◆◆◆◆◆◆

    查看与制定的路径名相匹配的软件包 [root@localhost certs]# which ls alias ls='ls --color=auto' /bin/ls [root@localhost ...