
上一篇:QT網絡程式設計開發服務端
.
文章目錄
-
-
- 基于Qt網絡程式設計用戶端
- QTcpSocket
-
- 配置
- Public
-
- connectToHost()
- waitForConnected
- SIGNAL
-
- disconnected()
- readyRead()
- TcpClient項目訓練
-
- widget.h
- widget.cpp
-
來源:微信公衆号「程式設計學習基地」
.
效果示範
QTcpSocket 類提供一個TCP套接字TCP是一個面向連接配接,可靠的的通信協定,非常适合于連續不斷的資料傳遞
QTcpSocket 是QAbstractSocket類非常友善的一個子類,讓你建立一個TCP連接配接和資料流交流。
QTcpSocket 信号:
readyRead() //有資料發送過來時觸發該信号
disconnected() //socket->close()觸發disconnected()信号,用戶端服務端都觸發
pro檔案添加
QT += network
連接配接伺服器,參數為伺服器位址和端口号
QString ipAddressStr = ui->lineEditAddress->text();
quint16 port = ui->lineEditPort->text().toInt();
socket->connectToHost(ipAddressStr, port);
if(socket->waitForConnected(3000))
{
//連接配接成功
qDebug() << "connect secess";
}
else
{
qDebug() << socket->errorString();
return;
}
connect(socket, SIGNAL(disconnected()),this,SLOT(disconnectedSlot()));//用戶端斷開連接配接
connect(socket, SIGNAL(readyRead()),this, SLOT(readyReadSlot())); //接收消息
QByteArray dataBa = socket->readAll();
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>
#include <QDateTime>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButtonConnect_clicked();
void disconnectedSlot();
void readyReadSlot();
void on_pushButtonSend_clicked();
private:
Ui::Widget *ui;
QTcpSocket *socket;
bool socketState;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
socket = new QTcpSocket;
socketState = false;
connect(socket, SIGNAL(disconnected()),this, SLOT(disconnectedSlot())); //用戶端斷開連接配接
connect(socket, SIGNAL(readyRead()),this, SLOT(readyReadSlot())); //接收消息
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButtonConnect_clicked()
{
QString ipAddressStr = ui->lineEditAddress->text();
quint16 port = ui->lineEditPort->text().toInt();
if(!socketState)
{
socket->connectToHost(ipAddressStr, port);
if(socket->waitForConnected(3000))
{
qDebug() << "Connect2Server OK";
ui->pushButtonConnect->setText("斷開連接配接");
socketState = true;
}
else
{
qDebug() << socket->errorString();
return;
}
}
else
{
socket->close();
ui->pushButtonConnect->setText("連接配接");
socketState = false;
}
}
void Widget::disconnectedSlot()
{
qDebug()<<"Socket close";
}
void Widget::readyReadSlot()
{
QByteArray dataBa = socket->readAll();
QString str = QString(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss ddd")) +
":Recv\n" + str.fromLocal8Bit(dataBa.data()); //本地GBK轉Unicode 解決亂碼
ui->textBrowserRecv->append(QString(str)); //送顯示
}
void Widget::on_pushButtonSend_clicked()
{
QString dataStr = ui->textEditSend->toPlainText();
//QByteArray data = dataStr.toUtf8(); //發送UTF編碼資料
QByteArray data = dataStr.toLocal8Bit(); //發送本地字元(GBK)
if(socket->isOpen() && socket->isValid())
{
socket->write(data);
}
QString str = QString(QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss ddd")) +
":Recv\n" + str.fromLocal8Bit(data.data()); //本地GBK轉Unicode 解決亂碼
ui->textBrowserRecv->append(QString(str)); //送顯示
}