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

Qt基于TCP實現(xiàn)客戶端與服務(wù)端的連接

 更新時間:2022年08月22日 10:50:21   作者:李木木呀~  
這篇文章主要為大家詳細介紹了Qt基于TCP實現(xiàn)客戶端與服務(wù)端的連接,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Qt TCP的客戶端與服務(wù)端的連接,供大家參考,具體內(nèi)容如下

可以實現(xiàn)局域網(wǎng)內(nèi)簡單的信息傳遞(文件傳輸,稍后更新)

界面是用ui設(shè)計師做的簡單設(shè)計

客戶端

(1)、ClientWidget.h 頭文件

#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H

#include <QWidget>
#include "ui_ClientWidget.h"
#include <QTcpSocket>
#include <QHostAddress>
#include <QTextCodec>

class ClientWidget : public QWidget, public Ui::ClientWidget
{
?? ?Q_OBJECT

public:
?? ?ClientWidget(QWidget *parent = 0);
?? ?~ClientWidget();

private slots:
?? ?//連接按鈕
?? ?void onConnectButtonClicked();
?? ?//
?? ?void onTextEditRead();
?? ?//發(fā)送按鈕
?? ?void onButtonSendClicked();

?? ?//獲取對方發(fā)送的內(nèi)容
?? ?void onRecesiveDataFromServer();

?? ?//斷開連接
?? ?void onDisConnect();
private:
?? ?//Ui::ClientWidget ui;
?? ?QTcpSocket *tcpSocket;
};

#endif // CLIENTWIDGET_H

(2)、ClientWidget.cpp文件

#include "stdafx.h"
#include "ClientWidget.h"
#include <QPushButton>


ClientWidget::ClientWidget(QWidget *parent)
?? ?: QWidget(parent)
{
?? ?setupUi(this);
?? ?setWindowTitle(QString::fromWCharArray(L"客戶端"));

?? ?tcpSocket = NULL;

?? ?//分配空間,指定父對象
?? ?tcpSocket = new QTcpSocket(this);

?? ?ButtonDisconnect->setEnabled(false);
?? ?//tcpSocket->abort();

?? ?//發(fā)送與服務(wù)器連接信號
?? ?connect(connectBtn, SIGNAL(clicked()), this, SLOT(onConnectButtonClicked()));
?? ?
?? ?//連接成功后接收到connected信號
?? ?connect(tcpSocket, SIGNAL(connected()), this, SLOT(onTextEditRead()));
?? ?//給服務(wù)器發(fā)送內(nèi)容
?? ?connect(ButtonSend, SIGNAL(clicked()), this, SLOT(onButtonSendClicked()));
?? ?//接收來自服務(wù)器的內(nèi)容,信號readReady
?? ?connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(onRecesiveDataFromServer()));

?? ?connect(ButtonDisconnect, SIGNAL(clicked()), this, SLOT(onDisConnect()));
?? ?
}

ClientWidget::~ClientWidget()
{

}

void ClientWidget::onConnectButtonClicked()
{
?? ?//獲取服務(wù)器IP和端口
?? ?QString ipStr = LineEditIPName->text();
?? ?qint16 portName = LineEditPortName->text().toInt();
?? ?QHostAddress ip = QHostAddress(ipStr);
?? ?//主動和服務(wù)器建立連接
?? ?tcpSocket->connectToHost(ip, portName);
}

void ClientWidget::onTextEditRead()
{
?? ?TextEditRead->setText(QString::fromLocal8Bit("成功和服務(wù)器建立好連接?。?!"));

?? ?connectBtn->setEnabled(false);
?? ?ButtonDisconnect->setEnabled(true);

}

void ClientWidget::onButtonSendClicked()
{
?? ?if (tcpSocket == NULL)
?? ?{
?? ??? ?return;
?? ?}
?? ?//獲取編輯框內(nèi)容
?? ?QString str = TextEditWrite->toPlainText();

?? ?//發(fā)送文本內(nèi)容
?? ?tcpSocket->write(str.toUtf8().data());

?? ?TextEditWrite->clear();
}

void ClientWidget::onRecesiveDataFromServer()
{
?? ?QByteArray arrayAll = tcpSocket->readAll();

?? ?QTextCodec *tc = QTextCodec::codecForName("UTF-8");
?? ?QString str = tc->toUnicode(arrayAll);

?? ?//追加到讀取編輯區(qū)中
?? ?TextEditRead->append(str);
}

void ClientWidget::onDisConnect()
{
?? ?if (tcpSocket == NULL)
?? ?{
?? ??? ?return;
?? ?}

?? ?tcpSocket->disconnectFromHost();

?? ?tcpSocket->close();
?? ?connectBtn->setEnabled(true);

?? ?ButtonDisconnect->setEnabled(false);
?? ?
?? ?TextEditRead->setText(QString::fromLocal8Bit("連接已斷開?。。?));
}

服務(wù)器

(1)、ServerWidget.h文件

#ifndef SERVERWIDGET_H
#define SERVERWIDGET_H

#include <QtGui/QWidget>
#include "ui_ServerWidget.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QString>
#include <QTextCodec>
class ServerWidget : public QWidget
{
?? ?Q_OBJECT?? ?

public:
?? ?ServerWidget(QWidget *parent = 0, Qt::WFlags flags = 0);
?? ?~ServerWidget();
?? ?QTcpServer *tcpServer;
?? ?QTcpSocket *tcpSocket;

private slots:
?? ?void OnConnectTcpServer();?

?? ?void OnSendButtonClicked();

?? ?void OnCloseButtonClicked();

?? ?void OnSeResiveData();

?? ?void OnDisconnected();

private:
?? ?Ui::ServerWidgetClass ui;
};

#endif // SERVERWIDGET_H

(2)、ServerWidget.cpp 文件

#include "stdafx.h"
#include "ServerWidget.h"

ServerWidget::ServerWidget(QWidget *parent, Qt::WFlags flags)
?? ?: QWidget(parent, flags)
{
?? ?ui.setupUi(this);
?? ?tcpServer = NULL;
?? ?tcpSocket = NULL;
?? ?setWindowTitle(QString::fromWCharArray(L"服務(wù)器(端口:8888)"));
?? ?//箭筒套接字,指定父對象,讓其自動回收空間
?? ?tcpServer = new QTcpServer(this);
?? ?//監(jiān)聽并綁定端口
?? ?tcpServer->listen(QHostAddress::Any, 8888);
?? ?
?? ?connect(tcpServer, SIGNAL(newConnection()), this, SLOT(OnConnectTcpServer()));

?? ?connect(ui.sendButton, SIGNAL(clicked()), this, SLOT(OnSendButtonClicked()));

?? ?connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(OnCloseButtonClicked()));

?? ?connect(tcpServer, SIGNAL(disconnected()), this, SLOT(OnDisconnected()));

}

ServerWidget::~ServerWidget()
{
?? ?
}
#include <QDebug>

void ServerWidget::OnConnectTcpServer()
{
?? ?//取出建立好的套接字
?? ?tcpSocket = tcpServer->nextPendingConnection();
?? ?//獲取對方的IP和端口號?
?? ?QString ipStr = tcpSocket->peerAddress().toString();

?? ?qint16 portName = tcpSocket->peerPort();

?? ?QString connectStr = QString::fromLocal8Bit("成功連接");
?? ?
?? ?QString tempStr = QString("[%1 : %2]:" + connectStr).arg(ipStr).arg(portName);

?? ?ui.textRead->setText(tempStr);
?? ??
?? ?connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(OnSeResiveData()));


}

void ServerWidget::OnSendButtonClicked()
{
?? ?if (tcpSocket == NULL)
?? ?{
?? ??? ?return;
?? ?}
?? ?//獲取編輯區(qū)的內(nèi)容
?? ?QString str = ui.textWrite->toPlainText();
?? ?//給對方發(fā)送數(shù)據(jù)。使用套接字是tcpSocket
?? ?tcpSocket->write(str.toUtf8().data());

?? ?ui.textWrite->clear();
}
?
void ServerWidget::OnCloseButtonClicked()
{
?? ?if (tcpSocket == NULL)
?? ?{
?? ??? ?return;
?? ?}

?? ?//主動和客戶端斷開連接
?? ?tcpSocket->disconnectFromHost();
?? ?
?? ?ui.textRead->setText(QString::fromLocal8Bit("連接已斷開?。?!"));

?? ?tcpSocket = NULL;

}

void ServerWidget::OnSeResiveData()
{
?? ?//從通信套接字中取出內(nèi)容
?? ?QByteArray dataAll = ?tcpSocket->readAll();

?? ?QTextCodec *tc = QTextCodec::codecForName("UTF-8");

?? ?QString str = tc->toUnicode(dataAll);

?? ?ui.textRead->append(str);


}

void ServerWidget::OnDisconnected()
{
?? ?ui.textRead->setText(QString::fromLocal8Bit("連接已斷開?。?!"));

}

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

相關(guān)文章

  • C++定時器Timer在項目中的使用方法

    C++定時器Timer在項目中的使用方法

    這篇文章主要給大家介紹了關(guān)于C++定時器Timer在項目中的基本使用方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • 一文詳解如何在VS?Code上搭建C/C++開發(fā)環(huán)境

    一文詳解如何在VS?Code上搭建C/C++開發(fā)環(huán)境

    VSCode是由微軟開發(fā)的一款免費、開源、跨平臺的文本編輯器,它具有許多強大的功能,這篇文章主要給大家介紹了關(guān)于如何在VS?Code上搭建C/C++開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • C語言中static的使用方法實例詳解

    C語言中static的使用方法實例詳解

    static一般用于修飾局部變量,全局變量,函數(shù),下面這篇文章主要給大家介紹了關(guān)于C語言中static用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • C語言中關(guān)于計算字符串長度的幾種方式

    C語言中關(guān)于計算字符串長度的幾種方式

    這篇文章主要介紹了C語言中關(guān)于計算字符串長度的幾種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 利用C語言實現(xiàn)“百馬百擔”問題方法示例

    利用C語言實現(xiàn)“百馬百擔”問題方法示例

    百馬百擔是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語言實現(xiàn)“百馬百擔”問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-12-12
  • c++ 標準庫多線程問題小結(jié)

    c++ 標準庫多線程問題小結(jié)

    C++11 引入了<thread>庫,使得多線程編程更加方便,以下是一些基本概念和示例,幫助你理解如何在 C++ 中進行多線程編程,這篇文章主要介紹了c++ 標準庫多線程,需要的朋友可以參考下
    2025-03-03
  • C語言數(shù)組按協(xié)議存儲與按協(xié)議解析數(shù)據(jù)的實現(xiàn)

    C語言數(shù)組按協(xié)議存儲與按協(xié)議解析數(shù)據(jù)的實現(xiàn)

    今天小編就為大家分享一篇關(guān)于C語言數(shù)組按協(xié)議存儲與按協(xié)議解析數(shù)據(jù)的實現(xiàn),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言實現(xiàn)簡單飛機大戰(zhàn)

    C語言實現(xiàn)簡單飛機大戰(zhàn)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單飛機大戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C及C++中typedef的簡單使用介紹

    C及C++中typedef的簡單使用介紹

    C/C++中關(guān)鍵字typedef的理解不是多透徹,今天小編抽空給大家分享下C及C++中typedef的簡單使用介紹,需要的朋友可以參考下
    2016-10-10
  • MFC設(shè)置對話框焦點的方法簡述

    MFC設(shè)置對話框焦點的方法簡述

    這篇文章主要介紹了MFC設(shè)置對話框焦點的方法簡述,主要講述了兩種實現(xiàn)方法,需要的朋友可以參考下
    2014-10-10

最新評論

海原县| 营口市| 琼结县| 元朗区| 集贤县| 晋州市| 隆林| 定边县| 宁阳县| 曲周县| 从化市| 屯门区| 浦城县| 澄江县| 卓资县| 高州市| 依兰县| 兴山县| 潞西市| 永吉县| 桓台县| 汶川县| 同德县| 鸡东县| 易门县| 靖边县| 娱乐| 伊川县| 博爱县| 辉县市| 广昌县| 长沙县| 民权县| 正镶白旗| 洛宁县| 弋阳县| 阳新县| 乌拉特后旗| 巴林左旗| 黎川县| 商丘市|