使用QNetworkAccessManager类和QNetworkReply类来进行HTTP的编程。
manager = new QNetworkAccessManager(this); //新建QNetworkAccessManager对象
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*))); //关联信号和槽
manager->get(QNetworkRequest(QUrl("http://www.yafeilinux.com"))); //发送请求 然后定义函数:
void Widget::replyFinished(QNetworkReply *reply) //当回复结束后
{
QTextCodec *codec = QTextCodec::codecForName("utf8"); //使用utf8编码,这样才可以显示中文
QString all = codec->toUnicode(reply->readAll());
ui->textBrowser->setText(all);
reply->deleteLater(); //最后要释放reply对象
}
FTP即File Transfer Protocol,
也就是文件传输协议。FTP的主要作用,就是让用户连接上一个远程计算机,查看远程计算机有哪些文件,
然后把文件从远程计算机上拷贝到本地计算机,或者把本地计算机的文件送到远程计算机上。
QFtp目前Qt未安装该组件,如果需要,需从网上下载源码编译
ftp = new QFtp(this);
ftp->connectToHost("ftp.qt.nokia.com"); //连接到服务器
ftp->login(); //登录
ftp->cd("qt"); //跳转到"qt"目录下
ftp->get("INSTALL"); //下载"INSTALL"文件
ftp->close(); //关闭连接
connect(ftp,SIGNAL(commandStarted(int)), this,SLOT(ftpCommandStarted(int))); //当每条命令开始执行时发出相应的信号
connect(ftp,SIGNAL(commandFinished(int,bool)), this,SLOT(ftpCommandFinished(int,bool)));
//当每条命令执行结束时发出相应的信号
QHostInfo获取主机名和IP地址。
protocol()判断是否是IPV4,QAbstractSocket::IPv6Protocol判断是否是IPV6
QNetworkInterface类来获取本机的IP地址和网络接口信息。
每一个IP地址又包含了和它相关的子网掩码和广播地址,它们三者被封装在一个QNetworkAddressEntry对象中
//QUdp发送UDP数据,客户端
sender = new QUdpSocket(this); //更改“开始广播”按钮的单击事件槽函数:
QByteArray datagram = "hello world!";
sender->writeDatagram(datagram.data(),datagram.size(), QHostAddress::Broadcast,45454);
//发送的内容,大小,ip地址,端口号
//QUdp接收UDP数据,服务端
receiver = new QUdpSocket(this);
receiver->bind(45454,QUdpSocket::ShareAddress);
connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));
void Widget::processPendingDatagram() //处理等待的数据报
{
while(receiver->hasPendingDatagrams()) //拥有等待的数据报
{
QByteArray datagram; //拥于存放接收的数据报
datagram.resize(receiver->pendingDatagramSize()); //让datagram的大小为等待处理的数据
报的大小,这样才能接收到完整的数据
receiver->readDatagram(datagram.data(),datagram.size()); //接收数据报,将其存放到datagram中
ui->label->setText(datagram); //将数据报内容显示出来
}
}
//Tcp发送Tcp消息
tcpServer = new QTcpServer(this);
if(!tcpServer->listen(QHostAddress::LocalHost, 6666))
{
//监听本地主机的6666端口,如果出错就输出错误信息,并关闭
qDebug() << tcpServer->errorString();
close();
}
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage()));
//连接信号和相应槽函数
void Widget::sendMessage()
{
QByteArray block; //用于暂存我们要发送的数据
QDataStream out(&block,QIODevice::WriteOnly); //使用数据流写入数据
out.setVersion(QDataStream::Qt_4_6); //设置数据流的版本,客户端和服务器端使用的版本要相同
out<<(quint16) 0;
out<<tr("hello Tcp!!!");
out.device()->seek(0);
out<<(quint16)(block.size() – sizeof(quint16));
QTcpSocket *clientConnection = tcpServer->nextPendingConnection(); //我们获取已经建立的连接的子套接字
connect(clientConnection,SIGNAL(disconnected()),clientConnection, SLOT(deleteLater()));
clientConnection->write(block);
clientConnection->disconnectFromHost();
ui->statusLabel->setText("send message successful!!!");
//发送数据成功后,显示提示
}
Tcp接收消息
tcpSocket = new QTcpSocket(this);
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
//当有数据到来时发出readyRead()信号,我们执行读取数据的readMessage()函数。
void Widget::newConnect()
{
blockSize = 0; //初始化其为0
tcpSocket->abort(); //取消已有的连接
tcpSocket->connectToHost(ui->hostLineEdit->text(), ui->portLineEdit->text().toInt()); //连接到主机,这里从界面获取主机地址和端口号
} //这个函数实现了连接到服务器,下面会在"连接"按钮的单击事件槽函数中调用这个函数。
void Widget::readMessage()
{
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_6);
//设置数据流版本,这里要和服务器端相同
if(blockSize==0) //如果是刚开始接收数据
{ //判断接收的数据是否有两字节,也就是文件的大小信息 //如果有则保存到blockSize变量中,没有则返回,继续接收数据
if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;
in >> blockSize;
}
if(tcpSocket->bytesAvailable() < blockSize) return; //如果没有得到全部的数据,则返回,继续接收数据
in >> message; //将接收到的数据存放到变量中
ui->messageLabel->setText(message); //显示接收到的数据
}