POCO TCPServer 採用「連接隊列 + 線程池」模型:
TCPServerConnection 並調用 run()
class PoechantTCPServer : public ServerApplication {
protected:
void initialize(Application& self) override {
ServerApplication::loadConfiguration();
ServerApplication::initialize(self);
}
void uninitialize() override { ServerApplication::uninitialize(); }
int main(const vector<string>& args) override {
unsigned short port = config().getInt("PoechantTCPServer.port", 12346);
string format = config().getString("PoechantTCPServer.format", DateTimeFormat::ISO8601_FORMAT);
ServerSocket serverSocket(port);
TCPServer server(new PoechantTCPConnectionFactory(format), serverSocket);
server.start();
waitForTerminationRequest();
server.stop();
return Application::EXIT_OK;
}
};
class PoechantTCPConnection : public TCPServerConnection {
public:
PoechantTCPConnection(const StreamSocket& s, const string& fmt)
: TCPServerConnection(s), _format(fmt) {}
void run() override {
Application& app = Application::instance();
app.logger().information("Request from " + socket().peerAddress().toString());
try {
Timestamp now;
string dt(DateTimeFormatter::format(now, _format));
dt.append("\r\n");
socket().sendBytes(dt.data(), (int)dt.length());
} catch (Poco::Exception& e) {
app.logger().log(e);
}
}
private:
string _format;
};
class PoechantTCPConnectionFactory : public TCPServerConnectionFactory {
public:
PoechantTCPConnectionFactory(const string& fmt) : _format(fmt) {}
TCPServerConnection* createConnection(const StreamSocket& socket) override {
return new PoechantTCPConnection(socket, _format);
}
private:
string _format;
};
int main(int argc, char** argv) {
return PoechantTCPServer().run(argc, argv);
}
配置文件 (如 config.properties):
PoechantTCPServer.port = 12346
PoechantTCPServer.format = %Y-%m-%d %H:%M:%S
#include <iostream>
#include "Poco/Net/StreamSocket.h"
#include "Poco/Net/SocketAddress.h"
using Poco::Net::SocketAddress;
using Poco::Net::StreamSocket;
int main() {
SocketAddress addr("127.0.0.1", 12346);
StreamSocket socket(addr);
char buffer[1024];
while (true) {
if (socket.available()) {
int len = socket.receiveBytes(buffer, sizeof(buffer));
buffer[len] = '\0';
std::cout << buffer << std::endl;
}
}
return 0;
}
| 特性 | TCPServer | Reactor |
|---|---|---|
| 並發模型 | 多線程 (線程池) | 單/少量線程 (事件循環) |
| 適用場景 | 短連接、計算密集型邏輯 | 長連接、高併發、I/O 密集型 |
| 編程複雜度 | 低 (同步阻塞風格) | 中 (異步回調風格) |
| 擴展性 | 受限於線程數 | 極高 (C10K+) |
根據業務特性選型:Web 服務、API 网關宜 Reactor;內部 RPC、任務處理宜 TCPServer。