官方文档链接:

A Guided Tour Of The POCO C++ Librarieshttps://docs.pocoproject.org/current/00100-GuidedTour.html

目录

介绍

Foundation库

XML库

Util库

Net库

将这些东西组合到一起


介绍

POCO C++库是一组开源C++类库的集合,它们简化及加速了用C++来开发以网络功能为核心的可移植程序的过程。这些库,完美地与C++标准库结合到一起,并且填补了它所留下的那些空缺。它们具有模块化、高效的设计与实现,使得POCO C++库特别适合于进行嵌入式开发。而这是C++编程语言正在变得越来越流行的领域,因为,它既能进行底层(设备I/O、中断处理,等等)的开发,也能进行高级的面向对象的开发。当然,POCO也已经准备好面对企业级开发的挑战了。

POCO由4个核心库及若干个附加库组成。核心库是:Foundation、XML、Util和Net。其中的两个附加库是:NetSSL,为Net 库中的网络类提供SSL 支持;Data,用来以统一的形式访问不同的SQL 数据库。POCO致力于进行以网络功能为核心的跨平台C++软件的开发,可以类比于Ruby on Rails对于Web开发的作用——一个功能强大而又简单易用的平台,用来构建妳自己的应用程序。POCO是严格围绕标准ANSI/ISO C++来开发的,并且支持标准库。贡献者们努力地达到以下要素之间的平衡:使用高级的C++特性;保持那些类的可理解性;保持代码的干净、一致及易维护性。

Foundation库

Foundation库是POCO的心脏。它包含着:底层平台的抽象层;常用的辅助类和函数。Foundation库包含:定义了固定尺寸整数的类型;将整数在不同的字节序之间转换的函数;一个Poco::Any类(基于boost::Any);用于错误处理及调试的工具,包括各种各样的异常类及断言支持。还有:一些用于内存管理的类,包括基于引用计数的智能指针,以及一些用于缓冲区管理的类,还有内存池。对于字符串处理,POCO包含了一些函数,可做以下事情:修剪字符串;进行大小写不敏感的比较;进行大小写转换。还利用一些类提供了基本的Unicode文字支持,这些类能够将文字在不同的字符编码之间转换,包括UTF-8和UTF-16。还提供了对于数字的格式化和解析功能的支持,包括一个类型安全的sprintf变种。还提供了以著名的PCRE库(http://www.pcre.org)为基础的正则表达式支持。

POCO提供了一些类,用于处理多种变种中的日期及时间。对于文件系统访问功能,POCO提供了Poco::File和Poco::Path类,以及Poco::DirectoryIterator类。在狠多程序中,某个部分需要向其它部分告知某些事件发生了。POCO提供了Poco::NotificationCenter、Poco::NotificationQueue和事件(类似于C#事件)来简化这个过程。以下示例展示了POCO事件的用法。在这个示例中,类Source拥有一个公有事件,名为theEvent,它有一个参数,类型为int。订阅者可以通过调用operator+=来订阅,调用operator-=来取消订阅,并且要传入两个参数:指向某个对象的一个指针;以及,指向某个成员函数的指针。事件可通用调用operator()来发射,在Source::fireEvent()中就是这么做的。

#include "Poco/BasicEvent.h"
#include "Poco/Delegate.h"
#include <iostream>using Poco::BasicEvent;
using Poco::delegate;class Source
{
public:BasicEvent<int> theEvent;void fireEvent(int n){theEvent(this, n);}
};class Target
{
public:void onEvent(const void* pSender, int& arg){std::cout << "onEvent: " << arg << std::endl;}
};int main(int argc, char** argv)
{Source source;Target target;source.theEvent += delegate(&target, &Target::onEvent);source.fireEvent(42);source.theEvent -= delegate(&target, &Target::onEvent);return 0;
}

POCO中的那些流式操作类,已经介绍过了。为了对它们进行增强,还提供了Poco::BinaryReader和Poco::BinaryWriter,用于从流中读取及写入二进制数据,并且会自动、透明地处理字节序问题。

在复杂的多线程程序中,找出问题及缺陷的唯一手段就是输出详尽的日志信息。POCO提供了一个功能强大且可扩展的日志框架,它支持:过滤;路由到不同的频道;以及,日志消息的格式化。日志信息可被写入到以下目标:终端;文件;syslog守护进程;或者,发送到网络。如果POCO提供的这些频道还不能满足妳,那么,还可以轻易地使用新的类来扩展日志框架。

对于在运行时载入(及卸载)共享库的任务,POCO提供了一个低层的Poco::SharedLibrary类。在它之上,是Poco::ClassLoader类模板,以及对应的支持框架,使得妳可以在运行时动态地载入及卸载C++类,这就类似于Java和.NET中的功能。类载入器框架,也使得,妳可以轻易地以平台无关的方式来为程序加入插件支持功能。

最后,POCOFoundation中包含了对于多线程编程的不同层次的抽象。有Poco::Thread类,以及常用的同步原语(Poco::Mutex、Poco::ScopedLock、Poco::Event、Poco::Semaphore、Poco::RWLock),一个Poco::ThreadPool类,以及对于线程本地存储的支持,也有高级的抽象,例如活跃对象(activeobjects)。简单来说,活跃对象,指的就是,它有某些方法,是在独立的线程中执行的。这样,就可以进行异步的成员函数调用——调用一个成员函数,在它正在执行的过程中,去干一些其它的事,最后,获取该函数的返回值。下面的示例中展示了在POCO中如何做到这一点。在ActiveAdder类定义了一个活跃方法(activemethod)add(),该方法是由addImpl()这个成员函数来实现的。在main()中调用该活跃方法,就会产生出一个Poco::ActiveResult(也被称作未来对象(future)),最终会通过它来获取到该函数的返回值。

#include "Poco/ActiveMethod.h"
#include "Poco/ActiveResult.h"
#include <utility>
#include <iostream>using Poco::ActiveMethod;
using Poco::ActiveResult;class ActiveAdder
{
public:ActiveAdder(): add(this, &ActiveAdder::addImpl){}ActiveMethod<int, std::pair<int, int>, ActiveAdder> add;private:int addImpl(const std::pair<int, int>& args){return args.first + args.second;}
};int main(int argc, char** argv)
{ActiveAdder adder;ActiveResult<int> sum = adder.add(std::make_pair(1, 2));// do other thingssum.wait();std::cout << sum.data() << std::endl;return 0;
}

XML库

POCO XML库提供了对于XML的读取、处理和输出功能。出于POCO的某个指导原则方面的考虑——不要尝试重新发明那些已经有用的东西——POCO的XML库支持工业标准的SAX(版本2)和DOM接口,这会令狠多用过XML的开发者倍感亲切。SAX,即为XML的简单API(SimpleAPIforXML(http://www.saxproject.org)),定义了一个基于事件的接口,用于读取XML。基于SAX的XML解析器,会遍历整个XML文档,并且在遇到元素、字符数据或其它XML事物时通知应用程序。SAX解析器不需要将整个XML文档读入到内存中,因此,可用来高效地解析巨型XML文件。反过来,DOM(文档对象模型(DocumentObjectModel,http://www.w3.org/DOM/)),使得应用程序能够以一个树型风格的对象层次来完整地访问XML文档。为了完成工作,POCO提供的DOM解析器必须将整个文档载入到内存中。为了减少DOM文档的内存占用,POCO中的DOM实现代码用上了字符串池,使得经常出现的字符串(例如元素和属性名字)只会被存储一次。这个XML库基于Expat开源XML解析库(http://www.libexpat.org)开发。以Expat为基础的是SAX接口,而以SAX接口为基础的就是DOM实现。对于字符串,XML库使用的是std::string,并且以UTF-8作为字符编码。这就使得XML库可轻易地与程序中的其它部分配套使用。在未来的版本中将支持XPath和XSLT。

Util库

Util库的名字可能会让妳产生误解,实际上,它主要是一个用来创建命令行程序和服务器程序的框架。包含的功能:处理命令行参数(验证、绑定到配置属性,等等);以及,管理配置信息。支持不同的配置文件格式——Java风格的属性文件、XML文件。

对于服务器程序,这个框架提供了对于Unix守护进程的透明支持。当然,所有的服务器程序也都可以直接从命令行启动,这样便于测试及调试。

Net库

POCO的Net库使得妳能够轻易地写出基于网络通信的应用程序。无论妳只是想使用普通的TCP套接字来发送数据,还是想要一个内置的完整功能的HTTP服务器,Net库都能满足妳。

在最底层,Net库提供了一些套接字类,支持:TCP流;服务器套接字;UDP套接字;多播套接字;ICMP;和原始套接字。如果妳的程序中需要用到安全的套接字,那么,请使用NetSSL库,它是利用OpenSSL(http://www.openssl.org)实现的。以这些套接字类为基础,提供了两个用来构建TCP服务器的框架——一个用来构建多线程服务器(对于每个连接都使用一个线程,该线程取自一个线程池),一个用来构建接收者-响应者(Acceptor-Reactor)模式的服务器。多线程的Poco::Net::TCPServer类和它的支持框架,同时也是POCO的HTTP服务器实现(Poco::Net::HTTPServer)的基础。在客户端开发方面,Net库提供了起到以下作用的类:与HTTP服务器通信;使用FTP协议发送及接收文件;使用SMTP协议发送邮件(包含附件);从POP3服务器接收邮件。

将这些东西组合到一起

下面的示例,展示了利用POCO库实现的一个简单的HTTP服务器。这个服务器会返回一个HTML文档,里面显示的是当前日期和时间。在这里,用上了应用程序框架,以开发出一个可以Unix守护进程的形式运行的服务器程序。当前,这个程序也可以在终端中直接启动。在使用HTTP服务器框架的过程中,定义了TimeRequestHandler这个类,它返回一个包含当前日期及时间的HTML文档,以对来自客户端的请求进行响应。同时,对于所接收到的每个请求,都会利用日志框架输出一条日志信息。为了与TimeRequestHandler类配套使用,还需要一个工厂类,TimeRequestHandlerFactory;该工厂类的一个实例会被传递给HTTP服务器对象。HTTPTimeServer这个应用程序类,定义了一个名为help的命令行参数,具体做法就是覆盖了Poco::Util::ServerApplication的defineOptions()成员函数。另外,在启动HTTP服务器之前,还会在main()中(通过initialize())读取默认的程序配置文件,并且取得某些配置属性的值。

#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::OptionCallback;
using Poco::Util::HelpFormatter;class TimeRequestHandler: public HTTPRequestHandler
{
public:TimeRequestHandler(const std::string& format): _format(format){}void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response){Application& app = Application::instance();app.logger().information("Request from %s",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
{
protected:void initialize(Application& self){loadConfiguration();ServerApplication::initialize(self);}void defineOptions(OptionSet& options){ServerApplication::defineOptions(options);options.addOption(Option("help", "h", "display argument help information").required(false).repeatable(false).callback(OptionCallback<HTTPTimeServer>(this, &HTTPTimeServer::handleHelp)));}void handleHelp(const std::string& name, const std::string& value){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);stopOptionsProcessing();_helpRequested = true;}int main(const std::vector<std::string>& args){if (!_helpRequested){unsigned short port = static_cast<unsigned short>(config().getInt("HTTPTimeServer.port", 9980));std::string format(config().getString("HTTPTimeServer.format",DateTimeFormat::SORTABLE_FORMAT));ServerSocket svs(port);HTTPServer srv(new TimeRequestHandlerFactory(format),svs, new HTTPServerParams);srv.start();waitForTerminationRequest();srv.stop();}return Application::EXIT_OK;}private:bool _helpRequested = false;
};

POCO C++库入门指南(翻译)相关推荐

  1. python海伦公式_python使用海伦公式Python 入门指南翻译

    python使用海伦公式Python 入门指南翻译 更新时间: 2019-07-24 16:38:23 作者:第二电脑网 来源:第二电脑网 浏览数:614 我要评论 最近打算学习Pytho,顺便把Th ...

  2. havok物理引擎快速入门指南翻译

    花了2天时间完成了这个翻译, 需要有C++基础, 是通过haovk引擎做物理动画的基础. 到intel官方网站注册一个帐号可以免费获取havok SDK, 这是SDK中的一个文档的翻译. [翻译]Ha ...

  3. python中matplotlib库实例_Python Matplotlib库入门指南

    Matplotlib简介 Matplotlib是一个Python工具箱,用于科学计算的数据可视化.借助它,Python可以绘制如Matlab和Octave多种多样的数据图形.最初是模仿了Matlab图 ...

  4. Kali Linux 无线渗透测试入门指南 翻译完成!

    原书:Kali Linux Wireless Penetration Testing: Beginner's Guide 译者:飞龙 在线阅读 PDF格式 EPUB格式 MOBI格式 代码仓库 赞助我 ...

  5. 2017 Vue.js 2快速入门指南

    注意,据部分读者反映本文水多,怕湿身者勿进.后续推荐详解 Vue & Vuex 实践 2017 Vue.js 2快速入门指南翻译自Vue.js 2 Quickstart Tutorial 20 ...

  6. jQuery中文入门指南,翻译加实例,jQuery的起点教程

    中文版译者:Keel 此文以实例为基础一步步说明了jQuery的工作方式.现以中文翻译(添加我的补充说明)如下.如有相关意见或建议请 EMAIL 告知.或者在 BLOG中留言. 英文原版:http:/ ...

  7. aws python库_适用于Alexa的新AWS Python SDK入门指南

    aws python库 by Ralu Bolovan 由Ralu Bolovan 适用于Alexa的新AWS Python SDK入门指南 (A Beginner's guide to the ne ...

  8. 【51单片机快速入门指南】4.3.1: MPU6050调用DMP库获取四元数和欧拉角

    目录 相关介绍 DMP库相关 DMP加载步骤: DMP设置数据写入 更新DMP DMP数据包结构 程序实现 DMP.c DMP.h 测试程序 四元数 实验现象 欧拉角的获取 普中51-单核-A2 ST ...

  9. Win32编程API 基础篇 -- 1.入门指南 根据英文教程翻译

    入门指南 本教程是关于什么的 本教程的目的是向你介绍使用win32 API编写程序的基础知识(和通用的写法).使用的语言是C,但大多数C++编译器也能成功编译,事实上,教程中的绝大多数内容都适用于任何 ...

最新文章

  1. linux实战考试题:批量创建用户和密码(不能使用循环)
  2. oracle稳定执行计划1
  3. mysql pdo 事务处理_php中pdo的mysql事务处理实例
  4. mysql多客户端数据不同步_一种多终端设备上的数据同步方法
  5. python工程师面试宝典_2019年,Python工程师必考的6个面试题,Python面试题No5
  6. 10年老兵给程序员的10条建议! 1
  7. NOIP2018 游记
  8. python 取列表偶数和奇数位置的值
  9. use proxy for git
  10. 开启 ASA 5505 snmp协议
  11. [转]Android的Handler总结
  12. java 之 状态模式(大话设计模式)
  13. eclipse 搭建python环境
  14. Python入门:Dataframe的索引模式
  15. 《Java语言程序设计》✍基础知识整理
  16. 计算QPSK/16QAM/64QAM信号OFDM调制后PAPR
  17. 用C++开发的双人对战五子棋
  18. 在iOS 14中使用带有SF Symbols 2的彩色图标
  19. 01-JavaScript基础.md
  20. 有一个人有一百块钱, 打算买一百只鸡, 现在大鸡三块钱一只, 小鸡一块钱三只, 不大不小的鸡两块钱一只. Java编程实现,刚好用一百块钱买一百只鸡.

热门文章

  1. 面试官问你斐波那契数列的时候不要高兴得太早 搞懂C语言函数指针 搜索引擎还可以这么玩? 那些相见恨晚的搜索技巧...
  2. java.awt.robot api,像java.awt.Robot中的Andr​​oid API
  3. 【Python学习】自定义对象转JSON
  4. 台达DVP50MC和台达DOP-110WS通信设置
  5. tesseract 训练入门--记一次50张简单验证码的训练过程
  6. 工具 | 使用 CLion 编译调试 MySQL 8.0
  7. 安装应用需要打开未知来源权限_Android O打开安装未知来源应用权限
  8. 王牌流量爆刷器 流量提升工具 网站刷新 增加浏览量 王牌软件
  9. Visual C++程序设计——MFC整理笔记
  10. 影响因子真的那么可靠吗?