网络编程、HTTP、Ftp、TCP、UDP

1 篇文章 0 订阅
1 篇文章 0 订阅

使用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); //显示接收到的数据 
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值