當你走過一個坐在本身店門前的雜貨商面前。走過一個吸着菸斗的守門人面前,走過一個馬車伕面前時,請你給我描繪一下這個雜貨商、守門人和馬車伕,他們的姿態,他們的外貌,要用畫家那樣的細節描繪出他們的精神本質,使我不至於把他們同任何別的雜貨商人、任何別的守門人、任何別的馬車伕混同起來,還請你只用一句話就讓我知道馬車伕有一匹馬同其餘的馬是不同的。 ——福樓拜指導莫泊桑
從今天開始,我給本身設定了幾個小目標,其中之一是:天天都寫上幾千字或者半個小時。今天是開始碼字的第一天,坐在電腦前想了好一會,從寫什麼開始?目的是什麼?寫什麼不重要,目的是培養一下碼字的習慣。個人本職是碼代碼的。就從我瞭解的東西開始寫吧。今天姑且爲你們介紹下:Skynet。設計模式
Skynet是一個輕量級的遊戲服務器框架。語言是C+LUA。挺乾淨的。做者是雲風。社區也一直在維護。他想作的核心的一件事情就是,提供一個消息轉發機制,用C+LUA實現一個actor模式的服務器。actor模式和消息轉發機制的關係是這樣的,actor模式是一種設計模式,在此以前實體是經過多線程的鎖等機制實現讀寫數據,使用actor以後,各個實體之間的溝通改成消息傳遞。實體自己管理本身的行爲和動做。不熟悉的可能不太理解。 下面介紹下Skynet的使用。 首先Git clone源碼以後,在Linux環境下編譯出Skynet。 其次,他的啓動方式,不是用lua編譯代碼跑起來,而是用編譯出的Skynet帶一個配置文件跑一個文件。這是一個新人以爲怪異的地方。 再說代碼的編寫。如上所述,這裏的實體就是一個一個的服務。服務之間經過Skynet框架的消息傳遞。因此咱們的核心任何有2個:
啓動服務。 require "skyenet" skynet.start(function() .... skynet.newservice("服務名") end ) 這樣算是啓動了一個服務。 newservice填的服務名,他是會在config中找到對應的服務的文件,繼續運行起來。
2.1 首先服務須要想Skynet框架註冊本服務。註冊須要給什麼呢?假設是你本身設計你會怎麼作?每一個服務須要有一個名字吧? 因此 1. 名字。做爲標識。 2. 地址(至關於郵件地址,別人給你發消息的接收地址) 3. 接收消息的語種/類型(想象一下,別人寄給你一封信,惋惜你都不知道這個是什麼語言寫的?中文英文你知道,你分得清楚,越南文和泰文嗎?咱們須要提早說清楚省得別人寫信的內容寫 4. 消息處理 錯。) 1. 解碼decode。別人的語言我們不必定會使。咱得翻譯一下。 2. 編碼encode。 3. 來源。source。 分析處理socket的agent中的服務 1. 名字 , local watchdog = skynet.newservice("服務名") 這個服務名就是標識的名字 2. 地址 , watchdog 就是地址一個int 爲何名字和地址會在外面呢。這個也能夠理解。名字和地址那是對外的。是別人用來區分和標識你的。你的名字和你家的地址固然是別人(你爸和村長)取的。 skynet.register ( name = "client" --類型名。 指示這個是客戶端消息 id = skynet.PTYPE_TEXT -- 指示skynet 數據的類型。 unpack = ... -- 解碼 pack = ... -- 編碼方式 dispath = function (type,func) ) ... 就是 dispath 分發函數,爲消息類型 type ,指定一個函數處理。 ,function ( session , source , cmd ,...) -- 內部轉發,session, 來源,指令 和 其餘參數 end 說到這裏。咱們得提到經過發消息給一個服務,調用一個服務的服務了。 skynet.call ( address, type, cmd,... ) 就是說,告訴address地址的服務,有一個type類型的消息,內部約定通常服務指定服務裏面哪一個函數(cmd),至於參數就在...裏面自動填充了 而後咱們看看服務內部收到了什麼,session , source , cmd ,... 這裏的session是指內部的一個session返回的時候調用者知道。 source是來源。 至於怎麼返回,skynet.ret(skynet.pack(...))
明天繼續分解這塊:D
才一千三百字。服務器