关于ubuntu12.04下firefliy的架设
来源:互联网 发布:动画软件flash下载 编辑:程序博客网 时间:2024/06/05 15:24
这篇文章本来是我发在9秒论坛的一篇文章,但前几天发现因为论坛改版,原版文章已经不能正常访问,附件也不能下载了,所以决定在自己的博客重新写一次,并且针对上次文章的反馈稍微修改下,因为上次,有人用按我文章的内容搭建之后,发现我文章里面缺了一个小的需要注意的环节,我在交流群里面已经给出了解决方法,所以这次一起写一下,
ubuntu12.04安装,因为我电脑里本来就装了ubuntu12.04虚拟机,所以安装系统就不说了,大家要想自己尝试安装,自己去下个安装镜像,或者写信给开发组,开发组会邮寄一张安装光盘给你的(注:ubuntu没有yum服务,安装命令为apt-getinstall)。
开始安装必要的软件
第一步:gcc安装,Linux下如果不是刚装的系统,这个应该之前都安装好了
我们来查看是否安装gcc
$ gcc –vsersion
如果没有安装那么登陆 【软件中心】
如果找不到【软件中心 】在Dash主页里面的已安装软件里找,在软件中心搜索栏里搜索gcc,或者打开终端(找不到的话,同样去Dash主页里面的已安装软件里找),在终端里面敲入
$ sudo apt-get build-depgcc,装完我们进行下一步mysql安装
Mysql跟gcc一样,我们都在【软件中⼼】安装,终端安装命令为sudo apt-get installmysql-server
服务端安装好后,根据自己的喜好来安装客户端软件,我个人喜欢Mysqlnavigator 功能很强大,操作也比较简单,跟使用windows下的软件很相似。在【软件中⼼】里面直接可以找到安装。
python 安装
还是登陆 【软件中心】搜索框内输入 python会出现python2.7 可以直接进行安装
easy_install 安装
终端下
swordfishx@swordfishx-virtual-machine:~$ sudo apt-get install python-setuptools[sudo] password for swordfishx:apt-get install libmysqld-devapt-get install libmysqlclient-devsudo apt-get install python-dev
如果遇到mysql开发版的问题,上面的几个安装会解决问题。如果没有遇到问题,那就继续。
下面安装protobuf 安装
.下载https://code.google.com/p/protobuf/downloads/list
解压并安装解压命令
tar zxvf protobuf-2.5.0.tar.bz2或者右键解压
然后
tar zxvf protobuf-2.5.0.tar.bz2或者右键解压然后cd protobuf-2.5.0 //进入安装目录./configure //文件安装配置make && make install //安装
libevent 安装一样.下载http://libevent.org/.解压安装tar zxvf libevent-2.0.21-stable.tar.gzcd libevent-2.0.21-stable./configure --prefix=/usr //稍有不同make && make install
memacached安装
终端直接输入(不要自己下载memcached编译安装,不知什么原因,编译不成功,不要给自己找麻烦)
sudoapt-get install memcached
安装之后
键入memcached -d -m 128 -p 11211 -u root 开启服务,服务命令参数为{ -p 监听的端口 -l 连接的 IP地址, 默认是本机 -d start 启动 memcached 服务 -d restart 重起 memcached 服务 -d stop|shutdown 关闭正在运行的 memcached 服务 -d install 安装 memcached 服务 -d uninstall 卸载 memcached 服务 -u 以的身份运行 (仅在以 root运行的时候有效) -m 最大内存使用,单位 MB。默认 64MB -M 内存耗尽时返回错误,而不是删除项 -c 最大同时连接数,默认是 1024 -f 块大小增长因子,默认是 1.25 -n 最小分配空间,key+value+flags 默认是 48 -h 显示帮助}新开个终端窗口telnet 127.0.0.1 11211 之后键入stats命令可以查看当前看缓存服务的状态具体操作swordfishx@swordfishx-virtual-machine:~$ telnet 127.0.0.1 11211Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'. //说明监控成功,之后输入statsstatsSTAT pid 534STAT uptime 96STAT time 1392961141STAT version 1.4.13STAT libevent 2.0.21-stableSTAT pointer_size 32STAT rusage_user 0.008000STAT rusage_system 0.000000STAT curr_connections 5STAT total_connections 6STAT connection_structures 6STAT reserved_fds 20STAT cmd_get 0STAT cmd_set 0STAT cmd_flush 0STAT cmd_touch 0STAT get_hits 0STAT get_misses 0STAT delete_misses 0STAT delete_hits 0STAT incr_misses 0STAT incr_hits 0STAT decr_misses 0STAT decr_hits 0STAT cas_misses 0STAT cas_hits 0STAT cas_badval 0STAT touch_hits 0STAT touch_misses 0STAT auth_cmds 0STAT auth_errors 0STAT bytes_read 7STAT bytes_written 0STAT limit_maxbytes 67108864STAT accepting_conns 1STAT listen_disabled_num 0STAT threads 4STAT conn_yields 0STAT hash_power_level 16STAT hash_bytes 262144STAT hash_is_expanding 0STAT expired_unfetched 0STAT evicted_unfetched 0STAT bytes 0STAT curr_items 0STAT total_items 0STAT evictions 0STAT reclaimed 0END^]quit //退出命令,上面就是memcached运行的状态---------------------------------------------------memcached 服务器的功能呢,是生成一个虚拟的数据库,因为这个临时数据库存在在内存中,所以读写速度大大加快,隔一段时间memcached会把内存里的临时数据更新进数据库。
到现在我们工作完成了大半了
下面我们安装第三方库
Sudo easy_install twistedSudo easy_install python-memcachedSudo easy_install DBUtilsSudo easy_install zope.interfaceSudo easy_install affinitySudo easy_install MySQL-python
Firefly 安装
http://www.9miao.com/thread-44805-1-1.html下载
2.解压之后
Cd 安装目录
python setup.py buildpython setup.py install测试是否安装成功swordfishx@swordfishx-virtual-machine:~$ firefly-admin.py createproject FireflyHelloWorldcreate dir FireflyHelloWorld create success //说明可以创建swordfishx@swordfishx-virtual-machine:~$ cd FireflyHelloWorldswordfishx@swordfishx-virtual-machine:~/FireflyHelloWorld$ lsapp appmain.py config.json startmaster.py toolswordfishx@swordfishx-virtual-machine:~/FireflyHelloWorld$ python startmaster.py2014-02-21 14:16:13+0800 [-] Log opened.2014-02-21 14:16:13+0800 [-] DelaySite starting on 99982014-02-21 14:16:13+0800 [-] Starting factory <firefly.web.delayrequest.DelaySite instance at 0x8c7014c>2014-02-21 14:16:13+0800 [-] BilateralFactory starting on 99992014-02-21 14:16:13+0800 [-] Starting factory <firefly.distributed.root.BilateralFactory instance at 0x8c706ec>2014-02-21 14:16:14+0800 [-] Log opened.2014-02-21 14:16:14+0800 [-] gate start...2014-02-21 14:16:14+0800 [-] Log opened.2014-02-21 14:16:14+0800 [-] net start...2014-02-21 14:16:14+0800 [-] gate pid: 21862014-02-21 14:16:14+0800 [-] net pid: 21872014-02-21 14:16:14+0800 [BilateralBroker,1,127.0.0.1] node [gate] takeProxy ready好了这样,我们的firefly就安装完了。
firefly安装好了,我们就拿个官方的通信例子测试一下
首先看下json配置文件都都代表什么
配置中主要包括四个部分,master,servers,db,memcached。master 用来
定义master 的端口,servers 用来定义各个服务器中的配置,以及服务进程的
扩展。db定义了数据库的连接配置信息,memcached配置 memcached服务
的连接配置信息。
master 配置
rootport master 服务的管理端口;
webport master 服务的对外http端口,通过web接口实现对各个服务进
程的管理。
servers 配置
server 下面配置的没一个key 的名称就是定义的新的服务进程的名称。通过
添加新的项来扩充服务进程。每个服务进程的配置规则如下:
netport[可选]提供客户端进行tcp连接的端口,用户与客户端的通信。
rootport[可选]提供其他服务进程连接的端口,这样实现进程间的RPC 调用
rootname要连接到的服务进程的名称,rootport要连接到的服务进程的端口。
name[可选]服务进程的名称
app[可选]指定该进程的入口模块名称
log[可选]指定该进程的日志文件存放信息
db[可选]是否需要数据库服务
mem[可选]是否需要memcached缓存服务
cpu[可选]进程绑定到指定 cpu核心运行,减少 cpu 切换的性能消耗
db 配置[可选]
host 数据库服务地址
user 数据库用户名
passwd 数据库密码
port 数据库连接端口
db 数据库库名称
charset 数据库连接客户端编码
memcached 配置[可选]
urls memcache连接配置
hostname memcached缓存分配命名。
本例演示的是 firefly 完整通讯,客户端→net(客户端连接)服务器→gate(场景跳转,
消息分发)服务器→game(游戏场景,逻辑)服务器。客户端将用户输入的数字发送到服
务器,服务器随机一个数进行对比,一样则返回 True,不一样则返回 False 和服务器随机的
数值。
1.创建工程
命令行下输入 firefly-admin.py createproject test_netconnect-distributed(linux 在终端输入,这里测试在win平台),
{"master":{"rootport":9999,"webport":9998},"servers":{"net":{"netport":11000,"name":"net","app":"app.net","remoteport":[{"rootport":10001,"rootname":"gate"}]},"gate":{"rootport":10001,"name":"gate","app":"app.gate"},"game":{"remoteport":[{"rootport":10001,"rootname":"gate"}],"name":"game","app":"app.game"}},"db":{"host":"localhost","user":"root","passwd":"111","port":3306,"db":"test","charset":"utf8"}}
C:\Users\Administrator>d:D:\>cd D:\test_netconnect-distributedD:\test_netconnect-distributed>python D:\test_netconnect-distributed\startmaster.py2015-06-06 14:59:56+0800 [-] Log opened.2015-06-06 14:59:56+0800 [-] DelaySite starting on 99982015-06-06 14:59:56+0800 [-] Starting factory <firefly.web.delayrequest.DelaySite instance at 0x0000000002E93F48>2015-06-06 14:59:56+0800 [-] BilateralFactory starting on 99992015-06-06 14:59:56+0800 [-] Starting factory <firefly.distributed.root.BilateralFactory instance at 0x0000000002EA04C8>2015-06-06 14:59:58+0800 [-] Log opened.2015-06-06 14:59:58+0800 [-] Log opened.2015-06-06 14:59:58+0800 [-] Log opened.2015-06-06 14:59:58+0800 [-] game start...22015-06-06 14:59:58+0800 [-] net start...2015-06-06 14:59:58+0800 [-] gate start...015-06-06 14:59:58+0800 [-] game pid: 886422015-06-06 14:59:58+0800 [-] net pid: 6460015-06-06 14:59:58+0800 [-] gate pid: 91402015-06-06 14:59:58+0800 [BilateralBroker,0,127.0.0.1] node [net] takeProxy ready2015-06-06 14:59:58+0800 [BilateralBroker,1,127.0.0.1] node [game] takeProxy ready2015-06-06 14:59:58+0800 [BilateralBroker,2,127.0.0.1] node [gate] takeProxy ready22015-06-06 14:59:58+0800 [Broker,client] call method remote_connect on service[single]015-06-06 14:59:58+0800 [Broker,client] call method remote_connect on service[single]22015-06-06 14:59:58+0800 [Broker,client] Starting factory <twisted.spread.pb.PBClientFactory instance at 0x0000000003019B88>015-06-06 14:59:58+0800 [Broker,client] Starting factory <twisted.spread.pb.PBClientFactory instance at 0x0000000002F5F088>2015-06-06 14:59:58+0800 [BilateralBroker,0,127.0.0.1] node [game] takeProxy ready2015-06-06 14:59:58+0800 [BilateralBroker,1,127.0.0.1] node [net] takeProxy ready2)运行客户端,输入 1~10 中任意一个数字,输入 exit 退出客户端
在客户端控制台输入
看看代码
net.py
#coding:utf8from firefly.server.globalobject import netserviceHandle,GlobalObject@netserviceHandledef random_1001(_conn,number): #客户端传来的number是str型,转换成int型 number = int(number) #调用root服务器(gate)的random_1002方法,参数为number result = GlobalObject().remote['gate'].callRemote("random_1002",number) #返回结果 return resultgate.py
#coding:utf8from firefly.server.globalobject import rootserviceHandle,GlobalObject@rootserviceHandledef random_1002(number): #调用node服务器(game)的random_1003方法,参数为number result = GlobalObject().root.callChildByName("game","random_1003",number) #返回结果 return resultgame.py
#coding:utf8from firefly.server.globalobject import remoteserviceHandleimport random@remoteserviceHandle("gate")def random_1003(number): randomNu = random.randint(1,10)#在1~10内随机一个数 if number == randomNu:#对比客户端传来的数据 return "True" else: return "False,result is %s" % randomNu
客户端
#coding:utf8from socket import AF_INET,SOCK_STREAM,socketimport struct,timedef sendData(sendstr,commandId): '''定义协议头 ''' HEAD_0 = chr(0) HEAD_1 = chr(0) HEAD_2 = chr(0) HEAD_3 = chr(0) ProtoVersion = chr(0) ServerVersion = 0 sendstr = sendstr data = struct.pack('!sssss3I',HEAD_0,HEAD_1,HEAD_2,\ HEAD_3,ProtoVersion,ServerVersion,\ len(sendstr)+4,commandId) senddata = data+sendstr return senddatadef resolveRecvdata(data): '''解析数据,根据定义的协议头解析服务器返回的数据 ''' head = struct.unpack('!sssss3I',data[:17]) lenght = head[6] message = data[17:17+lenght] return messageif __name__ == "__main__": HOST='localhost' PORT=11000 ADDR=(HOST , PORT) client = socket(AF_INET,SOCK_STREAM) client.connect(ADDR)#建立socket连接 while 1: number = raw_input("Please enter your number(1~10):") if number == "exit": break client.sendall(sendData(number,1001))#向服务器发送消息 message = client.recv(1024)#接收服务器返回的消息 message = resolveRecvdata(message)#解析消息 print message client.close()
- 关于ubuntu12.04下firefliy的架设
- Ubuntu12.04 下架设tftp服务器
- ubuntu12.04 架设tftp服务器
- ubuntu12.04 简易架设nfs服务器
- ubuntu12架设web服务器
- 关于在ubuntu12.04图形界面下不能从root用户直接登录的问题
- 关于Ubuntu12.04下gedit不能使用中文输入法的问题
- 关于ubuntu12.04下google-chrome无法启动问题的解决
- LINUX下代理服务器的架设
- Linux下FTP的架设
- Ubuntu下ftp的架设
- linux下服务器的架设
- ubuntu12.04下flash player的安装
- Ubuntu12.04下JDK、Eclipse的安装
- ubuntu12.04下 cudatoolkit的安装总结
- Ubuntu12.04下的 Android 源码下载
- Ubuntu12.04下的Android 源码编译
- Ubuntu12.04下的 Android 源码下载
- path_sum
- Android25图灵聊天项目------适配器选择界面展示数据
- 【Thinking in Java笔记】Java中判断使用继承还是组合
- OC坑集: block作为函数参数
- Codeforces Round #306 (Div. 2)_B
- 关于ubuntu12.04下firefliy的架设
- Hive介绍
- 说说这些年做的云计算和大数据项目
- 触摸 touches targetTouches changedTouches 区别
- ArcGIS For JavaScript API Dynamically create layer list(动态创建图层列表)
- 6月2日新公司到岗
- [java]——深入理线性表与线性链表
- 用python实现排列
- UNIX环境编程初步认识——编程环境搭建