POCOC++是一个开源的C++类库的集合,它主要提供简单的、快速的网络和可移植应用程序的C++开发,这个类库和C++标准库可以很好的集成并填补C++标准库的功能空缺。POCO库的模块化、高效的设计及实现使得POCO特别适合嵌入式开发。在嵌入式开发领域,由于C++既适合底层(设备I/O、中断处理等)和高层面向对象开发,越来越流行。当然POCO也准备好了面对企业级挑战。
POCOC++包含四个核心库和一些附加库。核心库包括Foundation,XML,Util和Net,还有两个附加库,一个是NetSSL,主要在Net库中网络类中提供SSL支持;一个是Date库,在不同的SQL库中提供统一的接口访问。POCOC++以网络中心的跨平台 C++软件开发为目标,就像苹果的Cocoa之于Mac开发,或Ruby on Rails 之于Web开发—样强大而不失简单并有趣的用于创建应用平台。POCO C++严格使用标准的ANSI/ISOC++,包含标准库。程序库的贡献者试图在使用C++高级特性、易于理解的类、干净的代码、连续及易于维护间得到平衡.
Foundation库
Foundation库是POCOC++的核心库。包含了底层平台的抽象层,还有经常使用的实用类和函数。包含了固定大小的整数类型,提供整型与字节转换的函数。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().
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)的封装. 简单点儿说, 活动对象(activeobject)是拥有运行于自有线程中的方法的类. 这使得异步成员函数调用成为可能— 调用成员函数, 在函数执行期间,做一堆其他的事情, 然后获得函数的返回值. 下面的示例展示在POCO中是如何做的. ActiveAdder类定义一个活动方法add(), 由addImpl()成员函数实现.在main()中调用活动方法产生Poco::ActiveResult (also known as a future),最后获得函数的返回值。
The XML 库
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发送数据还是需要完整的内建HTTPserver的应用,都可以在Net库中找到有用的东西。
在最底层, Net库包含socket类, 支持TCP流和server sockets, UDP sockets, multicastsockets, 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接收邮件。