Qt之Http:4 利用QTcpSock访问HTTP

QTcpSocket Class

利用 QTcpSocket 来实现一个界面,模仿 Telnet 的功能,访问HTTP服务器。

QTcpSocket是QAbstractSocket的一个方便的子类,它允许您建立TCP连接并传输数据流。

1、主要的方法

1.1 连接主机

socket->connectToHost (HostName,80);	// apache 默认localhost,即回环地址,端口80

1.2 组装请求报文

按HTTP的请求报文的格式,构造出请求报文

img

如下:

HEAD /index.html HTTP/1.1 \r\n
Host:127.0.0.1\r\n
\r\n

1.3 连接socket的readyread信号

connect (socket,&QTcpSocket::readyRead ,this,&MainWindow::onRepalyFinished );

1.4 响应的报文添加到QTextEdit

QString ba = socket->readAll ();
.....
ui->textEdit->insertPlainText(ba)  

2、项目

3 代码

没啥代码量,就补一个cpp源码凑数,🤣

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QtNetwork>
#include "../../DebugTools/DebugTool.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btn_addRequestLine_clicked()
{
    QString oper = ui->comboBox->currentText ();        // 请求方法
    QString url = ui->edit_url->text ();                // 请求资源
    QString prot = ui->edt_protocal->text ();             // 协议
    HostName = ui->lineEdit->text ();
    ui->edit_request->clear ();
    ui->edit_request->appendPlainText (oper+" /"+url+" "+prot);
    ui->edit_request->appendPlainText ("Host:"+ HostName);
    ui->edit_request->appendPlainText ("");
}

void MainWindow::on_btn_SendRequest_clicked()
{
    if(socket==0){
        socket = new QTcpSocket;
        connect (socket,&QTcpSocket::disconnected,[this]{
            cout << socket->peerAddress () << socket->peerPort ();
            ui->textEdit->append("从服务器断开!\n\n");
        });
    }
    socket->connectToHost (HostName,80);
    QByteArray ba = ui->edit_request->toPlainText ().toLocal8Bit ();
    ba.replace ("\n","\r\n");
    ba.append ("\r\n");

    socket->write (ba,ba.length ());
    connect (socket,&QTcpSocket::readyRead ,this,&MainWindow::onRepalyFinished );
}

void MainWindow::onRepalyFinished()
{
    QString ba = socket->readAll ();
    QStringList list = ba.split ("\r\n");
    for (int i=0;i<list.count ()-1;++i) {
        QString str = list.at (i);
        int ixd = str.indexOf (":");
        if(ixd>=0){
            ui->textEdit->insertPlainText (QString("%1:%2\n").arg (str.section (':',0,0),-20).arg (str.section (':',1)));
        }else{
            ui->textEdit->insertPlainText (str+"\n");
        }
    }

    entity = list.last ();
    if(entity.isEmpty ())
        return;
    ui->textEdit->insertPlainText (entity+"\n");
    ui->textEdit->insertHtml (entity+"\n");

}
void MainWindow::on_btn_clearTextEdit_clicked()
{
    ui->textEdit->clear ();
}
void MainWindow::on_btn_clear_PEdit_clicked()
{
    ui->edit_request->clear ();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值