网络库-POCO介绍

1.简介

POCO C++ Libraries 提供一套 C++ 的类库用以开发基于网络的可移植的应用程序,它提供了许多模块,包括网络编程、文件系统访问、线程和并发、数据库访问、XML处理、配置管理、日志记录等功能。Poco库的设计目标是易于使用、高度可定制和可扩展。

包含4个核心库及一些附加库. 这4个核心模块是: Foundation, XML, Util 和 Net:

  • Foundation:提供基本功能,如线程、时间、内存管理、流、字符串等。
  • XML:提供XML解析和生成功能。
  • Util:提供配置文件处理、命令行参数解析等实用功能。
  • Net:提供网络编程功能,包括TCP/IP协议、HTTP服务器和客户端、SMTP客户端等。

还有一些其他模块:

  • JSON:提供JSON解析和生成功能。
  • Database:提供数据库访问抽象层,支持多种数据库。
  • Crypto:提供加密和哈希算法。
  • NetSSL:提供SSL/TLS加密的网络通信功能。
  • Data:提供访问不同SQL数据库的一致性接口。
  • Zip:提供ZIP文件处理功能。

2.环境搭建

下载地址:https://github.com/pocoproject/poco
注意:这里下载的编译器支持C++11的版本,根据自己的编译器来下载版本。
在这里插入图片描述

下载完成,进行解压,然后使用cmake编译。
configure->Generate->Open Project
在这里插入图片描述
生成库如下图所示:
在这里插入图片描述

拷贝头文件和lib、dll目录到demo程序,如下图拷贝Zip模块的头文件,其他模块同样操作。
在这里插入图片描述

拷贝完成后如下图所示。
在这里插入图片描述

配置visual studio环境,请看本专栏前面章节,主要配置include和lib目录,不再一一赘述。

3.代码示例

json解析示例。

#include "Poco/JSON/Parser.h"
#include "Poco/JSON/ParseHandler.h"
#include "Poco/JSON/JSONException.h"
#include "Poco/Environment.h"
#include "Poco/Path.h"
#include "Poco/File.h"
#include "Poco/FileStream.h"
#include "Poco/StreamCopier.h"
#include "Poco/Stopwatch.h"
#include <iostream>
#include <iomanip>int main(int argc, char** argv)
{/* 解析json & 从文件中解析json */std::string jsonString = R"({"name": "John", "age": 30, "city": "New York"})";// 创建 JSON 解析器Poco::JSON::Parser parser;Poco::Dynamic::Var result;try {// 解析 JSON 字符串result = parser.parse(jsonString);}catch (const Poco::Exception& ex) {std::cerr << "JSON parsing error: " << ex.displayText() << std::endl;return 1;}// 将解析结果转换为 Poco::JSON::Object 类型Poco::JSON::Object::Ptr object = result.extract<Poco::JSON::Object::Ptr>();// 获取和操作 JSON 对象中的值std::string name = object->getValue<std::string>("name");int age = object->getValue<int>("age");std::string city = object->getValue<std::string>("city");// 打印结果std::cout << "Name: " << name << std::endl;std::cout << "Age: " << age << std::endl;std::cout << "City: " << city << std::endl;/* 生成json & 写入到json文件 */// 创建 JSON 对象Poco::JSON::Object jsonObject;// 添加键值对jsonObject.set("name", "John");jsonObject.set("age", 30);jsonObject.set("city", "New York");// 将 JSON 对象转换为字符串std::ostringstream oss;Poco::JSON::Stringifier::stringify(jsonObject, oss);std::string jsonString2 = oss.str();// 打印生成的 JSON 字符串std::cout << jsonString2 << std::endl;return 0;
}

httpserver示例。

#include "Poco/Net/HTTPServer.h"
#include "Poco/Net/HTTPRequestHandler.h"
#include "Poco/Net/HTTPRequestHandlerFactory.h"
#include "Poco/Net/HTTPServerParams.h"
#include "Poco/Net/HTTPServerRequest.h"
#include "Poco/Net/HTTPServerResponse.h"
#include "Poco/Net/HTTPServerParams.h"
#include "Poco/Net/ServerSocket.h"
#include "Poco/Timestamp.h"
#include "Poco/DateTimeFormatter.h"
#include "Poco/DateTimeFormat.h"
#include "Poco/Exception.h"
#include "Poco/ThreadPool.h"
#include "Poco/Util/ServerApplication.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include <iostream>using Poco::Net::ServerSocket;
using Poco::Net::HTTPRequestHandler;
using Poco::Net::HTTPRequestHandlerFactory;
using Poco::Net::HTTPServer;
using Poco::Net::HTTPServerRequest;
using Poco::Net::HTTPServerResponse;
using Poco::Net::HTTPServerParams;
using Poco::Timestamp;
using Poco::DateTimeFormatter;
using Poco::DateTimeFormat;
using Poco::ThreadPool;
using Poco::Util::ServerApplication;
using Poco::Util::Application;
using Poco::Util::Option;
using Poco::Util::OptionSet;
using Poco::Util::HelpFormatter;class TimeRequestHandler : public HTTPRequestHandler/// Return a HTML document with the current date and time.
{
public:TimeRequestHandler(const std::string& format) :_format(format){}void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response){Application& app = Application::instance();app.logger().information("Request from " + request.clientAddress().toString());Timestamp now;std::string dt(DateTimeFormatter::format(now, _format));response.setChunkedTransferEncoding(true);response.setContentType("text/html");std::ostream& ostr = response.send();ostr << "<html><head><title>HTTPTimeServer powered by POCO C++ Libraries</title>";ostr << "<meta http-equiv=\"refresh\" content=\"1\"></head>";ostr << "<body><p style=\"text-align: center; font-size: 48px;\">";ostr << dt;ostr << "</p></body></html>";}private:std::string _format;
};class TimeRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:TimeRequestHandlerFactory(const std::string& format) :_format(format){}HTTPRequestHandler* createRequestHandler(const HTTPServerRequest& request){if (request.getURI() == "/")return new TimeRequestHandler(_format);elsereturn 0;}private:std::string _format;
};class HTTPTimeServer : public Poco::Util::ServerApplication
{
public:HTTPTimeServer() : _helpRequested(false){}~HTTPTimeServer(){}protected:void initialize(Application& self){loadConfiguration(); // load default configuration files, if presentServerApplication::initialize(self);}void uninitialize(){ServerApplication::uninitialize();}void defineOptions(OptionSet& options){ServerApplication::defineOptions(options);options.addOption(Option("help", "h", "display help information on command line arguments").required(false).repeatable(false));}void handleOption(const std::string& name, const std::string& value){ServerApplication::handleOption(name, value);if (name == "help")_helpRequested = true;}void displayHelp(){HelpFormatter helpFormatter(options());helpFormatter.setCommand(commandName());helpFormatter.setUsage("OPTIONS");helpFormatter.setHeader("A web server that serves the current date and time.");helpFormatter.format(std::cout);}int main(const std::vector<std::string>& args){if (_helpRequested){displayHelp();}else{// get parameters from configuration fileunsigned short port = (unsigned short)config().getInt("HTTPTimeServer.port", 9980);std::string format(config().getString("HTTPTimeServer.format", DateTimeFormat::SORTABLE_FORMAT));int maxQueued = config().getInt("HTTPTimeServer.maxQueued", 100);int maxThreads = config().getInt("HTTPTimeServer.maxThreads", 16);ThreadPool::defaultPool().addCapacity(maxThreads);HTTPServerParams* pParams = new HTTPServerParams;pParams->setMaxQueued(maxQueued);pParams->setMaxThreads(maxThreads);// set-up a server socketServerSocket svs(port);// set-up a HTTPServer instanceHTTPServer srv(new TimeRequestHandlerFactory(format), svs, pParams);// start the HTTPServersrv.start();// wait for CTRL-C or killwaitForTerminationRequest();// Stop the HTTPServersrv.stop();}return Application::EXIT_OK;}private:bool _helpRequested;
};int main(int argc, char** argv)
{HTTPTimeServer app;return app.run(argc, argv);
}

TCPserver 示例。

#include "Poco/Net/TCPServer.h"
#include "Poco/Net/TCPServerConnection.h"
#include "Poco/Net/TCPServerConnectionFactory.h"
#include "Poco/Net/StreamSocket.h"
#include "Poco/NumberParser.h"
#include "Poco/Logger.h"
#include "Poco/Process.h"
#include "Poco/NamedEvent.h"
#include <iostream>using Poco::Net::TCPServer;
using Poco::Net::TCPServerConnectionFilter;
using Poco::Net::TCPServerConnection;
using Poco::Net::TCPServerConnectionFactory;
using Poco::Net::TCPServerConnectionFactoryImpl;
using Poco::Net::StreamSocket;
using Poco::UInt16;
using Poco::NumberParser;
using Poco::Logger;
using Poco::Event;
using Poco::NamedEvent;
using Poco::Process;
using Poco::ProcessImpl;
using Poco::Exception;namespace
{class ClientConnection: public TCPServerConnection{public:ClientConnection(const StreamSocket& s): TCPServerConnection(s){}void run(){StreamSocket& ss = socket();try{char buffer[256];int n = ss.receiveBytes(buffer, sizeof(buffer));while (n > 0){std::cout << "Received " << n << " bytes:" << std::endl;std::string msg;Logger::formatDump(msg, buffer, n);std::cout << msg << std::endl;n = ss.receiveBytes(buffer, sizeof(buffer));}}catch (Exception& exc){std::cerr << "ClientConnection: " << exc.displayText() << std::endl;}}};typedef TCPServerConnectionFactoryImpl<ClientConnection> TCPFactory;
#if defined(POCO_OS_FAMILY_WINDOWS)NamedEvent terminator(ProcessImpl::terminationEventName(Process::id()));
#elseEvent terminator;
#endif
}int main(int argc, char** argv)
{try{Poco::UInt16 port = NumberParser::parse((argc > 1) ? argv[1] : "2001");TCPServer srv(new TCPFactory(), port);srv.start();std::cout << "TCP server listening on port " << port << '.'<< std::endl << "Press Ctrl-C to quit." << std::endl;terminator.wait();}catch (Exception& exc){std::cerr << exc.displayText() << std::endl;return 1;}return 0;
}

4.更多推荐

libVLC 专栏介绍-CSDN博客

Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍_qt opengl视频播放器-CSDN博客

QCharts -1.概述-CSDN博客

网络库-libevent介绍

网络库-libcurl介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于MSWA相继加权平均的交通流量分配算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于MSWA相继加权平均的交通流量分配算法matlab仿真.如图所示交通网络中&#xff0c;包含6个节点、11各路段、9个OD对。经枚举可得每个OD对间存在3条无折返有效路…

elasticsearch使用Ngram实现任意位数手机号搜索

文章目录 Ngram自定义分词案例实战问题拆解 Ngram分词器定义Ngram分词定义Ngram分词示例Ngram分词应用场景 Ngram分词实战 Ngram自定义分词案例 当对keyword类型的字段进行高亮查询时&#xff0c;若值为123asd456&#xff0c;查询sd4&#xff0c;则高亮结果是&#xff1c;em&a…

【AI】DeepStream(03):deepstream_test1_app

1、简介 deepstream-test1:演示各种 DeepStream 插件构建 GStreamer 管道。从文件中获取视频、解码、批处理,然后进行对象检测,最后在屏幕上渲染框。 源码路径:/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1 先看下效果 2、编译 1)…

重写muduo网络库之调用流程的梳理

目录 1、流程叙述 2、我们看看TcpServer的构造都做了什么&#xff1f; 3、start() 3.1 开启loop 3.2 连接的建立 3.3 数据的收发 4、连接的关闭 muduo网络库各组件梳理见此博客 重写muduo库之组件梳理 1、流程叙述 首先&#xff0c;我们是怎么使用的&#xff1f; 1.定…

【iOS】工厂模式

文章目录 前言设计模式的三大原则简单工厂模式工厂方法模式抽象工厂模式关于三兄弟的升级与降级注意 前言 上文讲完了iOS的架构模式&#xff0c;接下来聊一聊设计模式&#xff0c;设计模式有许多&#xff0c;主要介绍一下工厂模式 设计模式的三大原则 S 单一职责原则 告诉我…

PBR系列-光之简史

作者&#xff1a;游梦 ​ 欢迎进入官网体验使用&#xff1a;Mapmost——让人与机器联合创作成为新常态 ​说到PBR理论分为三大理论&#xff1a;物理光源、物理材质与物理相机&#xff0c;三者都与光有着千丝万缕的关系&#xff0c;原打算这期讲解物理材质&#xff0c;在梳理知…

OpenHarmony 3.1 Release实战开发 + Linux 原厂内核Launcher起不来问题分析报告

1、关键字 Launcher 无法启动&#xff1b;原厂内核&#xff1b;Access Token ID&#xff1b; 2、问题描述 芯片&#xff1a;rk3566&#xff1b;rk3399 内核版本&#xff1a;Linux 4.19&#xff0c;是 RK 芯片原厂发布的 rk356x 4.19 稳定版内核 OH 版本&#xff1a;OpenHa…

elementui,iview等 表格单元格合并之固定列

要的效果如下 需要合并 show weak 及 Siginin这三列 上代码 <template><Table:columns"columns":span-method"handleSpan":data"data"bordersize"small"ref"table"></Table> </template> <sc…

R实验 基础(一)

实验目的&#xff1a; 了解实验报告书的书写要求&#xff1b;掌握R、RStudio的下载与安装&#xff1b;熟悉R的界面及基本操作&#xff1b;进一步熟悉R和RStudio的界面及基本操作&#xff1b;初步了解R的绘图和程序包的下载、安装和加载使用。 实验内容&#xff1a; 了解实验报…

Python sort() 和 sorted() 的区别应用实例详解

大家好&#xff0c;今天针对 Python 中 sort() 和 sorted() 之间的区别&#xff0c;来一个实例详细解读。sort — 顾名思义就是排序的意思&#xff0c;它可以接收的对象为可迭代的数据类型。今天以列表为例子演示两者的不同点、相同点&#xff0c;以及其中一些常用的高级参数使…

【知识碎片】2024_05_14

本篇记录了两道关于位运算的选择题&#xff0c;和一道有点思维的代码题。 C语言碎片知识 求函数返回值&#xff0c;传入 -1 &#xff0c;则在64位机器上函数返回&#xff08; &#xff09; int func(int x) {int count 0;while (x){count;x x&(x - 1);//与运算} return c…

24/05/14总结

签到2&#xff1a; 签到界面上有时间显示&#xff0c;签到码输入框&#xff0c;开始签到&#xff0c;当倒计时结束&#xff0c;老师端和学生端都会显示签到结果&#xff0c;所以签到结果需要建表&#xff1a;&#xff08;签到了的学生和未签到的学生&#xff0c; 这次签到的时间…

详述进程的地址空间

进程的地址空间 合法的地址 (可读或可写) 代码 (main, %rip 会从此处取出待执行的指令)&#xff0c;只读数据 (static int x)&#xff0c;读写堆栈 (int y)&#xff0c;读写运行时分配的内存 (???)&#xff0c;读写动态链接库 (???) 非法的地址 NULL&#xff0c;导致 se…

【微命令】git config如何配置全局的用户和邮箱?(--global user.name、user.email;git config --help)

虽然经常用&#xff0c;也经常忘记&#xff0c;特此记录。 命令 git config --global user.name "myname" git config --global user.email test163.com另外一种方式 help git config --help |grep email | grep name直接help查看

Git系列:git log 掌握版本控制的精髓

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【leetcode面试经典150题】-27. 移除元素

88.合并两个有序数组 1 题目介绍1 个人解题思路1.1 解题代码1.2 思路解析 2、分析官方题解2.1 单侧双指针2.2 双侧双指针 1 题目介绍 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外…

Echarts结课之小杨总结版

Echarts结课之小杨总结版 前言基础回顾框架sale框架代码&#xff1a; user框架基础代码&#xff1a; inventory框架基础代码&#xff1a; total框架基础代码&#xff1a; 基础设置1.标题(Title)2.图例(Legend)实现 3.工具提示(Tooltip)实现 4.X轴(X Axis) 和 Y轴(Y Axis)5.数据…

「Qt Widget中文示例指南」如何实现一个快捷编辑器(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 快捷编辑器示例展示…

Leetcode 第 129 场双周赛题解

Leetcode 第 129 场双周赛题解 Leetcode 第 129 场双周赛题解题目1&#xff1a;3127. 构造相同颜色的正方形思路代码复杂度分析 题目2&#xff1a;3128. 直角三角形思路代码复杂度分析 题目3&#xff1a;3129. 找出所有稳定的二进制数组 I思路代码复杂度分析 题目4&#xff1a;…

电子邮箱是什么?怎么申请一个电子邮箱?

电子邮箱是我们沟通的工具&#xff0c;细分为免费版电子邮箱和付费版电子邮箱。怎么申请一个属于自己的电子邮箱&#xff1f;今天小编就分享一下电子邮箱注册教程&#xff0c;手把手教您注册一个电子邮箱。 一、电子邮箱的定义 电子邮箱&#xff0c;简称邮箱&#xff0c;是一…