原地址: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. if __name__ == '__main__':

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

  5. PORT = 1000         # 服务端端口

  6. ADDR = (HOST, PORT)

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

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

  9. while True:

  10. 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. from firefly.netconnect.protoc import LiberateFactory

  5. from firefly.utils import services

  6. from twisted.internet import reactor

  7. from twisted.python import log

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

  9. from twisted.internet import epollreactor

  10. epollreactor.install()

  11. if __name__ == '__main__':

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

  13. log.startLogging(sys.stdout)

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

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

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

  17. factory = LiberateFactory();

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

  19. reactor = reactor

  20. #添加服务通道

  21. factory.addServiceChannel(service)

  22. # 开始监听端口

  23. reactor.listenTCP(1000, factory);

  24. 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的初体验了。

[笨木头FireFly01]入门篇1·最简单的服务端和客户端连接的更多相关文章

  1. Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码

    Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...

  2. socket编程,简单多线程服务端测试程序

    socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.acce ...

  3. Netty入门系列(1) --使用Netty搭建服务端和客户端

    引言 前面我们介绍了网络一些基本的概念,虽然说这些很难吧,但是至少要做到理解吧.有了之前的基础,我们来正式揭开Netty这神秘的面纱就会简单很多. 服务端 public class PrintServ ...

  4. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  5. 一个PHP写的简单webservice服务端+客户端

    首先是服务端,服务端有一个主要的class组成:apiServer.php <?php /** * apiServer.php * * webservice主类 * * @filename ap ...

  6. JPush简单Java服务端案例实现

    一.激光推送准备工作 1.注册极光推送开发者账号,创建应用: 2.完成推送设置,填写应用名提交生成安装包: 3.扫码安装简单的测试apk,查看应用信息会有AppKey和Master Secret用于推 ...

  7. C# 编写WCF简单的服务端与客户端

    http://www.wxzzz.com/1860.html Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Win ...

  8. 基于jFinal建立简单的服务端-接收请求并返回指定内容

    本菜鸡是一名弱弱的测试工程师,最近完成了一个支付相关的项目,项目工作中,需要建立一个模拟支付宝的网关,主要是接收请求并返回数据.作为一名没有丝毫开发经验的菜鸡,初期入门相当费劲,主要还是思维上的转变. ...

  9. Netty实例-简单的服务端-client实现,凝视具体

           书籍推荐:                                       实例代码 :http://download.csdn.net/detail/jiangtao_st ...

随机推荐

  1. Xcode-项目模板修改

    项目模板就是创建工程的时候选择的某一个条目, Xcode会根据选择的条目生成固定格式的项目 例如想创建一个命令行项目就选择Command Line Tool 如何修改项目模板 1.应用程序中,找到Xc ...

  2. 第一章、C#委托和事件(Delegate、Event、EventHandler、EventArgs)

    第一章.C#委托和事件(Delegate.Event.EventHandler.EventArgs) 分类: 学习笔记-C#网络编程2012-12-08 14:10 7417人阅读 评论(3) 收藏  ...

  3. CentOS6.6图文详细安装教程(有些设置大部分教程没出现过,附带网络设置等)

    作者:Sungeek 出处:http://www.cnblogs.com/Sungeek/ 欢迎转载,也请保留这段声明.谢谢! Centos6.6 下载地址:thunder://QUFodHRwOi8 ...

  4. 通过命令行连接oracle数据库/进入sql plus

    1.直接打开SQL Plus登录,需要用户名和密码 开始->程序->Oracle->应用程序开发->sqlplus 我的电脑是“开始”->“Oracle - OraDb1 ...

  5. 关键字 virtual

    Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就 ...

  6. input内容改变触发事件,兼容IE

    <html> <head> <script type="text/javascript"> window.onload = function() ...

  7. 利用input事件来监听移动端的输入

    今天遇到一个新需求,经理要求评论功能需要限制字数,就像微博那样限制最多输入150字,这里就需要实时提醒用户还能输入多少字了. 在最开始的时候,想到的是监听keyup事件,然后计算用户输入的字数,但是有 ...

  8. [Interview][CodingExam]

    這次去Interview, 其中有一個公司 把我列為 2/25的考慮對象, 在Final 的 1/2, 我被刷掉了. 因為第一輪的程式,我稍微google了一下,參考了既有的寫法. 即使第二輪我用完全 ...

  9. js获取url参数值的两种方式

    js获取url参数值的方法有很多,下面也为大家介绍两种.  方法一:正则分析法  function getQueryString(name) {  var reg = new RegExp(" ...

  10. 九,WPF资源

    WPF资源的优点 WPF资源系统是一种保管一系列有用对象的简单方法,从而可以更容易地重用这些对象,它主要有以下优点: 高效,通过资源可以定义一个对象,并在标记中的多个地方重用,这会使代码变的更加精简, ...