网络库-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);
		else
			return 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 present
		ServerApplication::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 file
			unsigned 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 socket
			ServerSocket svs(port);
			// set-up a HTTPServer instance
			HTTPServer srv(new TimeRequestHandlerFactory(format), svs, pParams);
			// start the HTTPServer
			srv.start();
			// wait for CTRL-C or kill
			waitForTerminationRequest();
			// Stop the HTTPServer
			srv.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()));
#else
	Event 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介绍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jupyter notebook中调整图片大小

截屏 ctrl V 这个目前只能保证是截屏大小&#xff0c;改变不了&#xff0c;要么之久 把图形缩小后再截图 感觉很模糊 png文件导入 markdown 代码1 <img src"./1.png" width250 height200>markdown 代码2 <img src"./1.png" width938 height…

【Transformer-BEV编码(10)】CVPR2021 PYVA 第一个明确提到 cross-attention decoder可用于视图转BEV

论文信息 论文名&#xff1a;Projecting Your View Attentively: Monocular Road Scene Layout Estimation via Cross-view Transformation 中文&#xff1a;通过交叉视图变换&#xff08;crossview transform module&#xff09;估计单目道路场景布局 数据集&#xff1a;KITT…

【小积累】@Qualifier注解

今天在看rabbitMQ的时候需要绑定交换机和队列&#xff0c;交换机和队列都已经注入到spring容器中&#xff0c;写了一个配置类&#xff0c;使用了bean注解注入的。所以这时候绑定的时候需要使用容器中的交换机和队列&#xff0c;必须要使用Qualifier去确定是容器中的哪个bean对象…

【架构-17】通信系统架构设计理论

通信系统网络架构 1. 局域网网络架构 拓扑结构&#xff1a;星型、总线型、环型、树型。 网络架构&#xff1a;单核心架构&#xff08;结构简单&#xff0c;地理范围受限&#xff09;、双核心架构&#xff08;网络拓扑结构可靠&#xff0c;投资较单核高&#xff09;、环型架构…

《机器学习by周志华》学习笔记-决策树-01

本书中的「决策树」有时指学习方法,有时指学得的树。 1、基本流程 1.1、概念 基本流程,亦称「判定树」 决策树(decision tree),是一种常见的机器学习方法。以二分类任务为例,我们希望从给定训练数据集学得一个模型,用以对新样例进行分离。 以二分类任务为例,可看作对…

Vue3组件库开发项目实战——03封装Button组件/输出vitePress文档

Vue3组件库开发项目实战——01组件开发必备知识导学-CSDN博客 Vue3组件库开发项目实战——02项目搭建&#xff08;配置Eslint/Prettier/Sass/Tailwind CSS/VitePress/Vitest&#xff09;-CSDN博客 在前面两篇博客中&#xff0c;我分别介绍了组件库开发必学知识&#xff0c;以及…

什么是ThreadLocal

1. 什么是ThreadLocal ThreadLocal 为每一个线程提供独立的局部变量&#xff0c;每个线程都拥有该变量的一个独立副本。 每个Thread里面都有一个ThrealLocal.ThreadLocalMap结构&#xff0c;里面由Entry数组组成。key是ThrealLocal&#xff0c;value是我们存的Object&#xff…

定期更新与维护:技术与生活的同步律动

在这个数字化时代&#xff0c;科技的温暖之光照进了盲人朋友们的日常生活中&#xff0c;特别是那些辅助出行的应用程序&#xff0c;它们如同贴心的向导&#xff0c;引领着用户穿越城市的喧嚣与宁静。然而&#xff0c;要确保这些应用始终能够高效、安全地服务于盲人用户&#xf…

人工智能与机器学习的演进:重塑IT行业的未来

目录 前言一、人工智能与机器学习的最新发展1、算法和硬件的进步2、AI & ML的民主化 二、AI & ML在自动化中的应用1、工业与服务业自动化1.1 实践方式1.2 伪代码样例 2、软件开发与运维自动化2.1实践方式2.2伪代码样例 三、AI & ML在个性化服务中的应用1、推荐系统…

node和npm版本太高导致项目无法正常安装依赖以及正常运行的解决办法:如何使用nvm对node和npm版本进行切换和管理

1&#xff0c;点击下载 nvm 并且安装 进入nvm的github&#xff1a; GitHub - coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go. 这里下载发行版&#xff0c;Releases coreybutler/nvm-windows GitHub 找到 这个 nv…

React useEffect Hook: 理解和解决组件双重渲染问题

在React中&#xff0c;useEffect可能会在组件的每次渲染后运行&#xff0c;这取决于它的依赖项。如果你发现useEffect运行了两次&#xff0c;并且你正在使用React 18或更高版本的严格模式&#xff08;Strict Mode&#xff09;&#xff0c;这可能是因为在开发模式下&#xff0c;…

ros大车学习2024.3.28-2024.5.14小结(1)

ros一键安装推荐wget http://fishros.com/install -O fishros && . fishros (原本的资料的是melodic的&#xff0c;因为资料里面的镜像是ubuntu18.04的&#xff0c;而我用的是鲁班猫sk3566,ubuntu20.04&#xff0c;镜像来源于野火官网)首先获取新noetic源码2024.5.13从…

【YOLOV5 入门】——Gradio搭建Web GUI

引入&#xff1a;上节搭建的UI可视化界面只能以运行程序弹出窗口的形式运行&#xff0c;不能在网页Web中使用&#xff0c;本次代码将会非常少&#xff01; 一、Gradio简介与安装 Gradio 是一个用于构建机器学习模型演示界面和Web应用的开源库。提供了简单易用的界面&#xff0…

小红书自动私信获客,打造个人品牌

在当今这个内容为王、社交至上的时代&#xff0c;小红书作为新兴的社交电商平台&#xff0c;凭借其独特的社区氛围和强大的种草能力&#xff0c;成为了众多KOL、商家以及个人品牌打造的首选平台。想要在小红书上脱颖而出&#xff0c;精准引流获客&#xff0c;利用自动私信功能不…

在做题中学习(59):除自身以为数组的乘积

238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;前缀积和后缀积 思路&#xff1a;answer中的每一个元素都是除自己以外所有元素的和。那就处理一个前缀积数组和后缀积数组。 而前缀积(f[i])是&#xff1a;[0,i-1]所有元素的乘积 后缀…

汇昌联信科技:拼多多电商的运营流程有哪些?

在当今互联网高速发展的时代&#xff0c;电商平台层出不穷&#xff0c;其中拼多多以其独特的团购模式和低价策略迅速崛起&#xff0c;成为众多消费者和商家的新宠。那么&#xff0c;拼多多电商的运营流程究竟包含哪些环节呢?接下来&#xff0c;我们将从商品上架、营销推广、订…

超级漂亮的 Ai 官网源码

超级漂亮的 AI 官网源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 <script lang"js">function project3D(x, y, z, vars) {var p, dx - vars.camXy - vars.camY - 8z - vars.camZp Math.atan2(x, z)d Math.sqrt(x * x z * z)x Math.sin(p - v…

【强训笔记】day17

NO.1 思路&#xff1a;用一个字符串实现&#xff0c;stoi函数可以转化为数字并且去除前导0。 代码实现&#xff1a; #include <iostream> #include<string> using namespace std;string s;int main() {cin>>s;for(int i0;i<s.size();i){if(s[i]%20) s[…

Linux的命名管道 共享内存

目录 命名管道 mkfifo函数 unlink函数 命名管道类 服务端 客户端 共享内存 shmget函数 ftok函数 key和shmid的区别 snprintf函数 ipcs指令 ipcrm指令 shmctl函数 shmat函数 void*做返回值 创建共享内存空间 服务端 客户端 命名管道 基本概念&#xff1…

0509BBQ的Maven项目

0509BBQ的Maven项目包-CSDN博客 数据库字段 登录界面 点餐主页 登录完成进入点餐主页&#xff0c;显示已点餐的数据 点击点餐按钮&#xff0c;生成对应订单数据。 取消勾选点餐按钮&#xff0c;删除对应订单数据。 点击加减图片&#xff0c;实现对数量的加减 展示订单 ajax动态…