1.说明

使用qt写一个类似网上常见的网络调试工具。此篇为Client端。下一遍再写Server端。

2.基本流程

Client端相对简单:创建QTcpSocket对象,为对象的readyRead,error,connected(可选)分别写槽函数,以处理读数据,错误,连接成功三个事件。

连接使用对象的connectToHost方法,断开使用disconnectFromHost方法。

程序不做编码转换处理,因为之前的几遍文字已经做过,不再赘述。

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")); //默认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 "";
}//读取数据
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) ;}}
}
//发送
void MainWindow::on_btnSend_clicked()
{if(  ui->tedtSend->toPlainText().isEmpty() ){QMessageBox::about(this,tr("提示"),tr("请输入发送数据。")) ;return;}tcpClient ->write( ui->tedtSend->toPlainText().toUtf8() );
}

4.附加修改

使用中发现qt文本框对回车键按“\n”处理,即使是从其他地方粘贴进来也会自动将“\r\n”转为“\n”,这有时非常不方便,比如测试wifi模块的AT命令,还有一些固定格式的网络请求。

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

这里对发送数据进行处理:

//发送
void MainWindow::on_btnSend_clicked()
{if(  ui->tedtSend->toPlainText().isEmpty() ){QMessageBox::about(this,tr("提示"),tr("请输入发送数据。")) ;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() );
}
//计算字节数
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("字节:"),tr("处理前:")+QString::number (len1,10)+tr(",处理后:")+ QString::number (len2,10)) ;
}

为了更加方便使用,添加记忆功能,保持上次的填写的内容:

//读取ini文件对应信息
void MainWindow:: readIni(QString key, QString&value)
{QString path = "save.ini";//创建文件QSettings *config = new QSettings(path, QSettings::IniFormat);//读取信息QVariant variant = config->value(QString("info/") + key);value = variant.value<QString>();delete config;
}//写入ini文件对应信息
void MainWindow::writeIni(QString key, QString value)
{QString path = "save.ini";//创建文件QSettings *config = new QSettings(path, QSettings::IniFormat);QVariant variant;variant.setValue(value);//信息写入文件config->beginGroup("info");config->setValue(key, variant);config->endGroup();delete config;
}

qt:tcp通信工具(Client篇)相关推荐

  1. qt tcp通信_Qt之网络编程TCP通信

    点击上方"Qt学视觉",选择"星标"公众号重磅干货,第一时间送达 想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获 TCP通信概述 TCP(Trans ...

  2. Qt TCP通信(QTcpSocket)

    1. 用法 下面以初始化.连接.写.读.断开连接这几个部分来介绍QTcpSocket的用法. 假设在xxx类实现tcp通信. 初始化 /* 初始化 */ void xxx::init() {m_soc ...

  3. C#.NET 比较好用的tcp通信模板(服务器端篇)

    二话不说,大家先看一下我服务端添加的引用 using System; using System.Collections.Generic; using System.ComponentModel; us ...

  4. Qt TCP通信readAll()读取接收数据时无法读完大数据量的解决法案

    在测试利用TCP传输图片的时候,服务器使用Qt的TCP类库.在TCP接收槽函数中使用readAll()成员函数的时候发现readAll()并不能读取全部的数据,比如,在客户端发送一张2MB的图像,但是 ...

  5. java tcp client断开重连_ESP8266_12 ESP8266客户端模式下的TCP通信

    上一节说了UDP,这一节就聊聊TCP,毕竟它俩经常同时出现.优缺点上一节也提了一下:安全性好,速度慢. 除了这两点,还有就是: TCP通信之前是需要建立连接的,如同打电话之前先拨号一样,而UDP无连接 ...

  6. 基于QT的TCP通信

    一.简介 TCP通信必须先建立TCP链接,通信端分为客户端和服务器端.QT提供了QTcpServer类和QTcpSocket类用于建立TCP通信应用程序.QTcpServer用于端口监听,建立服务器: ...

  7. QT TCP局域网通讯工具 V1.0

    TCP局域网通讯工具 V1.0 局域网 一件发送消息.发送文件软件. 1.实现了发送消息.多台客户端连入服务器均可看到客户端IP地址和内容. 2.实现了客户端给服务器发送文件功能. 本文作者原创,转载 ...

  8. [网络篇]ESP8266-SDK教程(三)之TCP通信Server-Client

    纳尼?昨天刚刚打印了个"Hello World!",今天你就让我学习TCP通信?有没有搞错~哈哈,相信很多读者会很迷,其实学习这东西嘛,单单学一些比较简单的,相信没两天就没人看了, ...

  9. Qt之超简单的TCP通信(自定义TCP通信类,含源码+注释)

    文章目录 一.TCP通信示例图 二.TCP使用前的准备 三.自定义TCP通信类的两种方法 四.源码(含注释) TCP Server CTcpServer.h CTcpServer.cpp TCP Cl ...

最新文章

  1. java中包的_Java中的包
  2. LeetCode Search in Rotated Sorted Array II
  3. VBS转化为exe可执行文件实例演示,vbs转exe工具推荐
  4. 机器学习中一阶段网络是啥_机器学习项目的各个阶段
  5. 发布HTML 7-3
  6. [数学]点、线、面分割问题
  7. NLP事件抽取综述(上中下):中文事件抽取、开放域事件抽取、事件数据生成、跨语言事件抽取、小样本事件抽取、零样本事件抽取等类型
  8. HALCON 21.11:深度学习笔记---模型(8)
  9. UILabel实现自适应宽高需要注意的地方(三)
  10. Exp3免杀原理与实践 20154326杨茜
  11. Review Board的几点使用体会
  12. Codeforces Round #612 (Div. 2) C. Garland题解
  13. python大作业黑白棋_计算概论大作业——黑白棋AI设计
  14. Ubuntu- packages have unmet dependencies问题及修改Ubuntu源
  15. 2014 年最热门的国人开发开源软件 TOP 100 - 开源中国社区
  16. Bundle数据结构和反序列化分析
  17. GO语言开山篇(二):诞生小故事
  18. NWJS(NodeJS)调用打印机 - 打印小票
  19. 一个基于 Docker 的私有云方案
  20. 《信用风险评分卡研究——基于SAS的开发与实施》学习笔记(1)

热门文章

  1. 视频编码(3):H.266 编码性能比 H.265 再提升 49% 的关键丨音视频基础
  2. 【TCAX相关】‍用AvsPmod预览tcas特效字幕
  3. ideaiu快速查找xml插件
  4. linux系统搭建局域网邮件,Linux局域网邮件服务器搭建
  5. pytorch实现lstm分类模型
  6. uniapp 使用在线 iconfont 图标
  7. WPS JS 宏实现表间导入
  8. lssvm回归 matlab,用lssvm做回归预测,预测的结果偏差很大,如何进行参数寻优
  9. Subsonic的使用之基本语法、操作
  10. excel基础图形笔记(柱状图、条形图、折线图、饼图、散点图、箱线图、漏斗图)