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

QT編寫tcp通信工具(Client篇)

 更新時間:2022年08月19日 11:55:43   作者:林子xxx  
這篇文章主要介紹了QT編寫tcp通信工具,適用于Client端,類似網(wǎng)上常見的網(wǎng)絡(luò)調(diào)試工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了QT編寫tcp通信工具的具體實現(xiàn)代碼,Client篇,供大家參考,具體內(nèi)容如下

1.說明

使用qt寫一個類似網(wǎng)上常見的網(wǎng)絡(luò)調(diào)試工具。此篇為Client端。下一遍再寫Server端

2.基本流程

Client端相對簡單:創(chuàng)建QTcpSocket對象,為對象的readyRead,error,connected(可選)分別寫槽函數(shù),以處理讀數(shù)據(jù),錯誤,連接成功三個事件。

連接使用對象的connectToHost方法,斷開使用disconnectFromHost方法。

程序不做編碼轉(zhuǎn)換處理,因為之前的幾遍文字已經(jīng)做過,不再贅述。

3.代碼

這是mainwindow.cpp文件。

#include "mainwindow.h"
#include "ui_mainwindow.h"
?
MainWindow::MainWindow(QWidget *parent) :
? ? QMainWindow(parent),
? ? ui(new Ui::MainWindow)
{
? ? ui->setupUi(this);
? ? ui->splitter->setStretchFactor(0,2);
? ? ui->splitter->setStretchFactor(1,1);
?
? ? QString ip=getLocalip();
? ? if( ip.isEmpty() )
? ? {
? ? ? ? QMessageBox::about(this,tr("提示"),tr("無本地IP。") ) ;
? ? }
? ? else{
? ? ? ? ui->ledtIpLocal->setText( ip ); ? //本地IP
? ? }
? ? ui->labHostName->setText(tr("HostName:")+ QHostInfo::localHostName() );
? ? ui->labHostName->adjustSize();
? ? ui->ledtPortServer->setText(tr("8080")); //默認(rèn)
? ? ui->ledtIpServer->setText (ui->ledtIpLocal->text() );
? ? ui->btnOpen->setEnabled(true);
? ? ui->btnSend->setEnabled(false);
? ? //初始化TCP客戶端
? ? tcpClient = new QTcpSocket(this);
? ? tcpClient->abort();
?
? ? connect(tcpClient, SIGNAL(readyRead()), this, SLOT(slot_readData()) );
? ? connect(tcpClient, SIGNAL(connected()), this, SLOT(slot_connected()) );
? ? connect(tcpClient, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(slot_error(QAbstractSocket::SocketError)));
}
?
MainWindow::~MainWindow()
{
? ? delete ui;
}
//獲取本地IP
QString MainWindow::getLocalip()
{
? ? QList<QHostAddress> list = QNetworkInterface::allAddresses();
? ? foreach (QHostAddress address, list)
? ? {
? ? ? ? if(address.protocol() == QAbstractSocket::IPv4Protocol)
? ? ? ? {
? ? ? ? ? ? return address.toString();
? ? ? ? }
? ? }
? ? return "";
}
?
//讀取數(shù)據(jù)
void MainWindow::slot_readData()
{
? ? QByteArray buffer = tcpClient->readAll();
? ? if(!buffer.isEmpty())
? ? {
? ? ? ? ui->tedtRecive->appendPlainText( buffer );
? ? }
}
//連接成功,也可以在方法waitForConnected后面處理。
void MainWindow::slot_connected()
{
? ? ui->btnOpen->setText("斷開");
? ? ui->btnSend->setEnabled(true);
? ? ui->btnOpen->setEnabled(true);
? ? ui->ledtPortLocal->setText( QString::number(tcpClient->localPort()) );
}
//錯誤處理
void ?MainWindow::slot_error(QAbstractSocket::SocketError)
{
? ? tcpClient->disconnectFromHost();
? ? ui->btnOpen->setText(tr("連接"));
? ? ui->btnOpen->setEnabled(true);
? ? QMessageBox::warning(this,
? ? ? ? tr("注意!"),
? ? ? ? tcpClient->errorString(),
? ? ? ? QMessageBox::Ok ,
? ? ? ? QMessageBox::Ok) ;
}
//連接與斷開
void MainWindow::on_btnOpen_clicked()
{
? ? if(ui->btnOpen->text() == "斷開")
? ? {
? ? ? ? tcpClient->disconnectFromHost();
? ? ? ? if (
? ? ? ? ? ? ? ? tcpClient->state() == QAbstractSocket::UnconnectedState \
? ? ? ? ? ? ? ? ||( ?tcpClient->waitForDisconnected(1000))
? ? ? ? ? ?)
? ? ? ? {
? ? ? ? ? ? ui->btnOpen->setText("連接");
? ? ? ? ? ? ui->btnSend->setEnabled(false);
? ? ? ? }
? ? }else{
? ? ? ? if( ?ui->ledtPortServer->text().toInt() ==0 ){
? ? ? ? ? ? QMessageBox::about(this,tr("提示"),tr("請輸入端口號。") ) ;
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? tcpClient->connectToHost(ui->ledtIpServer->text(), ui->ledtPortServer->text().toInt(),QIODevice::ReadWrite,QAbstractSocket::IPv4Protocol);
? ? ? ? ui->btnOpen->setEnabled(false);
? ? ? ? if( !tcpClient->waitForConnected(4000) ) //只等待4秒
? ? ? ? {
? ? ? ? ? ? tcpClient->disconnectFromHost();
? ? ? ? ? ? ui->btnOpen->setText(tr("連接"));
? ? ? ? ? ? ui->btnOpen->setEnabled(true);
? ? ? ? ? ? QMessageBox::warning(this,
? ? ? ? ? ? ? ? tr("注意!"),
? ? ? ? ? ? ? ? tcpClient->errorString(),
? ? ? ? ? ? ? ? QMessageBox::Ok ,
? ? ? ? ? ? ? ? QMessageBox::Ok) ;
? ? ? ? }
? ? }
}
//發(fā)送
void MainWindow::on_btnSend_clicked()
{
? ? if( ?ui->tedtSend->toPlainText().isEmpty() ){
? ? ? ? QMessageBox::about(this,
? ? ? ? tr("提示"),
? ? ? ? tr("請輸入發(fā)送數(shù)據(jù)。")
? ? ? ?) ;
? ? ? ?return;
? ? }
?
? ? tcpClient ->write( ui->tedtSend->toPlainText().toUtf8() );
}

4.附加修改

使用中發(fā)現(xiàn)qt文本框?qū)剀囨I按“\n”處理,即使是從其他地方粘貼進來也會自動將“\r\n”轉(zhuǎn)為“\n”,這有時非常不方便,比如測試wifi模塊的AT命令,還有一些固定格式的網(wǎng)絡(luò)請求。

先對界面進行修改,添加一些功能物件:

這里對發(fā)送數(shù)據(jù)進行處理:

//發(fā)送
void MainWindow::on_btnSend_clicked()
{
?
? ? if( ?ui->tedtSend->toPlainText().isEmpty() ){
? ? ? ? QMessageBox::about(this,
? ? ? ? tr("提示"),
? ? ? ? tr("請輸入發(fā)送數(shù)據(jù)。")
? ? ? ?) ;
? ? ? ?return;
? ? }
? ? QString str = ui->tedtSend->toPlainText() ;
? ? if( ui->checkBox2->isChecked() )
? ? {
? ? ? ? ?str.replace(tr("\n"),tr("\r\n"));
? ? ? ? ?str.replace(tr("\n\n"),tr("\n"));
? ? }
? ? if( ui->checkBox1->isChecked() )str.append(tr("\r\n"));
? ? tcpClient ->write( str.toUtf8() );
}
//計算字節(jié)數(shù)
void MainWindow::on_btnCalc_clicked()
{
? ? QString str = ui->tedtSend->toPlainText() ;
? ? int len1= str.toUtf8().length();
? ? if( ui->checkBox2->isChecked() )
? ? {
? ? ? ? ?str.replace(tr("\n"),tr("\r\n"));
? ? ? ? ?str.replace(tr("\n\n"),tr("\n"));
? ? }
? ? if( ui->checkBox1->isChecked() )str.append(tr("\r\n"));
?
? ?int len2= str.toUtf8().length();
? ? QMessageBox::about(this,
? ? tr("字節(jié):"),
? ? tr("處理前:")+QString::number (len1,10)+tr(",處理后:")+ QString::number (len2,10)
? ?) ;
}

為了更加方便使用,添加記憶功能,保持上次的填寫的內(nèi)容:

//讀取ini文件對應(yīng)信息
void MainWindow:: readIni(QString key, QString&value)
{
? ? QString path = "save.ini";
? ? //創(chuàng)建文件
? ? QSettings *config = new QSettings(path, QSettings::IniFormat);
? ? //讀取信息
? ? QVariant variant = config->value(QString("info/") + key);
? ? value = variant.value<QString>();
? ? delete config;
}
?
//寫入ini文件對應(yīng)信息
void MainWindow::writeIni(QString key, QString value)
{
? ? QString path = "save.ini";
? ? //創(chuàng)建文件
? ? QSettings *config = new QSettings(path, QSettings::IniFormat);
? ? QVariant variant;
? ? variant.setValue(value);
? ? //信息寫入文件
? ? config->beginGroup("info");
? ? config->setValue(key, variant);
? ? config->endGroup();
? ? delete config;
}

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

相關(guān)文章

  • 一起來看看C語言的預(yù)處理注意點

    一起來看看C語言的預(yù)處理注意點

    這篇文章主要為大家詳細(xì)介紹了C語言的預(yù)處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言實現(xiàn)五子棋人人對戰(zhàn)

    C語言實現(xiàn)五子棋人人對戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)五子棋人人對戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語言實現(xiàn)鏈隊列

    C語言實現(xiàn)鏈隊列

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)鏈隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • C語言數(shù)據(jù)結(jié)構(gòu)實現(xiàn)銀行模擬

    C語言數(shù)據(jù)結(jié)構(gòu)實現(xiàn)銀行模擬

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)實現(xiàn)銀行模擬的相關(guān)資料,通過此文希望大家能理解離散化的方法,希望能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • 減小VC6編譯生成的exe文件的大小的方法

    減小VC6編譯生成的exe文件的大小的方法

    這篇文章主要介紹了減小VC6編譯生成的exe文件的大小的方法,需要的朋友可以參考下
    2015-01-01
  • C語言中函數(shù)的聲明、定義及使用的入門教程

    C語言中函數(shù)的聲明、定義及使用的入門教程

    這篇文章主要介紹了C語言中函數(shù)的聲明、定義及使用的入門教程,重點講述了main函數(shù)的相關(guān)知識,需要的朋友可以參考下
    2015-12-12
  • C語言中的指針 初階

    C語言中的指針 初階

    這篇文章主要介紹的是關(guān)于初級階段學(xué)習(xí)C語言中指針的一些內(nèi)容,那就是指針是什么?簡單的說,就是通過它能找到以它為地址的內(nèi)存單元。下面文章我們就來詳細(xì)介紹該內(nèi)容,需要的朋友可以參考一下
    2021-10-10
  • Vue自定義指令最佳實踐教程分享

    Vue自定義指令最佳實踐教程分享

    Vue?3?顯著增強了自定義指令的功能,使其封裝更加靈活和易用,本文將分為基礎(chǔ)和進階兩部分,介紹如何實現(xiàn)常用的自定義指令,并提供最佳的項目組織方式,需要的朋友可以參考下
    2024-12-12
  • 一文搞懂C++11萬能引用和右值引用

    一文搞懂C++11萬能引用和右值引用

    本文主要介紹了C++11萬能引用和右值引用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 淺談C語言中strcpy,strcmp,strlen,strcat函數(shù)原型

    淺談C語言中strcpy,strcmp,strlen,strcat函數(shù)原型

    下面小編就為大家?guī)硪黄獪\談C語言中strcpy,strcmp,strlen,strcat函數(shù)原型。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論

元阳县| 高尔夫| 三江| SHOW| 阿尔山市| 天津市| 龙泉市| 定南县| 佛学| 乌兰浩特市| 措勤县| 兖州市| 新泰市| 贵溪市| 洛隆县| 连州市| 宜兰市| 四平市| 家居| 班戈县| 长寿区| 灵宝市| 富源县| 武隆县| 东平县| 遵化市| 龙州县| 渝中区| 凭祥市| 成安县| 景谷| 建宁县| 灯塔市| 定结县| 雷山县| 铜川市| 白玉县| 太湖县| 武清区| 北海市| 永兴县|