原文链接:http://grow.sinaapp.com/?p=1271
POCO(pocoproject.org)看起来是很不错的C++跨平台开源库,包含网络(HTTP、FTP等)、正则、XML、Zip、日期、文件、线程、通知、配置、日志、Timer等方面的类,只可惜国内使用者和讨论很少。
一、编译安装方法
- 从官网(pocoproject.org/download)下载POCO源代码,推荐下载基本版本(Basic Edition)
- POCO由基础(Foundation)、有用工具(Util)、网络(Net)、XML等几大模块组成,源代码中每个模块为一个单独的目录,包含本模块的include文件、源代码(src)、例子(samples)和测试样本(testsuite)。
- windows平台下推荐通过VS命令工具进行编译,具体操作为从开始–打开VS命令工具–进入poco源代码目录–输入buildwin查看具体用法。可选择生成3种不同的库(static_mt|static_md|shared|all),还可选择生成release或debug版本,推荐生成release的static_mt版本,这样生成的程序可以直接发布。具体说明可参加官方文档中的说明(pocoproject.org/docs)。生成的库文件在源代码目录下的lib文件夹中
- 可将各个不同模块下的include目录放在一起方便随后程序使用,像我这样
二、如何使用呢–以免费的Visual C++ 2010 Express版本为例
- 首先新建一个项目,添加一个C++源文件,点击Visual C++菜单栏的项目-属性打开属性页,点击 配置属性-C/C++-常规 在右边的附件包含目录里填入Poco的include文件所在目录。点击 配置属性-链接器-常规 在右边的附加库目录里填入Poco lib库或dll库所在的目录
- 默认情况下Poco可自动链接生成的dll库,如果想让它自动链接静态lib库,请点击 配置属性-C/C++-预处理器 在右边的预处理器定义中添加 POCO_STATIC。进一步了解请参考官方文档。
- Poco使用了C++的命名空间和异常机制,请记得处理异常哦,否则程序可能会崩溃的。Poco::Exception是所有Poco异常类的基类,如果你不知道具体的异常类型,可使用下面的方式捕获所有异常信息:
try { std::vector<std::string> dirs; getDirList(dirs); for(size_t i=0; i<dirs.size(); i++) { std::cout<<"deal dir "<<dirs[i]<<"....\n"; pocoFtp1(dirs[i]); } } catch(Poco::Exception &exc) { std::cout<<"exc"<<exc.displayText(); }
三、利用POCO进行HTTP POST请求的例子
#include<iostream>
#include "Poco/Net/HTMLForm.h"
#include "Poco/URI.h"
#include "Poco/Net/HTTPClientSession.h"
#include "Poco/Net/HTTPRequest.h"
#include "Poco/Net/HTTPResponse.h"
#include "Poco/StreamCopier.h"
#include "Poco/Net/NetException.h"
//可用下面数据测试
//url http://current.sinaapp.com/post.php
//key abc
//value 456
//向网页提交post请求
void pocoPost(const std::string &url, const std::string &key, const std::string &value)
{
Poco::URI purl(url);
try
{
Poco::Net::HTTPClientSession session( purl.getHost(), purl.getPort() );
//如需设置代理 将下面一句注释去掉
//session.setProxy("172.18.172.251",80);
Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_POST, purl.getPath(), Poco::Net::HTTPMessage::HTTP_1_1);
Poco::Net::HTMLForm form;
form.add(key, value);
// Send the request.
form.prepareSubmit(req);
std::ostream& ostr = session.sendRequest(req);
form.write(ostr);//提交post的键值信息
Poco::Net::HTTPResponse res;
std::istream& istr = session.receiveResponse(res);
//上句接收网站回应的信息 返回输入流 并copy到标准控制台输出流
Poco::StreamCopier::copyStream(istr, std::cout);
std::cout<<std::endl;
}
catch(Poco::Net::NetException& ex)
{
std::cout<<"post wrong: "<<ex.displayText();
}
}
四、利用POCO操作FTP的例子
#include "Poco/Net/FTPClientSession.h"
#include "Poco/StreamCopier.h"
#include <iostream>
#include <vector>
#include <sstream>
void pocoFtp(const std::string &host,const std::string &username,const std::string &password,const std::string &dir)
{
Poco::Net::FTPClientSession session(host);
session.login(username, password);//登录
session.setWorkingDirectory(dir);//设置读取目录
std::istream &ftpin = session.beginList("");//下载目录中文件列表
std::string str;
std::vector<std::string > filelist;
while(ftpin>>str)
{//存储文件列表
filelist.push_back(str);
}
session.endList();//关闭目录下载连接
for(size_t i=0; i!=filelist.size(); i++)
{
std::cout<<"deal file "<<filelist[i]<<"...\n";
std::string content;
//下载每个文件并存储到字符串content中
Poco::StreamCopier::copyToString( session.beginDownload( filelist[i] ), content);
session.endDownload();//关闭下载连接
}
session.close();//断开FTP
}
五、利用POCO读写XML配置文件的例子
#include "Poco/Util/XMLConfiguration.h"
#include <string>
#include <iostream>
void pocoConfig()
{
using Poco::AutoPtr;
using Poco::Util::XMLConfiguration;
AutoPtr<XMLConfiguration> pConf(new XMLConfiguration("config1.xml") );
pConf->setDouble("prop6",3.14);
double a = pConf->getDouble("prop2");
std::cout<<a;
pConf->save("config1.xml");
}
xml配置文件格式如下
<config>
<prop2>2.3</prop2>
</config>
相关资源:
1. POCO官方幻灯片教程整理
2. POCO官方文档说明