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)