原文:http://www.cnblogs.com/pocobo/archive/2008/12/29/1364699.html

POCO C++库导游

Introduction

A Guided Tour of the POCO C++ Libraries

简介

POCO C++库是开源的用于简化和加速C++开发面向网络、可移植应用程序的C++库集,POCO库和C++标准库可以很好的集成并填补了C++标准库缺乏的功能空隙。POCO库的模块化、高效的设计及实现使得POCO特别适合嵌入式开发。在嵌入式开发领域,由于C++既适合底层(设备I/O、中断处理等)和高层面向对象开发,越来越流行。当然POCO也准备好了面对企业级挑战。

包含4个核心库及一些附加库. 这4个核心库是: Foundation, XML, Util 和 Net. 附加库中其中2个是NetSSL和Data,NetSSL为Net库中的网络类提供SSL支持, Data库提供访问不同SQL数据库的一致性接口。 POCO以网络中心的跨平台C++软件开发,就像苹果的Cocoa之余Mac开发, 或Ruby on Rails 之余Web开发—强大而不失简单有趣的用于创建应用的平台. POCO 严格使用标准ANSI/ISO C++创建, 包含标准库. 程序库的贡献者试图在使用C++高级特性、易于理解的类、干净的代码、连续及易于维护间得到平衡.

Foundation基本库

Foundation库是POCO的心脏.它包含底层平台的封装层,也包含经常使用的工具类和函数. 包含规定字节大小整数类型, 转换整数与字节顺序的函数, Poco::Any 类 (基于 boost::any), 错误处理及调试工具, 包含各种异常类和支持断言. 同时也包含一些内存管理类, 包括基于引用计数的智能指针,和用与buffer管理及内存池的类. 对于字符串的处理, POCO包含一些函数和其他的东西, 串trim操作, 大小写敏感的比较和大小写转换. 以类对Unicode的基本支持:转换文本的不同编码, 包括UTF-8 和 UTF-16. 支持格式化和解析数字, 包括sprintf 的类型安全变量. 还提供了基于著名的PCRE 库(http://www.pcre.org)的正则表达式。

POCO提供多种变量的日期和时间的处理类 。在访问文件系统方面, POCO 拥有Poco::File 、 Poco::Path 类, 和 Poco::DirectoryIterator 类.在许多应用程序中,其中一部分需要通知其他部分自己这边发生的事情. POCO中的Poco::NotificationCenter、 Poco::NotificationQueue 和 events (类似 C# events) 使这种工作变得容易. 下面的示例显示如何使用POCO的 events. 示例中, 类Source 的公共event命名为theEvent,该event有一个int型参数. 用户可调用操作符 +=订阅改事件和调用-=操作符取消订阅, 同时传递对象指针和成员函数指针.事件可通过调用()操作符发射, 见 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, int>(&target, &Target::onEvent);source.fireEvent(42);source.theEvent -= Delegate<Target, int>(&target, &Target::onEvent);return 0;
}

POCO 中的stream类已经提到过. stream作为Poco::BinaryReader 和 Poco::BinaryWriter 的参数用于写二进制数据到流中, 自动、透明地处理字节顺序问题.

在复杂的多线程应用中,查找问题和bug的仅有方式就是编写广泛的日志信息. POCO 提供强大可扩展的日志框架,该框架支持过滤、路由到不同的通道以及格式化日志信息. 日志消息可以写入console、文件、Windows 事件日志、Unix的syslog后台或网络中.如果POCO提供的通道不够使用,可以很方便的使用新类扩展日志框架.

对于在运行时装载(及卸载) 共享库, POCO提供底层的Poco::SharedLibrary 类. 基于它的Poco::ClassLoader 类模板和支持框架, 允许在运行时动态装载和卸载C++类, 类似于JAVA和.NET. 类装载框架使得以平台无关的方式编写应用程序插件成为小菜一碟。

最后, POCO Foundation 包含在不同级别上的多线程封装. 从Poco::Thread 类和一般同步原子(Poco::Mutex, Poco::ScopedLock, Poco::Event, Poco::Semaphore, Poco::RWLock),Poco::ThreadPool 类及支持thread-local 存储, 到高级别的活动对象(active object)的封装. 简单点儿说, 活动对象(active object)是拥有运行于自有线程中的方法的类. 这使得异步成员函数调用成为可能— 调用成员函数, 在函数执行期间, 做一堆其他的事情, 然后获得函数的返回值. 下面的示例展示在POCO中是如何做的. ActiveAdder 类定义一个活动方法add(), 由addImpl()成员函数实现. 在main()中调用活动方法产生Poco::ActiveResult (also known as a future), 最后获得函数的返回值。

#include "Poco/ActiveMethod.h"
#include "Poco/ActiveResult.h"
#include <utility>using Poco::ActiveMethod;
using Poco::ActiveResult;class ActiveAdder
{
public:ActiveObject(): activeAdd(this, &ActiveAdder::add){}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 things
    sum.wait();std::cout << sum.data() << std::endl;return 0;
}

The XML Library

POCO XML 库支持读取, 处理及写XML. 遵循POCO的一个指导原则— 不要试图重新发明已经存在的工作— POCO's XML 库支持工业标准SAX (版本2) 及DOM接口, 很多有XML经验的开发人员对此比较熟悉. SAX,XML的简单API (http://www.saxproject.org),定义了基于事件的XML读接口. 基于SAX的XML 解析器在读取XML文档时但它读到一个元素时会通知应用程序, 字符数据, 或其他人为定义的XML元素. SAX解析器不需要将整个XML文档装载到内存中, 因此它可用于高效测解析巨大的XML文件. 相反, DOM (文档对象模型, http://www.w3.org/DOM/) 让应用程序访问整个XML文档, 使用树形的对象层级. 要达到此目的,POCO提供的 DOM 解析器需要将整个文档装载到内存. 为减小DOM文档的内存占用量, POCO DOM 实现使用使用字符串spooling,经常使用的字符串如元素和属性名仅存储一次. XML 库基于Expat 开源XML 解析器库 (http://www.libexpat.org). 基于Expat 的是SAX 接口, 基于SAX接口的是DOM的实现. 对字符串, XML 库使用std::string, UTF-8编码. 这是的XML库与应用程序其他部分的接口变得简单. 在未来的版本中将提供对XPath 和 XSLT的支持。

Util 库

Util 库的名称可能会给人一些误导, 因为它包含了创建命令行和服务器应用的框架. 包括命令行参数处理支持(校验, 绑定到配置属性, etc.) 及管理配置信息. 支持不同的配置文件格式— Windows形式的 INI 文件, Java-类型的属性文件, XML文件及Windows注册表.

对服务器应用程序,框架提供对Windows服务和Unix后台的透明支持. 每个服务器应用可以注册以Windows服务运行, 不需要额外的代码.当然, 所有的服务器应用程序仍然可以按命令行方式运行, 这使得测试和调测容易.

Net 库

POCO's Net 库使得编写基于网络的应用容易. 不管是应用是简单的通过纯TCP socket发送数据还是需要完整的内建HTTP server的应用,都可以在Net库中找到有用的东西。

在最底层, Net库包含socket类, 支持TCP流和server sockets, UDP sockets, multicast sockets, ICMP 及 raw sockets. 如果需要安全sockets, NetSSL 库提供支持, 实现使用了 OpenSSL (http://www.openssl.org). 基于socket 类提供两个框架创建TCP服务器 — 一个是多线程服务器(每个连接一个线程, 从线程池获得), 一个是基于Acceptor-Reactor模式的服务器. 多线程 Poco::Net::TCPServer 类及其支持框架也是POCO's HTTP server 实现的基础. 在客户端, Net库提供类与HTTP servers通信, 要使用ftp协议发送和接收文件, 使用SMTP发送邮件消息 (包括附件) 和从POP3 server接收邮件

全部放在一起

下面的例子示例使用POCO库如何实现一个简单的HTTP服务器. 服务器返回显示当前日期和时间的HTML文档. 用于创建作为Windows服务或Unix后台进程的服务器应用程序的应用框架 。当然, 同一的可执行程序也可直接在shell启动. 要使用HTTP server框架, TimeRequestHandler 类定义为服务器返回包含当前日期和时间的HTML文档作为请求的响应. 对每个请求, 使用日志框架对其记录. 与 TimeRequestHandler 类一起, 相关的工厂类, TimeRequestHandlerFactory; 工厂的实例传送给HTTP server 对象. HTTPTimeServer 应用类定义了命令行参数帮助,通过重载Poco::Util::ServerApplication的成员函数defineOptions()。在HTTP server启动前,它也读取缺省的应用程序配置文件(在initialize()) 和在main()中获取配置属性的值。

#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 "+ 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><ptext-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();ServerApplication::initialize(self);}void uninitialize(){ServerApplication::uninitialize();}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 = (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;
};int main(int argc, char** argv)
{HTTPTimeServer app;return app.run(argc, argv);
}

原文地址 http://pocoproject.org/poco/docs/GuidedTour.html

转载于:https://www.cnblogs.com/Leo-Forest/archive/2013/01/17/2864974.html

POCO C++库导游【转】相关推荐

  1. POCO C++库学习和分析

    POCO C++库学习和分析 -- 序 1. POCO库概述: POCO是一个C++的开源库集.同一般的C++库相比,POCO的特点是提供了整一个应用框架.如果要做C++程序应用框架的快速开发,我觉得 ...

  2. POCO C++库学习和分析 -- 序

    POCO C++库学习和分析 -- 序 1. POCO库概述: POCO是一个C++的开源库集.同一般的C++库相比,POCO的特点是提供了整一个应用框架.如果要做C++程序应用框架的快速开发,我觉得 ...

  3. POCO C++库学习和分析 -- 异常、错误处理、调试

    POCO C++库学习和分析 -- 异常.错误处理.调试 1. 异常处理 C++同C语言相比,提供了异常机制.通过使用try,catch关键字可以捕获异常,这种机制使得程序员在程序异常发生时,可以通过 ...

  4. Poco C++库简介

    学习一个框架前,要先明白它的是什么,为什么,怎么用.下面这些文字,是从中文poco官网上转过来的,正如poco c++库的特点,非常清晰,代码风格更是一目了然. poco开发库的特点,非常适合写后台处 ...

  5. php curl模拟wss,使用Poco C++库创建websocket安全访问(wss)客户端

    Poco websocket库特点: 1,使用http/https ClientSession创建websocket client 2,是同步的,这对C++桌面编程来说应该是够用的. 3,依赖open ...

  6. POCO C++库入门指南(翻译)

    官方文档链接: A Guided Tour Of The POCO C++ Librarieshttps://docs.pocoproject.org/current/00100-GuidedTour ...

  7. poco,c++库学习,日期和时间

     POCO C++库学习和分析 -- 日期与时间 在Poco库中,与时间和日期相关的一些类,其内部实现是非常简单的.看相关文档时,比较有意思的倒是历史上的不同时间表示法. 1. 系统时间函数    ...

  8. POCO C++库学习和分析 -- 字符编码

    POCO C++库学习和分析 -- 字符编码 1. 字符编码 1.1 字符编码的概念 字符编码可以理解为在计算机上语言符号和二比特数之间的映射.不同的编码方式对应着不同映射方法,对于映射集的双方而言, ...

  9. poco mysql 库_Poco Mysql使用

    连接时用到的一些字段, POCO官方文档中也有说明 \Data\MySQL\src\SessionImpl.cpp:69 options["host"]= "localh ...

最新文章

  1. 如何用 StreamAPI 处理 BigDecimal 的 add 操作
  2. 大话移动开发之QT-Quick
  3. 并行计算(一)——并行计算机系统及结构模型
  4. cad多段线画圆弧方向_CAD箭头怎么画
  5. 狐假虎威的故事,狐假虎威的故事告诉我们什么道理?
  6. linux tty 软件包,Linux TTY framework(2)_软件架构
  7. Android Studio3.0,在原有项目中进行ndk配置
  8. Makefile,Shell command,Shell Language 之间的联系
  9. 【PS】怎么让一张模糊图片更清晰?
  10. 库克低调访华,3小时郑州行程俨然一位效率大师
  11. 对于gabor变换和gabor小波变换理解与总结
  12. google即将进入游戏产业
  13. 插屏广告怎么玩?这些优化要点请get~
  14. HBase+Spark技术双周刊 第四期 1
  15. Uncaught RangeError: Maximum call stack size exceeded.
  16. 2022年电商系统开发平台测评体验
  17. 安卓还是鸿蒙,SaaS应用移动化靠谁?
  18. iPhone开发中的技巧整理(二)
  19. mcrypt java_使用openssl解密mcrypt
  20. 2021年人才引进入深户全流程(赶上政策末班车)

热门文章

  1. 提高GAN训练稳定性的9大tricks
  2. 牛逼了 这 7 个 Python 入门实战项目,我打 99.99 分
  3. python中单下划线(_)和双下划线(__)的特殊用法 还等什么
  4. 有轻功:用3行代码让Python数据处理脚本获得4倍提速
  5. 不是程序员看不懂的21个梗,当你改错一行代码的时候...
  6. 收藏 | Pytorch-lightning的使用
  7. pytorch错误解决 | 错误‘Widget Javascript not detected. It may not be installed or enabled properly.‘
  8. 解决Python中sum函数出现的TypeError: unsupported operand type(s) for +: 'int' and 'list'错误问题
  9. 论文Algorithms for non-negative matrix Factorization
  10. ivx中字体显示_html-中文字体在CSS中的显示(Unicode编码)(转载)