關於ubuntu12.04下firefliy的架設

這篇文章本來是我發在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-dev
apt-get install libmysqlclient-dev
sudo 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.gz
cd 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 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.             //說明監控成功,之後輸入stats
stats
STAT pid 534
STAT uptime 96
STAT time 1392961141
STAT version 1.4.13
STAT libevent 2.0.21-stable
STAT pointer_size 32
STAT rusage_user 0.008000
STAT rusage_system 0.000000
STAT curr_connections 5
STAT total_connections 6
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 7
STAT bytes_written 0
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 262144
STAT hash_is_expanding 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT evictions 0
STAT reclaimed 0
END
^]quit                    //退出命令,上面就是memcached運行的狀態
---------------------------------------------------
memcached 服務器的功能呢,是生成一個虛擬的數據庫,因爲這個臨時數據庫存在在內存中,所以讀寫速度大大加快,隔一段時間memcached會把內存裏的臨時數據更新進數據庫。

到現在我們工作完成了大半了

下面我們安裝第三方庫

Sudo easy_install twisted
Sudo easy_install python-memcached
Sudo easy_install DBUtils
Sudo easy_install zope.interface
Sudo easy_install affinity	
Sudo easy_install MySQL-python

Firefly 安裝

http://www.9miao.com/thread-44805-1-1.html下載

 

2.解壓之後

Cd 安裝目錄

python setup.py build
python setup.py install
測試是否安裝成功
swordfishx@swordfishx-virtual-machine:~$ firefly-admin.py createproject FireflyHelloWorld
create dir FireflyHelloWorld 
create success                       //說明可以創建
swordfishx@swordfishx-virtual-machine:~$ cd FireflyHelloWorld
swordfishx@swordfishx-virtual-machine:~/FireflyHelloWorld$ ls
app  appmain.py  config.json  startmaster.py  tool
swordfishx@swordfishx-virtual-machine:~/FireflyHelloWorld$ python startmaster.py
2014-02-21 14:16:13+0800 [-] Log opened.
2014-02-21 14:16:13+0800 [-] DelaySite starting on 9998
2014-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 9999
2014-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: 2186
2014-02-21 14:16:14+0800 [-] net pid: 2187
2014-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 調用 

    remoteport[可選]指定要連接到哪些服務進程的信息的列表,其中包括
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-distributed

D:\test_netconnect-distributed>python D:\test_netconnect-distributed\startmaster
.py
2015-06-06 14:59:56+0800 [-] Log opened.
2015-06-06 14:59:56+0800 [-] DelaySite starting on 9998
2015-06-06 14:59:56+0800 [-] Starting factory <firefly.web.delayrequest.DelaySit
e instance at 0x0000000002E93F48>
2015-06-06 14:59:56+0800 [-] BilateralFactory starting on 9999
2015-06-06 14:59:56+0800 [-] Starting factory <firefly.distributed.root.Bilatera
lFactory 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: 8864
22015-06-06 14:59:58+0800 [-] net pid: 6460
015-06-06 14:59:58+0800 [-] gate pid: 9140
2015-06-06 14:59:58+0800 [BilateralBroker,0,127.0.0.1] node [net] takeProxy read
y
2015-06-06 14:59:58+0800 [BilateralBroker,1,127.0.0.1] node [game] takeProxy rea
dy
2015-06-06 14:59:58+0800 [BilateralBroker,2,127.0.0.1] node [gate] takeProxy rea
dy
22015-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[si
ngle]
22015-06-06 14:59:58+0800 [Broker,client] Starting factory <twisted.spread.pb.PB
ClientFactory instance at 0x0000000003019B88>
015-06-06 14:59:58+0800 [Broker,client] Starting factory <twisted.spread.pb.PBCl
ientFactory instance at 0x0000000002F5F088>
2015-06-06 14:59:58+0800 [BilateralBroker,0,127.0.0.1] node [game] takeProxy rea
dy
2015-06-06 14:59:58+0800 [BilateralBroker,1,127.0.0.1] node [net] takeProxy read
y
2)運行客戶端,輸入 1~10 中任意一個數字,輸入 exit 退出客戶端 

在客戶端控制檯輸入



看看代碼

net.py

#coding:utf8

from firefly.server.globalobject import netserviceHandle,GlobalObject

@netserviceHandle
def random_1001(_conn,number):
    #客戶端傳來的number是str型,轉換成int型
    number = int(number)
    #調用root服務器(gate)的random_1002方法,參數爲number
    result = GlobalObject().remote['gate'].callRemote("random_1002",number)
    #返回結果
    return result
gate.py
#coding:utf8

from firefly.server.globalobject import rootserviceHandle,GlobalObject

@rootserviceHandle
def random_1002(number):
    #調用node服務器(game)的random_1003方法,參數爲number
    result = GlobalObject().root.callChildByName("game","random_1003",number)
    #返回結果
    return result
game.py
#coding:utf8

from firefly.server.globalobject import remoteserviceHandle
import 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:utf8

from socket import AF_INET,SOCK_STREAM,socket
import struct,time

def 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 senddata

def resolveRecvdata(data):
    '''解析數據,根據定義的協議頭解析服務器返回的數據
    '''
    head = struct.unpack('!sssss3I',data[:17])
    lenght = head[6]
    message = data[17:17+lenght]
    return message

if __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()





發佈了66 篇原創文章 · 獲贊 57 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章