ascs 簡明開發教程(一):初見

QQ交流羣:198941541

ascs (https://github.com/youngwolf-project/ascs.git) 前面的as跟asio前面的as意義完全一樣,這也從側面說明了ascs與asio的關係,後面的cs是client/server結構的意思。

ascs是基於asio的cs框架,並不是簡單的對asio的封裝(事實上asio已經有的東西,我沒有做過任何封裝),因爲asio已經封裝的夠好了,而且它已經在被納入c++標準的過程中。

asio只能算是一套類庫,跟STL平級,屬於靜態的,基本上一切都必須由使用者來觸發(除了回調),而ascs則不同,它側重點在於快速的幫你構建一套cs系統,屬於框架範疇,也就是說,你只需要很少的幾個調用,比如說start(),ascs就可以自己工作,基本上所有的都是自動的(除非數據發送,顯然要你來觸發)。

ascs支持TCP/UDP和SSL,對於TCP,它也是基於消息的,這是因爲ascs引入了打包解包器的概念,消息在發送之前會經過打包,收到數據之後會經過解包才最終到達你的回調函數裏面,當然顯然的,你需要提供打包解包器(ascs默認提供了4種不同協議的打包解包器——lenght+body,prefix[suffix], fixed length 和 無協議)。注意先提個醒,寫打包解包器,既要考慮效率,又要考慮各種情況,比如出錯,粘包,分包等,是一件很容易出錯的事情。

ascs支持對象池,所以對象可被重要。

ascs支持定時器,底層也是由asio實現的。

ascs提供比較完善的內部狀態監視,你可以用來查找性能瓶頸。

ascs的log系統比較欠缺,但可以用你自己的log系統,只需要提供幾個函數(約定簽名的)接口即可。

ascs與st_asio_wrapper的關係:首先它們的功能是完全一樣的,類的名字也完全一樣,只是最頂層的命令空間一個是ascs::一個是st_asio_wrapper::,st_asio_wrapper可以完完全全參照ascs的文檔來使用。它們最大的區別在於,ascs依賴c++0x和standalone asio (https://github.com/chriskohlhoff/asio.git),而st_asio_wrapper只依賴於boost(最低1.49)而不依賴c++0x,但至少得c++98,另外ascs無論是編譯還是運行速度都快於st_asio_wrapper,特別是編譯速度,快得更多。

先看一個最簡單的cs程序(服務器和客戶端在同一個進程裏面,相信分開也沒什麼難度):

#include <iostream>

#include <ascs/ext/tcp.h>
using namespace ascs;
using namespace ascs::tcp;
using namespace ascs::ext;
using namespace ascs::ext::tcp;

#define QUIT_COMMAND	"quit"

int main()
{
	service_pump sp;
	server s(sp);
	single_client c(sp);

	sp.start_service();
	while (sp.is_running())
	{
		std::string str;
		std::getline(std::cin, str);
		if (str.empty())
			;
		else if (QUIT_COMMAND == str)
			sp.stop_service();
		else
		{
			c.send_msg(str + " (from client)");
			s.broadcast_msg(str + " (from server)");
		}
	}
}

大家可以看到,你真正也就觸發了start_service和send_msg,broadcast_msg而已,夠簡單吧?

注:ascs/ext 目錄並不嚴格屬於ascs,但建議大家包涵它(tcp.h, udp.h, ssl.h),這樣你可以少寫很多包涵語句,還能得到許多實用的便利性定義,比如上面的server和single_client等,實際上server是:

typedef ascs::tcp::server_socket_base<ASCS_DEFAULT_PACKER, ASCS_DEFAULT_UNPACKER> server_socket;
typedef ascs::tcp::server_base<server_socket> server;

下一篇:ascs 簡明開發教程(2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章