手把手教你如何使用Poco TCPServer框架

2021-10-03 17:55:09 字數 3735 閱讀 4390

poco c++開發庫的特點是非常適合寫後台處理程式,側重於網際網路時代的網路應用程式,效率也很高。前台介面程式使用qt框架庫,非常好,兩個庫相輔相成,可解決專案上的大部分問題.

poco 庫提供tcpserver框架,用以搭建自定義的 tcp 伺服器。tcpserver維護乙個連線佇列、乙個連線線程池。連線線程用於處理連線,連線線程只要一空閒就不斷地從連線佇列中取連線並進行處理。一旦連線線程從連線佇列中取到乙個連線,就會建立乙個tcpserverconnection連線物件,並且呼叫該物件的start()方法,直到start()方法返回,這個連線物件就被刪除了。

連線線程的數量是動態的,其取決於連線佇列中排隊的連線數。當然,你使用的時候可以設定連線佇列的最大容量,以防止在高併發應用的伺服器上出現連線太多而使連線佇列溢位的悲劇發生。當連線佇列滿了,卻還有新的連線到來時,新來的連線就會被立即悄無聲息地關閉。

現在我們總結一下,就是要有乙個可執行的 tcp 服務應用程式(命名為poechanttcpserver),還有很多 tcp 連線(命名為poechanttcpconnection)。而這裡我們用到工廠模式(準確說是tcpserverconnectionfactory要我們用的),所以還有乙個poechanttcpconnectionfactory

// poechanttcpserver.h

#ifndef poechant_tcp_server

#define poechant_tcp_server

~poechanttcpserver() {}

protected:

void uninitialize();

int main(const std::vector& args)

};#endif

這樣在呼叫啟動poechanttcpserver時,會先呼叫initialize,然後呼叫main,在main結束後會呼叫uninitialize。其實現很簡單:

// poechanttcpserver.cpp

#include "poechanttcpserver.h"

void poechanttcpserver::uninitialize()

int poechanttcpserver::main(const std::vector& args)

連線類的定義很簡單,建構函式要傳入乙個 streamsocket 和其他你需要的引數。

// poechanttcpconnection.h

#ifndef poechant_tcp_connection_h

#define poechant_tcp_connection_h

#include "poco/net/tcpserverconnection.h"

#include "poco/net/streamsocket.h"

#include class poechanttcpconnection: public tcpserverconnection

;#endif

實現如下:

// poechanttcpconnection.cpp

#include "poechanttcpconnection.h"

#include "poco/timestamp.h"

#include "poco/exception.h"

#include "poco/datetimeformatter.h"

poechanttcpconnection(const streamsocket& s, const std::string& arg1, int arg2, double arg3):

tcpserverconnection(s), _arg1(arg1), _arg2(arg2), _arg3(arg3)

void run()

catch (poco::exception& e)

}

工廠模式不必多說,名字唬人,其實非常非常簡單(準確的說設計模式大部分名字都唬人,但大部分都很有用,設計模式本身並不牛b,能把設計模式抽象提煉出來成我們現在認為很簡單的這些模式的那幾個人很牛b)。具體如下:

// poechanttcpconnectionfactory.h

#ifndef poechant_tcp_connection_factory_h

#define poechant_tcp_connection_factory_h

#include "poco/net/tcpserverconnectionfactory.h"

#include "poco/net/tcpserverconnection.h"

#include "poco/net/streamsocket.h"

#include class poechanttcpconnectionfactory: public tcpserverconnectionfactory

tcpserverconnection* createconnection(const streamsocket& socket)

private:

std::string arg1;

int arg2;

double arg3;

};#endif

回頭來說poechanttcpserver::main(const std::vector& args),其過程就是建立乙個繫結了位址的serversocket,把它傳給tcpserver,當然別忘了把工程物件也給你的tcpserver傳乙個。最後就start()waitforterminationrequeststop()就行了。

int poechanttcpserver::main(const std::vector& args)

然後寫乙個程式入口:

#include "poechanttcpserver.h"

int main(int argc, char **ar**)

tcpserver 要用 tcp 的客戶端來測試。在 poco 中有豐富的 socket,其中 tcp 方式的 socket 有:

udp 方式的 socket 有:

乙個 tcp 方式 client 如下(這裡用了 while 迴圈,其實可以在收到資料後就關閉的)

#include #include "poco/net/streamsocket.h"

#include "poco/net/socketaddress.h"

#define buffer_size 1024

using poco::net::socketaddress;

using poco::net::streamsocket;

int main (int argc, const char * ar**)

}return 0;

}

手把手教你如何追女生

我是女生,看到有的男生想追自己喜歡的女孩子又不敢追,還想人家倒追她,我很反感。從乙個女生的角度,我比較了解女孩子的心理。女孩子大多不會主動出擊,去追求自己喜歡的男孩,除了確實太喜歡了或者是那種比較有個性的勇敢的女孩子。所以,如果你很喜歡乙個女孩子,並且認為她對你也有點意思,那就主動點,別跟她搞拉鋸戰...

教程 手把手教你使用Git

前言 公司從17年漸漸從svn 轉向git 版本控制系統,以下是平時使用過程中的總結。一,git 是什麼?git 是目前世界上最先進的的分布式版本控制系統。二,svn 和git 的最主要的區別 svn是集中式版本控制系統,版本庫是集中放在 伺服器的,而幹活的時候,用的都是自己的電腦,所以首先要從 伺...

手把手教你使用CSDN markdown編輯器

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...