Qt网络编程
sf2gis@163.com
2015年5月2日
1 目标:在网络上不同的计算机之间进行交互。
原理:构造不同的传输协议,在不同的主机之间进行按照协议标准进行请求和回复。
方法:HTTP,FTP,TCP,UDP
使用QtNetwork框架的相关类操作。
1.1 Qt 操作
协议管理:使用QUrl进行Url构造,包含对协议、用户名、密码等设置。
请求:QNetworkRequest。
回复:QNetworkReply。
操作管理:QNetworkAccessManager。负责进行HTTP操作及状态。
进度:QNetworkReply发送downloadProgress()信号。
1.2 示例
1.2.1 Http请求页面
voidMainWindow::http()
{
QNetworkAccessManager *pManager = newQNetworkAccessManager(this);
connect(pManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(handleReply(QNetworkReply*)));
QNetworkReply *reply =pManager->get(QNetworkRequest(QUrl("http://www.gfsoso.net/")));
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(handleProgress(qint64,qint64)));
}
voidMainWindow::handleReply(QNetworkReply *reply)
{
QString strReply(reply->readAll());
qDebug()<<strReply;
ui->textBrowser->setText(strReply);
reply->deleteLater();
}
voidMainWindow::handleProgress(qint64 readBytes,qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(readBytes);
}
1.2.2 FTP下载文件
voidMainWindow::handleReply(QNetworkReply *reply)
{
QByteArray ba = reply->readAll();
QString strReply(ba);
qDebug()<<strReply;
ui->textBrowser->setText(strReply);
QFile file("test.tar.gz");
file.open(QFile::WriteOnly);
file.write(ba);
file.close();
reply->deleteLater();
}
voidMainWindow::handleProgress(qint64 readBytes,qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes);
ui->progressBar->setValue(readBytes);
}
voidMainWindow::ftp()
{
QNetworkAccessManager *pManager = newQNetworkAccessManager(this);
connect(pManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(handleReply(QNetworkReply*)));
QNetworkReply *reply =pManager->get(QNetworkRequest(QUrl("ftp://ftp.pku.edu.cn/open/db/MySQL/mysql-connector-java-5.1.21.tar.gz")));
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(handleProgress(qint64,qint64)));
}
2 Http :HypeText Tranfer Protoco,超文本传输协议
2.1 目标:发送和接收HTML。
2.2 方法:
提供多种操作方式,如get(请求URL),Post(请求处理数据),PUT(上传数据),DELETE(删除),CONNECT(连接到TCP/IP),OPTIONS(返回所有支持的方法),HEAD(仅返回头)。其中CURD对应POST,PUT,GET,DELETE。
GET与POST的区别:get使用url的一部分传递参数,可见,长度有限(2048),只能传递ascii。post使用单独传递数据,不可见,长度不了,