国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

QT實(shí)現(xiàn)TCP通信(服務(wù)器與客戶端搭建)

這篇具有很好參考價(jià)值的文章主要介紹了QT實(shí)現(xiàn)TCP通信(服務(wù)器與客戶端搭建)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、TCP通信框架

QT實(shí)現(xiàn)TCP通信(服務(wù)器與客戶端搭建),QT,服務(wù)器,tcp/ip,網(wǎng)絡(luò)

二、QT中的服務(wù)器操作

QT實(shí)現(xiàn)TCP通信(服務(wù)器與客戶端搭建),QT,服務(wù)器,tcp/ip,網(wǎng)絡(luò)

  1. 創(chuàng)建一個(gè)QTcpServer類對(duì)象,該類對(duì)象就是一個(gè)服務(wù)器
  2. 調(diào)用listen函數(shù)將該對(duì)象設(shè)置為被動(dòng)監(jiān)聽狀態(tài),監(jiān)聽時(shí),可以監(jiān)聽指定的ip地址,也可以監(jiān)聽所有主機(jī)地址,可以通過指定端口號(hào),也可以讓服務(wù)器自動(dòng)選擇
  3. 當(dāng)有客戶端發(fā)來連接請(qǐng)求時(shí),該服務(wù)器會(huì)自動(dòng)發(fā)射一個(gè)newConnection信號(hào),我們可以將該信號(hào)連接到自定義槽函數(shù)處理相關(guān)邏輯
  4. 在槽函數(shù)中,可以調(diào)用nextPendingConnection函數(shù)可以獲得最新連接的客戶端套接字地址,我們可以將該套接字地址存儲(chǔ)到容器中
  5. 此時(shí)服務(wù)器與客戶端已經(jīng)建立連接,如果有客戶端向服務(wù)器發(fā)來數(shù)據(jù),那么對(duì)應(yīng)的客戶端套接字就會(huì)發(fā)射一個(gè)readyRead信號(hào)
  6. 讀取套接字中的數(shù)據(jù)使用read、readLine、readAll函數(shù)來完成
  7. 向套接字中寫數(shù)據(jù),可以使用write
  8. 關(guān)閉服務(wù)器,使用close來完成

Server界面代碼:

系統(tǒng)管理文件:

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

?頭文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>   //服務(wù)器頭文件
#include <QTcpSocket>   //客戶端頭文件
#include <QList>    //鏈表頭文件用來存放客戶端容器
#include <QDebug>
#include <QMessageBox>  //消息對(duì)話框

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();
    void newConnection_slot();
    void readyRead_slot();  //自定義處理readyRead信號(hào)的槽函數(shù)

private:
    Ui::Widget *ui;

    //定義服務(wù)器指針
    QTcpServer *server;

    //定義客戶端指針鏈表容器
    QList<QTcpSocket *> clientList;

};
#endif // WIDGET_H

主函數(shù):

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

主要功能函數(shù):

#include "widget.h"
#include "ui_widget.h"

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

    //給服務(wù)器指針實(shí)例化對(duì)象
    server = new QTcpServer(this);  //服務(wù)器創(chuàng)建完成

}

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

//啟動(dòng)服務(wù)器按鈕對(duì)應(yīng)的槽函數(shù)
void Widget::on_pushButton_clicked()
{
    //獲取UI界面的端口號(hào)
    quint16 port = ui->lineEdit->text().toUInt();
    //將服務(wù)器設(shè)置為被動(dòng)監(jiān)聽狀態(tài)
    //bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
    //參數(shù)1:要監(jiān)聽的主機(jī)地址,如果是any,表示監(jiān)聽所有主機(jī)地址,也可以給特定的主機(jī)地址進(jìn)行監(jiān)聽
    //參數(shù)2:通過指定的端口號(hào)進(jìn)行訪問服務(wù)器,如果是0,表示由服務(wù)器自動(dòng)分配。如果非0,則表示指定端口號(hào)
    //返回值:成功返回真,失敗返回假
    if(!server->listen(QHostAddress::Any,port))
    {
        QMessageBox::critical(this, "失敗", "服務(wù)器啟動(dòng)失敗");
    }else{
        QMessageBox::information(this, "成功", "服務(wù)器啟動(dòng)成功");
    }

    //執(zhí)行到這表明服務(wù)器啟動(dòng)成功,并對(duì)客戶端連接進(jìn)行監(jiān)聽,如果有客戶端向服務(wù)器發(fā)來連接請(qǐng)求,那么該服務(wù)器就會(huì)自動(dòng)發(fā)射一個(gè)newConnection信號(hào)
    //我們可以將信號(hào)連接到對(duì)應(yīng)的槽函數(shù)中處理相關(guān)邏輯
    connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);
}

void Widget::newConnection_slot()
{
    qDebug() <<"有客戶端申請(qǐng)連接";

    //獲取最新連接的客戶端套接字
    //[virtual] QTcpSocket *QTcpServer::nextPendingConnection()
    QTcpSocket *s = server->nextPendingConnection();

    //將獲取的套接字存放到客戶端容器中
    clientList.push_back(s);

    //此時(shí),客戶端就和服務(wù)器建立起來聯(lián)系了
    //如果客戶端有數(shù)據(jù)向服務(wù)器發(fā)送過來,那么該套接字就會(huì)自動(dòng)發(fā)送一個(gè)readyread信號(hào)
    //我們可以將該信號(hào)連接到自定義的槽函數(shù)中處理相關(guān)邏輯
    connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
}

//關(guān)于readyRead信號(hào)對(duì)應(yīng)槽函數(shù)的實(shí)現(xiàn)
void Widget::readyRead_slot()
{
    //刪除客戶端鏈表中的無效客戶端套接字
    for(int i=0; i<clientList.count(); i++)
    {
        //判斷套接字的狀態(tài)
        //函數(shù)原型     SocketState state() const;
        //功能:返回客戶端狀態(tài)
        //返回值:客戶端狀態(tài),如果是0,表示無連接
        if(clientList[i]->state() == 0)
        {
            clientList.removeAt(i);     //將下標(biāo)為i的客戶端移除
        }
    }

    //遍歷所有客戶端,查看是哪個(gè)客戶端發(fā)來數(shù)據(jù)
    for(int i=0; i<clientList.count(); i++)
    {
        //函數(shù)原型:qint64 bytesAvailable() const override;
        //功能:返回當(dāng)前客戶端套接字中的可讀數(shù)據(jù)字節(jié)個(gè)數(shù)
        //返回值:當(dāng)前客戶端待讀的字節(jié)數(shù),如果該數(shù)據(jù)0,表示無待讀數(shù)據(jù)
        if(clientList[i]->bytesAvailable() != 0)
        {
            //讀取當(dāng)前客戶端的相關(guān)數(shù)據(jù)
            //函數(shù)原型:QByteArray readAll();
            //功能:讀取當(dāng)前套接字中的所有數(shù)據(jù),并返回一個(gè)字節(jié)數(shù)組
            //返回值:數(shù)據(jù)的字節(jié)數(shù)組
            QByteArray msg = clientList[i]->readAll();

            //將數(shù)據(jù)戰(zhàn)術(shù)到ui界面上
            ui->listWidget->addItem(QString::fromLocal8Bit(msg));

            //將接收到的該消息,發(fā)送給所有客戶端
            for(int j=0; j<clientList.count(); j++)
            {
                clientList[j]->write(msg);
            }
        }
    }

}

所用組件:

QT實(shí)現(xiàn)TCP通信(服務(wù)器與客戶端搭建),QT,服務(wù)器,tcp/ip,網(wǎng)絡(luò)

?三、QT中的客戶端操作

QT實(shí)現(xiàn)TCP通信(服務(wù)器與客戶端搭建),QT,服務(wù)器,tcp/ip,網(wǎng)絡(luò)

  1. 實(shí)例化一個(gè)QTcpSocket類對(duì)象
  2. 調(diào)用該對(duì)象的成員函數(shù)connectToHost連接到服務(wù)器,連接服務(wù)器時(shí),需要給定服務(wù)器的ip地址和端口號(hào)
  3. 如果連接服務(wù)器成功,那么該客戶端就會(huì)自動(dòng)發(fā)送一個(gè)connected信號(hào),我們可以將該信號(hào)連接到自定義槽函數(shù)中處理相關(guān)邏輯
  4. 如果服務(wù)器向客戶端發(fā)來數(shù)據(jù),那么該客戶端就會(huì)自動(dòng)發(fā)射一個(gè)readyRead信號(hào),我們可以將該信號(hào)連接到自定義的槽函數(shù)中處理相關(guān)邏輯
  5. 可以使用read、readLine、readAll讀取客戶端中的數(shù)據(jù)
  6. 可以使用write向服務(wù)器發(fā)送數(shù)據(jù)
  7. 使用成員函數(shù)disConnectFromHost斷開與服務(wù)器的連接
  8. 如果成功斷開與服務(wù)器的連接,那么該套接字就會(huì)自動(dòng)發(fā)射一個(gè)disconn信號(hào)

Client界面代碼:

?系統(tǒng)管理文件:

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

?頭文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_2_clicked();
    void connected_slot();  //自定義處理信號(hào)的槽函數(shù)
    void readyRead_slot();  //自定義處理readyRead信號(hào)的槽函數(shù)
    void disconnected_slot();   //自定義處理disconnected信號(hào)的槽函數(shù)

    void on_pushButton_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::Widget *ui;

    //定義一個(gè)客戶端指針
    QTcpSocket *socket;

    //用戶名
    QString userName;
};
#endif // WIDGET_H

主函數(shù):

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

主要功能函數(shù):

#include "widget.h"
#include "ui_widget.h"

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

    //給客戶端指針實(shí)例化空間
    socket = new QTcpSocket(this);

    //如果連接服務(wù)器成功,該客戶端就會(huì)發(fā)射一個(gè)connected信號(hào)
    //我們可以將該信號(hào)連接到自定義的槽函數(shù)中處理相關(guān)邏輯
    //由于該連接只需要連接一次。所有在構(gòu)造函數(shù)中即可
    connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);

    //客戶端與服務(wù)器連接成功后,如果服務(wù)器向客戶端發(fā)來數(shù)據(jù),那么該客戶端就會(huì)自動(dòng)發(fā)射一個(gè)readyRead信號(hào)
    //我們可以將該信號(hào)連接到自定義槽函數(shù)中處理相關(guān)邏輯
    connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);

    //當(dāng)客戶端與服務(wù)器斷開連接后,該客戶端就會(huì)自動(dòng)發(fā)射1一個(gè)disconnected信號(hào)
    //我們可以將該信號(hào)與自定義的槽函數(shù)連接
    //由于只需要連接一下,所有該連接寫到構(gòu)造函數(shù)即可
    connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
}

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

//連接服務(wù)器按鈕對(duì)應(yīng)的槽函數(shù)
void Widget::on_pushButton_2_clicked()
{
    //獲取UI界面的信息
    userName = ui->lineEdit_2->text();  //獲取用戶名
    QString hostName = ui->lineEdit_3->text();  //獲取主機(jī)地址
    quint16 port = ui->lineEdit_4->text().toUInt();     //獲取端口號(hào)


    //調(diào)用函數(shù)連接到主機(jī)
    //函數(shù)原型:[virtual] void QAbstractSocket::connectToHost(const QString &hostName, quint16 port)
    //參數(shù)1:服務(wù)器的主機(jī)地址
    //參數(shù)2:端口號(hào)
    //返回值:無
    socket->connectToHost(hostName,port);

   
}

//關(guān)于處理connected信號(hào)的槽函數(shù)
void Widget::connected_slot()
{
    QMessageBox::information(this,"成功","連接服務(wù)器成功");

    //順便向服務(wù)器發(fā)送一條消息,說:xxx進(jìn)入聊天室
    QString msg = userName + "進(jìn)入聊天室";

    socket->write(msg.toLocal8Bit());
}

//關(guān)于readyRead信號(hào)對(duì)應(yīng)槽函數(shù)的實(shí)現(xiàn)
void Widget::readyRead_slot()
{
    //讀取該客戶端中的數(shù)據(jù)
    //返回值:QBytearray
    QByteArray msg = socket->readAll();

    //將數(shù)據(jù)展示在UI界面
    ui->listWidget->addItem(QString::fromLocal8Bit(msg));

}


void Widget::on_pushButton_clicked()
{
    //獲取UI界面中的編輯的文本內(nèi)容
    QString m = ui->lineEdit->text();

    //整合要發(fā)送的信息
    QString msg = userName + ": " + m;

    //將消息發(fā)送給服務(wù)器
    socket->write(msg.toLocal8Bit());

    //將消息編輯框中的內(nèi)容清空
    ui->lineEdit->clear();
}


//斷開服務(wù)器按鈕對(duì)應(yīng)的槽函數(shù)
void Widget::on_pushButton_3_clicked()
{
    //準(zhǔn)備要發(fā)送的信息
    QString msg = userName + ": 離開聊天室";
    socket->write(msg.toLocal8Bit());

    //調(diào)用成員函數(shù)disconnectFromHost
    //函數(shù)原型:virtual void disconnectFromHost();
    //功能:斷開服務(wù)器與客戶端的連接
    //參數(shù):無
    //返回值:無
    socket->disconnectFromHost();
}

//disconn信號(hào)對(duì)應(yīng)槽函數(shù)的實(shí)現(xiàn)
void Widget::disconnected_slot()
{
    QMessageBox::information(this, "退出", "斷開成功");
}

?所用組件:

QT實(shí)現(xiàn)TCP通信(服務(wù)器與客戶端搭建),QT,服務(wù)器,tcp/ip,網(wǎng)絡(luò)文章來源地址http://www.zghlxwxcb.cn/news/detail-706991.html

到了這里,關(guān)于QT實(shí)現(xiàn)TCP通信(服務(wù)器與客戶端搭建)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Socket網(wǎng)絡(luò)編程(TCP/IP)實(shí)現(xiàn)服務(wù)器/客戶端通信。

    Socket網(wǎng)絡(luò)編程(TCP/IP)實(shí)現(xiàn)服務(wù)器/客戶端通信。

    一.前言 回顧之前進(jìn)程間通信(無名管道,有名管道,消息隊(duì)列,共享內(nèi)存,信號(hào),信號(hào)量),都是在同一主機(jī)由內(nèi)核來完成的通信。 那不同主機(jī)間該怎么通信呢? 可以使用Socket編程來實(shí)現(xiàn)。 Socket編程可以通過網(wǎng)絡(luò)來實(shí)現(xiàn)實(shí)現(xiàn)不同主機(jī)之間的通訊。 二.Socket編程的網(wǎng)絡(luò)模型如

    2024年02月08日
    瀏覽(36)
  • 網(wǎng)絡(luò)通信(13)-C#TCP服務(wù)器和客戶端同時(shí)在一個(gè)進(jìn)程實(shí)現(xiàn)的實(shí)例

    網(wǎng)絡(luò)通信(13)-C#TCP服務(wù)器和客戶端同時(shí)在一個(gè)進(jìn)程實(shí)現(xiàn)的實(shí)例

    有時(shí)項(xiàng)目需求中需要服務(wù)器和客戶端同時(shí)在一個(gè)進(jìn)程實(shí)現(xiàn),一邊需要現(xiàn)場(chǎng)接收多個(gè)客戶端的數(shù)據(jù),一邊需要將數(shù)據(jù)匯總后發(fā)送給遠(yuǎn)程服務(wù)器。下面通過實(shí)例演示此項(xiàng)需求。 C#TCP服務(wù)器和客戶端同時(shí)在一個(gè)進(jìn)程實(shí)現(xiàn)的實(shí)例如下: 界面設(shè)計(jì) UI文件代碼

    2024年01月22日
    瀏覽(33)
  • S7-200SMART 實(shí)現(xiàn)MODBUS TCP通信的具體方法示例(客戶端讀寫+服務(wù)器響應(yīng))

    S7-200SMART 實(shí)現(xiàn)MODBUS TCP通信的具體方法示例(客戶端讀寫+服務(wù)器響應(yīng))

    前面和大家介紹了MODBUS TCP的基本使用方法,具體可參考以下鏈接中的內(nèi)容: S7-200SMART實(shí)現(xiàn)MODBUS TCP通信(客戶端+服務(wù)器)的具體方法和步驟示例 本次繼續(xù)和大家分享S7-200SMART 中實(shí)現(xiàn)MODBUS TCP通信的具體方法 , 任務(wù)要求:

    2024年02月16日
    瀏覽(51)
  • 網(wǎng)絡(luò)編程3——TCP Socket實(shí)現(xiàn)的客戶端服務(wù)器通信完整代碼(詳細(xì)注釋幫你快速理解)

    網(wǎng)絡(luò)編程3——TCP Socket實(shí)現(xiàn)的客戶端服務(wù)器通信完整代碼(詳細(xì)注釋幫你快速理解)

    本人是一個(gè)剛剛上路的IT新兵,菜鳥!分享一點(diǎn)自己的見解,如果有錯(cuò)誤的地方歡迎各位大佬蒞臨指導(dǎo),如果這篇文章可以幫助到你,勞請(qǐng)大家點(diǎn)贊轉(zhuǎn)發(fā)支持一下! 今天分享的內(nèi)容是TCP流套接字實(shí)現(xiàn)的客戶端與服務(wù)器的通信,一定要理解 DatagramSocket,DatagramPacket 這兩個(gè)類的作用以及方法

    2024年02月12日
    瀏覽(77)
  • 簡(jiǎn)易TCP客戶端和服務(wù)器端通信

    #includeiostream #include winsock2.h ? #include ws2tcpip.h ? #includestdlib.h using namespace std; #define ?BUF_SIZE ?1024 int main() { ? ? cout \\\"客戶端\\\" endl; ? ? //設(shè)置Winsock版本, ? ? WSADATA ? wsaData; ? ? if (WSAStartup(MAKEWORD(2, 2), wsaData) != 0) ? ? { ? ? ? ? cout \\\"error\\\" endl; ? ? ? ? exit(1); ? ? } ? ? //創(chuàng)建通

    2024年04月29日
    瀏覽(23)
  • Qt 服務(wù)器/客戶端TCP通訊

    Qt 服務(wù)器/客戶端TCP通訊

    最近需要用到TCP/IP通訊,這邊就先找個(gè)簡(jiǎn)單的例程學(xué)習(xí)一下。Qt的TCP通訊編程可以使用QtNetwork模塊,QtNetwork模塊提供的類能夠創(chuàng)建基于TCP/IP的客戶端與服務(wù)端應(yīng)用程序,一般會(huì)使用QTcpSocket、QTcpServer類 網(wǎng)絡(luò)通信方式主要有兩種:TCP與UDP。以下拷貝網(wǎng)絡(luò)上總結(jié)兩者之間的區(qū)別:

    2023年04月26日
    瀏覽(18)
  • Java【網(wǎng)絡(luò)編程2】使用 TCP 的 Socket API 實(shí)現(xiàn)客戶端服務(wù)器通信(保姆級(jí)教學(xué), 附代碼)

    Java【網(wǎng)絡(luò)編程2】使用 TCP 的 Socket API 實(shí)現(xiàn)客戶端服務(wù)器通信(保姆級(jí)教學(xué), 附代碼)

    ??各位讀者好, 我是小陳, 這是我的個(gè)人主頁(yè) ??小陳還在持續(xù)努力學(xué)習(xí)編程, 努力通過博客輸出所學(xué)知識(shí) ??如果本篇對(duì)你有幫助, 煩請(qǐng)點(diǎn)贊關(guān)注支持一波, 感激不盡 ?? 希望我的專欄能夠幫助到你: JavaSE基礎(chǔ): 基礎(chǔ)語(yǔ)法, 類和對(duì)象, 封裝繼承多態(tài), 接口, 綜合小練習(xí)圖書管理系統(tǒng)

    2024年02月05日
    瀏覽(33)
  • TCP/IP客戶端和服務(wù)器端建立通信過程

    TCP/IP客戶端和服務(wù)器端建立通信過程

    使用Qt提供的類進(jìn)行基于 TCP 的套接字通信需要用到兩個(gè)類: QTcpServer 類用于監(jiān)聽客戶端連接以及和客戶端建立連接,在使用之前先介紹一下這個(gè)類提供的一些常用API函數(shù): 構(gòu)造函數(shù) 給監(jiān)聽的套接字設(shè)置監(jiān)聽 listen() 函數(shù) 在代碼中 通過啟動(dòng)監(jiān)聽按鈕 設(shè)置監(jiān)聽 參數(shù): address :

    2024年02月07日
    瀏覽(23)
  • Qt多線程TCP服務(wù)器客戶端傳輸文件

    Qt多線程TCP服務(wù)器客戶端傳輸文件

    TCP是面向連接的運(yùn)輸層協(xié)議。應(yīng)用程序在使用TCP協(xié)議之前,必須先建立TCP連接。在傳送數(shù)據(jù)完畢后,必須釋放已經(jīng)建立的TCP連接。 每一條TCP連接只能有兩個(gè)端點(diǎn),每一條TCP連接只能是點(diǎn)對(duì)點(diǎn)的(一對(duì)一)。 TCP提供可靠交付的服務(wù)。通過TCP 連接傳送的數(shù)據(jù),無差錯(cuò)、不丟失、不

    2024年02月13日
    瀏覽(17)
  • Linux下TCP網(wǎng)絡(luò)服務(wù)器與客戶端通信程序入門

    Linux下TCP網(wǎng)絡(luò)服務(wù)器與客戶端通信程序入門

    實(shí)現(xiàn)客戶端連接服務(wù)器,通過終端窗口發(fā)送信息給服務(wù)器端,服務(wù)器接收到信息后對(duì)信息數(shù)據(jù)進(jìn)行回傳,客戶端讀取回傳信息并返回。 服務(wù)器當(dāng)前IP地址要知道 建立socket 綁定本地IP地址并設(shè)置端口號(hào) 知道服務(wù)器的IP地址和端口號(hào) 然后進(jìn)行連接

    2024年02月14日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包