最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt實現(xiàn)簡單的TCP通信

 更新時間:2022年08月19日 17:06:38   作者:小劉同學++  
這篇文章主要為大家詳細介紹了Qt實現(xiàn)簡單的TCP通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

這段時間用到了QT的TCP通信,做了初步的學習與嘗試,編寫了一個客戶端和服務器基于窗口通信的小例程。

使用QT的網(wǎng)絡套接字需要.pro文件中加入一句:

QT += network

一、客戶端

1、客戶端的代碼比服務器稍簡單,總的來說,使用QT中的QTcpSocket類與服務器進行通信只需要以下5步:

(1)創(chuàng)建QTcpSocket套接字對象

socket = new QTcpSocket();

(2)使用這個對象連接服務器

socket->connectToHost(IP, port);

(3)使用write函數(shù)向服務器發(fā)送數(shù)據(jù)

socket->write(data);

(4)當socket接收緩沖區(qū)有新數(shù)據(jù)到來時,會發(fā)出readRead()信號,因此為該信號添加槽函數(shù)以讀取數(shù)據(jù)

QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
??
?void MainWindow::socket_Read_Data()
?{
? ? ?QByteArray buffer;
? ? ?//讀取緩沖區(qū)數(shù)據(jù)
? ? ?buffer = socket->readAll();
?}

(5)斷開與服務器的連接(關于close()和disconnectFromHost()的區(qū)別,可以按F1看幫助)

socket->disconnectFromHost();

2、以下是客戶端的例程

首先是mainwindow.h文件:

?//mainwindow.h
?#ifndef MAINWINDOW_H
?#define MAINWINDOW_H
??
?#include <QMainWindow>
?#include <QTcpSocket>
??
?namespace Ui {
?class MainWindow;
?}
??
?class MainWindow : public QMainWindow
?{
? ? ?Q_OBJECT
??
?public:
? ? ?explicit MainWindow(QWidget *parent = 0);
? ? ?~MainWindow();
??
?private slots:
??
? ? ?void on_pushButton_Connect_clicked();
??
? ? ?void on_pushButton_Send_clicked();
??
? ? ?void socket_Read_Data();
??
? ? ?void socket_Disconnected();
??
?private:
? ? ?Ui::MainWindow *ui;
? ? ?QTcpSocket *socket;
?};
??
#endif // MAINWINDOW_H

然后是mainwindow.cpp文件:

//mainwindow.cpp
?#include "mainwindow.h"
?#include "ui_mainwindow.h"
??
?MainWindow::MainWindow(QWidget *parent) :
? ? ?QMainWindow(parent),
? ? ?ui(new Ui::MainWindow)
?{
? ? ?ui->setupUi(this);
??
? ? ?socket = new QTcpSocket();
??
? ? ?//連接信號槽
? ? ?QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
? ? ?QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);
??
? ? ?ui->pushButton_Send->setEnabled(false);
? ? ?ui->lineEdit_IP->setText("127.0.0.1");
? ? ?ui->lineEdit_Port->setText("8765");
??
?}
??
?MainWindow::~MainWindow()
?{
? ? ?delete this->socket;
? ? ?delete ui;
?}
??
?void MainWindow::on_pushButton_Connect_clicked()
?{
? ? ?if(ui->pushButton_Connect->text() == tr("連接"))
? ? ?{
? ? ? ? ?QString IP;
? ? ? ? ?int port;
??
? ? ? ? ?//獲取IP地址
? ? ? ? ?IP = ui->lineEdit_IP->text();
? ? ? ? ?//獲取端口號
? ? ? ? ?port = ui->lineEdit_Port->text().toInt();
??
? ? ? ? ?//取消已有的連接
? ? ? ? ?socket->abort();
? ? ? ? ?//連接服務器
? ? ? ? ?socket->connectToHost(IP, port);
??
? ? ? ? ?//等待連接成功
? ? ? ? ?if(!socket->waitForConnected(30000))
? ? ? ? ?{
? ? ? ? ? ? ?qDebug() << "Connection failed!";
? ? ? ? ? ? ?return;
? ? ? ? ?}
? ? ? ? ?qDebug() << "Connect successfully!";
??
? ? ? ? ?//發(fā)送按鍵使能
? ? ? ? ?ui->pushButton_Send->setEnabled(true);
? ? ? ? ?//修改按鍵文字
? ? ? ? ?ui->pushButton_Connect->setText("斷開連接");
? ? ?}
? ? ?else
? ? ?{
? ? ? ? ?//斷開連接
? ? ? ? ?socket->disconnectFromHost();
? ? ? ? ?//修改按鍵文字
? ? ? ? ?ui->pushButton_Connect->setText("連接");
? ? ? ? ?ui->pushButton_Send->setEnabled(false);
? ? ?}
?}
??
?void MainWindow::on_pushButton_Send_clicked()
?{
? ? ?qDebug() << "Send: " << ui->textEdit_Send->toPlainText();
? ? ? //獲取文本框內(nèi)容并以ASCII碼形式發(fā)送
? ? ?socket->write(ui->textEdit_Send->toPlainText().toLatin1());
? ? ?socket->flush();
?}
??
?void MainWindow::socket_Read_Data()
?{
? ? ?QByteArray buffer;
? ? ?//讀取緩沖區(qū)數(shù)據(jù)
? ? ?buffer = socket->readAll();
? ? ?if(!buffer.isEmpty())
? ? ?{
? ? ? ? ?QString str = ui->textEdit_Recv->toPlainText();
? ? ? ? ?str+=tr(buffer);
? ? ? ? ?//刷新顯示
? ? ? ? ?ui->textEdit_Recv->setText(str);
? ? ?}
?}
??
?void MainWindow::socket_Disconnected()
?{
? ? ?//發(fā)送按鍵失能
? ? ?ui->pushButton_Send->setEnabled(false);
? ? ?//修改按鍵文字
? ? ?ui->pushButton_Connect->setText("連接");
? ? ?qDebug() << "Disconnected!";
?}

最后是ui的設計:

二、服務器

1、服務器除了使用到了QTcpSocket類,還需要用到QTcpSever類。即便如此,也只是比客戶端復雜一點點,用到了6個步驟:

(1)創(chuàng)建QTcpSever對象

server = new QTcpServer();

(2)偵聽一個端口,使得客戶端可以使用這個端口訪問服務器

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

(3)當服務器被客戶端訪問時,會發(fā)出newConnection()信號,因此為該信號添加槽函數(shù),并用一個QTcpSocket對象接受客戶端訪問

?connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);
??
?void MainWindow::server_New_Connect()
?{
? ? ?//獲取客戶端連接
? ? ?socket = server->nextPendingConnection();
?}

(4)使用socket的write函數(shù)向客戶端發(fā)送數(shù)據(jù)

socket->write(data);

(5)當socket接收緩沖區(qū)有新數(shù)據(jù)到來時,會發(fā)出readRead()信號,因此為該信號添加槽函數(shù)以讀取數(shù)據(jù)

?QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
??
?void MainWindow::socket_Read_Data()
?{
? ? ?QByteArray buffer;
? ? ?//讀取緩沖區(qū)數(shù)據(jù)
? ? ?buffer = socket->readAll();
?}

(6)取消偵聽

server->close();

2、以下是服務器的例程

首先是mainwindow.h文件:

//mainwindow.h
?#ifndef MAINWINDOW_H
?#define MAINWINDOW_H
??
?#include <QMainWindow>
?#include <QTcpServer>
?#include <QTcpSocket>
??
?namespace Ui {
?class MainWindow;
?}
??
?class MainWindow : public QMainWindow
?{
? ? ?Q_OBJECT
??
?public:
? ? ?explicit MainWindow(QWidget *parent = 0);
? ? ?~MainWindow();
??
?private slots:
? ? ?void on_pushButton_Listen_clicked();
??
? ? ?void on_pushButton_Send_clicked();
??
? ? ?void server_New_Connect();
??
? ? ?void socket_Read_Data();
??
? ? ?void socket_Disconnected();
??
?private:
? ? ?Ui::MainWindow *ui;
? ? ?QTcpServer* server;
? ? ?QTcpSocket* socket;
?};

#endif // MAINWINDOW_H

然后是mainwindow.cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
??
?MainWindow::MainWindow(QWidget *parent) :
? ? ?QMainWindow(parent),
? ? ?ui(new Ui::MainWindow)
?{
? ? ?ui->setupUi(this);
??
? ? ?ui->lineEdit_Port->setText("8765");
? ? ?ui->pushButton_Send->setEnabled(false);
??
? ? ?server = new QTcpServer();
??
? ? ?//連接信號槽
? ? ?connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);
?}
??
?MainWindow::~MainWindow()
?{
? ? ?server->close();
? ? ?server->deleteLater();
? ? ?delete ui;
?}
??
?void MainWindow::on_pushButton_Listen_clicked()
?{
? ? ?if(ui->pushButton_Listen->text() == tr("偵聽"))
? ? ?{
? ? ? ? ?//從輸入框獲取端口號
? ? ? ? ?int port = ui->lineEdit_Port->text().toInt();
??
? ? ? ? ?//監(jiān)聽指定的端口
? ? ? ? ?if(!server->listen(QHostAddress::Any, port))
? ? ? ? ?{
? ? ? ? ? ? ?//若出錯,則輸出錯誤信息
? ? ? ? ? ? ?qDebug()<<server->errorString();
? ? ? ? ? ? ?return;
? ? ? ? ?}
? ? ? ? ?//修改按鍵文字
? ? ? ? ?ui->pushButton_Listen->setText("取消偵聽");
? ? ? ? ?qDebug()<< "Listen succeessfully!";
? ? ?}
? ? ?else
? ? ?{
?/*
? ? ? ? ?//如果正在連接(點擊偵聽后立即取消偵聽,若socket沒有指定對象會有異常,應修正——2017.9.30)
? ? ? ? ?if(socket->state() == QAbstractSocket::ConnectedState)
? ? ? ? ?{
? ? ? ? ? ? ?//關閉連接
? ? ? ? ? ? ?socket->disconnectFromHost();
? ? ? ? ?}
?*/
? ? ? ? ?socket->abort();
? ? ? ? ?//取消偵聽
? ? ? ? ?server->close();
? ? ? ? ?//修改按鍵文字
? ? ? ? ?ui->pushButton_Listen->setText("偵聽");
? ? ? ? ?//發(fā)送按鍵失能
? ? ? ? ?ui->pushButton_Send->setEnabled(false);
? ? ?}
??
?}
??
?void MainWindow::on_pushButton_Send_clicked()
?{
? ? ?qDebug() << "Send: " << ui->textEdit_Send->toPlainText();
? ? ?//獲取文本框內(nèi)容并以ASCII碼形式發(fā)送
? ? ?socket->write(ui->textEdit_Send->toPlainText().toLatin1());
? ? ?socket->flush();
?}
??
?void MainWindow::server_New_Connect()
?{
? ? ?//獲取客戶端連接
? ? ?socket = server->nextPendingConnection();
? ? ?//連接QTcpSocket的信號槽,以讀取新數(shù)據(jù)
? ? ?QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
? ? ?QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);
? ? ?//發(fā)送按鍵使能
? ? ?ui->pushButton_Send->setEnabled(true);
??
? ? ?qDebug() << "A Client connect!";
?}
??
?void MainWindow::socket_Read_Data()
?{
? ? ?QByteArray buffer;
? ? ?//讀取緩沖區(qū)數(shù)據(jù)
? ? ?buffer = socket->readAll();
? ? ?if(!buffer.isEmpty())
? ? ?{
? ? ? ? ?QString str = ui->textEdit_Recv->toPlainText();
? ? ? ? ?str+=tr(buffer);
? ? ? ? ?//刷新顯示
? ? ? ? ?ui->textEdit_Recv->setText(str);
? ? ?}
?}
??
?void MainWindow::socket_Disconnected()
?{
? ? ?//發(fā)送按鍵失能
? ? ?ui->pushButton_Send->setEnabled(false);
? ? ?qDebug() << "Disconnected!";
?}

最后是ui的設計:

三、運行結果

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 深入理解c++指針的指針和指針的引用

    深入理解c++指針的指針和指針的引用

    下面小編就為大家?guī)硪黄钊肜斫鈉++指針的指針和指針的引用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-06-06
  • C語言實現(xiàn)簡單貪吃蛇小游戲

    C語言實現(xiàn)簡單貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C語言實現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷詳解

    C語言實現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷詳解

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++俄羅斯方塊游戲 無需圖形庫的俄羅斯方塊

    C++俄羅斯方塊游戲 無需圖形庫的俄羅斯方塊

    這篇文章主要為大家詳細介紹了無需圖形庫的C++俄羅斯方塊游戲,重溫經(jīng)典游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 淺談C++STL之雙端隊列容器

    淺談C++STL之雙端隊列容器

    deque雙端隊列容器與vector很類似,采用線性表順序存儲結構。但與vector區(qū)別,deque采用分塊的線性存儲結構來存儲數(shù)據(jù),每塊的大小一般為512B,將之稱為deque塊,所有的deque塊使用一個map塊進行管理,每個map數(shù)據(jù)項記錄各個deque塊的首地址。
    2021-06-06
  • C語言遞歸函數(shù)與漢諾塔問題簡明理解

    C語言遞歸函數(shù)與漢諾塔問題簡明理解

    遞歸(recursive)函數(shù)是“自己調(diào)用自己”的函數(shù),無論是采用直接或間接調(diào)用方式。間接遞歸意味著函數(shù)調(diào)用另一個函數(shù)(然后可能又調(diào)用第三個函數(shù)等),最后又調(diào)用第一個函數(shù)。因為函數(shù)不可以一直不停地調(diào)用自己,所以遞歸函數(shù)一定具備結束條件
    2022-07-07
  • C++中的異或運算符^的使用方法

    C++中的異或運算符^的使用方法

    本篇文章對C++中的異或運算符^的使用方法進行的詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 全面解析C++中的析構函數(shù)

    全面解析C++中的析構函數(shù)

    這篇文章主要介紹了C++中的析構函數(shù),為C++入門學習中的基礎知識,需要的朋友可以參考下
    2016-01-01
  • C指針原理教程之語法樹及其實現(xiàn)

    C指針原理教程之語法樹及其實現(xiàn)

    本文給大家分享的是如何使用C語言的指針原來來實現(xiàn)語法樹,并給大家提供了詳細的實例代碼,希望大家能夠喜歡
    2019-02-02
  • C語言動態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解

    C語言動態(tài)內(nèi)存函數(shù)(malloc、calloc、realloc、free)詳解

    在C語言中,動態(tài)內(nèi)存函數(shù)是塊重要的知識點,以往,我們開辟空間都是固定得,數(shù)組編譯結束后就不能繼續(xù)給它開辟空間了,開辟的空間滿了,就不能在開辟空間了,學習本文章,我們就可以解決這個問題,向內(nèi)存申請空間,感興趣的小伙伴跟著小編一起來看看吧
    2023-08-08

最新評論

双峰县| 边坝县| 乡宁县| 威宁| 宝丰县| 南溪县| 会泽县| 通化市| 德保县| 东乡| 溧水县| 丹阳市| 宿松县| 达州市| 尤溪县| 韶关市| 长武县| 玛沁县| 青神县| 平南县| 德格县| 建宁县| 葵青区| 景德镇市| 汝阳县| 鸡东县| 巩留县| 墨玉县| 资兴市| 秭归县| 唐山市| 杭锦后旗| 延安市| 赣榆县| 安顺市| 土默特左旗| 中山市| 江北区| 望江县| 汪清县| 嘉鱼县|