QT網絡連接

1、clicent

1、connect:通過socket發送的connected連接信號,判斷是否連接到服務器
2、通過按鍵點擊的槽函數void Widget::on_pushButton_clicked()
將ip地址和端口通過socket的connectToHost連接到服務器
3、客戶端可以通過readyRead信號來進行判斷服務器有無信息發送。通過socket的readall將內容全部讀取到

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QHostAddress>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    socket = new QTcpSocket(this);

    //連接服務器
    connect(socket,&QTcpSocket::connected,
            [this]()
            {
                qDebug()<<"連接成功";
            });
    //當有數據發送過來的時候,會觸發信號
    connect(socket,&QTcpSocket::readyRead,
            [this]()
            {
               QByteArray data = socket->readAll();
               QString s = QString(data);
               ui->textEdit->append(s);
            });

}

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

void Widget::on_pushButton_clicked()
{
    QString ip = ui->lineEdit->text();
    uint16_t port = ui->lineEdit_2->text().toInt();

    socket->connectToHost(QHostAddress(ip),port);
}


void Widget::on_pushButton_2_clicked()
{
    QString data = ui->textEdit_2->toPlainText();

    socket->write(data.toUtf8());

    QString s = QString("me:%1").arg(data);
    ui->textEdit->append(s);
}

2、服務器

1、newConnection信號進行接收客戶端連接,但是由於信號是沒有順序的,爲了防止不出錯。通過hasPendingConnections來確認信號接收完畢
接收客戶端請求,產生一個和客戶端通信的套接字QTcpSocket *s
獲取readyRead信號通過槽函數
對數據進行處理

#include "widget.h"
#include "ui_widget.h"
#include <QHostAddress>
#include <QTcpSocket>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    server = new QTcpServer(this);

    server->listen(QHostAddress::Any, 9999);

    connect(server, &QTcpServer::newConnection,
            [this]()
            {
                while(server->hasPendingConnections())
                {
                    // 接收客戶端請求,產生一個和客戶端通信的套接字
                    QTcpSocket *s = server->nextPendingConnection();
                    connect(s, &QTcpSocket::readyRead, this, &Widget::handleClient);
                }
            });

}

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

void Widget::handleClient()
{
    // 信號的發出者
    QTcpSocket *s = (QTcpSocket *)sender();
    while (s->bytesAvailable())
    {
        QByteArray data = s->readAll();   // 讀到的數據

        s->write(data);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章