天天看點

QT網絡程式設計開發用戶端

QT網絡程式設計開發用戶端

上一篇:QT網絡程式設計開發服務端

.

文章目錄

      • 基于Qt網絡程式設計用戶端
      • QTcpSocket
        • 配置
        • Public
          • connectToHost()
          • waitForConnected
        • SIGNAL
          • disconnected()
          • readyRead()
      • TcpClient項目訓練
        • widget.h
        • widget.cpp

來源:微信公衆号「程式設計學習基地」

.

效果示範

QT網絡程式設計開發用戶端

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));          //送顯示
}
           

繼續閱讀