最簡單的dome程序只需3行代碼
1 int main() { 2 3 //設置端口號 4 5 InetAddress listenAddr(USER_PORT); 6 7 //將端口號綁定到Server 8 9 NodeServer nodeServer(listenAddr); 10 11 //設置連接線程數,並開啟服務 12 13 nodeServer.start(USER_SERVER_THREAD_NUM); 14 15 return 0; 16 17 }
我們設置連接線程數為4,並運行程序
此時可見Khala一共創建了5個線程,一個為主線程負責,另外4個為線程池線程。在線程模型中,主線程只負責accept監聽服務,每當建立新的連接,就會按照輪詢算法將新連接分配到線程池中的具體某個線程中進行處理。
如果我們設置連接線程數為0,則系統將不會創建線程池。監聽服務和所有連接處理都將在主線程中進行處理。
Khala提供了連接超時檢測,能夠檢測長期空閒的客戶連接。如果一個未執行登錄操作的客戶連接長期沒有發送有效消息,將被服務端強制斷開連接。此處將其設置為60s。
1 int main() { 2 3 //設置端口號 4 5 InetAddress listenAddr(USER_PORT); 6 7 //將端口號綁定到Server 8 9 NodeServer nodeServer(listenAddr); 10 11 //設置最大空閒時間為60s 12 13 nodeServer.setIdleTime(60); 14 15 //設置連接線程數,並開啟服務 16 17 nodeServer.start(USER_SERVER_THREAD_NUM); 18 19 return 0; 20 21 }
系統日志顯示,服務端在7分22秒時新建立一個連接。在一分鐘時間裡,服務端並沒有再接收到該連接的有效消息,於是該連接在8分30秒時被系統判定超時,並強制斷開連接。
Khala目前默認提供了login(登錄)、logout(登出)、devTpye(設備類型)、isLogin(登錄狀態)、nodeId(設備ID號)等事件機制。我們通過一個簡單的客戶程序(./example/testClient/HelloKhalaClient.py)對該服務端進行測試。
其中[send msg]是客戶端發送給服務端的消息流,采用json消息格式(實際發送的消息流並不完全為顯示的json內容,因為tcp傳輸是以流的方式進行,並沒有明顯邊界,因此在每個消息前都加上了消息包頭用於解決粘包問題)
在默認的設備繼承體系中,Khala實現了臨時設備和登錄管理設備兩種類型。其中在臨時設備類型中注冊的事件消息無需登錄操作,任何連接都可以獲得該類型的消息響應。而登錄管理設備類型中注冊的事件消息必須執行登錄操作後,才能獲取該類型的消息響應,否則返回未識別的消息類型。
在Khala默認實現中,login、devType、isLogin屬於在臨時設備類型中注冊的實現消息,而logout、nodeId為在登錄管理設備中注冊的實現消息,因此必須先執行登錄操作才能獲取響應。
此處我們在未登錄的情況下請求logout和nodeId,服務端響應錯誤的請求類型。如果我們執行login後再執行logout或nodeId請求,就能得到正確響應。
此處演示的默認實現的消息事件中,除了login、logout為系統保留消息事件,其它消息事件都可以由用戶進行重寫。用戶也可以注冊定制符合自己設備類型和業務邏輯需求的消息事件,這將在接下來的文檔中進行介紹。
雖然login和logout不能由用戶完全重寫消息事件,但是系統為這兩個消息事件提供了較多和登錄生命周期相關的接口,用戶可以選擇對這些接口進行重寫以達到自己的實際需求。