QTcpSocket Class
利用 QTcpSocket 来实现一个界面,模仿 Telnet 的功能,访问HTTP服务器。
QTcpSocket是QAbstractSocket的一个方便的子类,它允许您建立TCP连接并传输数据流。
1、主要的方法
1.1 连接主机
socket->connectToHost (HostName,80); // apache 默认localhost,即回环地址,端口80
1.2 组装请求报文
按HTTP的请求报文的格式,构造出请求报文
如下:
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 ();
}