之前的網絡庫以id作為會話對象的標示,但很多應用服務器的邏輯比較復雜,每個會話對象需要攜帶(保存)很多狀態,那麼開發人員總是會構建一個對象管理器。
所以我在之前網路庫封裝成以C++對象為標示,作為網絡事件回調以及網絡接口的參數。
這裡展示的是一個pingpong協議測試程序(未分包,分包不影響此協議的效率測試)
工程(需要VS2013)下載地址:http://files.cnblogs.com/files/irons/PingPangDemo.zip
TcpService類就是設計的以id為對象標示的網絡接口層。
而WrapServer則是封裝TCPService的,以C++對象為標示的網絡接口, 其C++對象為TCPSession。
通常使用其智能指針。
為了博客園規矩(其實是湊數),只有貼代碼了(具體代碼設計,還請各位花點時間看源代碼了--我這裡就不多做解釋了哈,有問題還請指教)
Server:
#include <iostream> #include <mutex> #include "../Net/eventloop.h" #include "../Net/WrapTCPService.h" std::mutex g_mutex; int total_recv = 0; int total_client_num = 0; void onSessionClose(TCPSession::PTR session) { g_mutex.lock(); total_client_num--; g_mutex.unlock(); } int onSessionMsg(TCPSession::PTR session, const char* buffer, int len) { session->send(buffer, len); g_mutex.lock(); total_recv += len; g_mutex.unlock(); return len; } int main(int argc, char **argv) { int thread_num = atoi(argv[1]); int port_num = atoi(argv[2]); WrapServer::PTR server = std::make_shared<WrapServer>(); server->setDefaultEnterCallback([](TCPSession::PTR session){ session->setCloseCallback(onSessionClose); session->setDataCallback(onSessionMsg); g_mutex.lock(); total_client_num++; g_mutex.unlock(); }); server->startListen(port_num); server->startWorkThread(thread_num); EventLoop mainLoop; mainLoop.restoreThreadID(); while (true) { mainLoop.loop(1000); g_mutex.lock(); std::cout << "total recv : " << (total_recv / 1024) / 1024 << " M /s, of client num:" << total_client_num << std::endl; total_recv = 0; g_mutex.unlock(); } }
Client:
#include <iostream> #include <string> #include "../Net/socketlibfunction.h" #include "../Net/WrapTCPService.h" void onSessionClose(TCPSession::PTR session) { } int onSessionMsg(TCPSession::PTR session, const char* buffer, int len) { session->send(buffer, len); return len; } int main(int argc, char **argv) { int thread_num = atoi(argv[1]); int port_num = atoi(argv[2]); int num = atoi(argv[3]); int packet_len = atoi(argv[4]); std::string tmp(packet_len, 'a'); WrapServer::PTR server = std::make_shared<WrapServer>(); server->startWorkThread(thread_num); for (int i = 0; i < num; i++) { sock fd = ox_socket_connect("127.0.0.1", port_num); server->addSession(fd, [&](TCPSession::PTR session){ session->setCloseCallback(onSessionClose); session->setDataCallback(onSessionMsg); session->send(tmp.c_str(), tmp.size()); }); } std::cin.get(); }
tks。