Qt中Tcp通信的简单使用二
tcp编程中写的一个简单的单项传输数据的小例子,和上一节一样,分为客户端和服务端程序,下面看一下界面的效果。
创建的方法和之前一样,上面上代码:
客户端
Client.h
#ifndef CLIENT_H
#define CLIENT_H#include <QDialog>
#include <QAbstractSocket>QT_BEGIN_NAMESPACE
namespace Ui { class Client; }
QT_END_NAMESPACE
class QTcpSocket;
class Client : public QDialog
{Q_OBJECTpublic:Client(QWidget *parent = nullptr);~Client();private slots:void displayTip();void errorTip(QAbstractSocket::SocketError);void on_sendButton_clicked();void on_connectButton_clicked(bool checked);void on_textEdit_cursorPositionChanged();private:Ui::Client *ui;QTcpSocket *tcpClient;qint8 flag;
};
#endif // CLIENT_H
Client.cpp
#include "client.h"
#include "ui_client.h"
#include <QtNetwork>
#include <QMessageBox>
#include <QDebug>
/*问题描述
@1 再次输入要发送的文本时,上次发送成功的提示依旧存在;
@2 断开连接后,上次发送成功的提示依旧存在;*/
Client::Client(QWidget *parent): QDialog(parent), ui(new Ui::Client),flag(0)
{ui->setupUi(this);setWindowTitle(tr("客户端"));tcpClient = new QTcpSocket(this);connect(tcpClient,&QTcpSocket::connected,this,&Client::displayTip);void (QTcpSocket:: *errorSign)(QAbstractSocket::SocketError) = &QTcpSocket::error;connect(tcpClient,errorSign,this,&Client::errorTip);ui->connectButton->setText(tr("连接"));ui->statusLabel->setText(tr("未连接"));ui->tipLabel->setText(tr(" "));ui->sendButton->setEnabled(false);
}Client::~Client()
{delete ui;
}void Client::displayTip()
{ui->statusLabel->setText(tr("连接成功"));ui->sendButton->setEnabled(true);
}void Client::errorTip(QAbstractSocket::SocketError)
{qDebug()<<"发生错误:"<<tcpClient->errorString();tcpClient->abort();ui->statusLabel->setText(tr("连接已断开"));ui->tipLabel->setText(tr(" "));ui->connectButton->setText(tr("连接"));flag = 1;// qDebug()<<"flag = 1";
}void Client::on_sendButton_clicked()
{QString str = ui->textEdit->toPlainText();QByteArray text = str.toUtf8();//返回一个字符串的utf-8形式,可以表示所有字符
// QByteArray text = str.toLatin1();//只能输出英文和数字,即拉丁文,汉字会被?代替
// QByteArray text = str.toLocal8Bit();//只能输出英文和数字,汉字会被乱码qint64 bytes = tcpClient->write(text);if(bytes > 0){// qDebug()<<"发送成功!";ui->textEdit->clear();ui->tipLabel->setText(tr("数据发送成功!"));}
}void Client::on_connectButton_clicked(bool checked)
{if(ui->IPLineEdit->text().isEmpty() || ui->portLineEdit->text().isEmpty()){QMessageBox::information(this,tr("警告"),tr("请查看主机名或端口是否已输入"));return ;}if(checked || flag == 1){ui->connectButton->setText(tr("断开连接"));ui->statusLabel->setText(tr("连接中......"));ui->tipLabel->setText(tr(" "));tcpClient->connectToHost(ui->IPLineEdit->text(),ui->portLineEdit->text().toInt());}else{ui->connectButton->setText(tr("连接"));ui->statusLabel->setText(tr("未连接"));ui->tipLabel->setText(tr(" "));
// tcpClient->disconnectFromHost();//等待所有数据传输完成后,关闭套接字
// tcpClient->close();//不会立即关闭套接字tcpClient->abort();//立即关闭套接字}
}void Client::on_textEdit_cursorPositionChanged()
{ui->tipLabel->setText(tr(" "));
}
服务端的程序:
Server.h
#ifndef SERVER_H
#define SERVER_H#include <QDialog>
#include <QAbstractSocket>QT_BEGIN_NAMESPACE
namespace Ui { class Server; }
QT_END_NAMESPACEclass QTcpServer;
class QTcpSocket;class Server : public QDialog
{Q_OBJECTpublic:Server(QWidget *parent = nullptr);~Server();private slots:void dataDisplayTip();void recevieData();void dealData();void errorTip(QAbstractSocket::SocketError);void on_listenButton_clicked();void on_disconnectButton_clicked();private:Ui::Server *ui;QTcpServer * myServer;QTcpSocket *socketConnected;
};
#endif // SERVER_H
Server.cpp
#include "server.h"
#include "ui_server.h"
#include <QtNetwork>
#include <QTimer>
#include <QDebug>/*问题描述
@1 客户端单一方面断开与服务器的连接时,服务器不应该显示为连接异常;
@2 服务器在与客户端连接的过程中,可以选择单方面断开与客户端的连接;
@3 客户端发送中文时,服务端显示乱码;*/Server::Server(QWidget *parent): QDialog(parent), ui(new Ui::Server)
{ui->setupUi(this);myServer = new QTcpServer(this);connect(myServer,&QTcpServer::newConnection,this,&Server::recevieData);
// connect(myServer,&QTcpServer::connected,this,&Server::tipInfo);ui->statusLabel->setText(tr("未建立连接"));ui->RecevieDataLabel->setText(tr(" "));}Server::~Server()
{delete ui;
}void Server::dataDisplayTip()
{ui->RecevieDataLabel->setText(tr(" "));
}void Server::recevieData()
{ui->statusLabel->setText(tr("连接成功"));socketConnected = myServer->nextPendingConnection();connect(socketConnected,&QTcpSocket::readyRead,this,&Server::dealData);void (QTcpSocket:: *errorSign)(QAbstractSocket::SocketError) = &QTcpSocket::error;connect(socketConnected,errorSign,this,&Server::errorTip);myServer->close();
}void Server::dealData()
{if(socketConnected->bytesAvailable()>0){QString str = socketConnected->readAll();//QByteArray dataui->textEdit->append(str);ui->RecevieDataLabel->setText(tr("消息接收完成!"));QTimer *timer = new QTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(dataDisplayTip()));timer->start(2000);}
}void Server::errorTip(QAbstractSocket::SocketError)
{qDebug()<<socketConnected->errorString();ui->listenButton->setEnabled(true);socketConnected->close();myServer->close();ui->statusLabel->setText(tr("连接中断"));ui->RecevieDataLabel->setText(tr(" "));
}void Server::on_listenButton_clicked()
{if(!myServer->listen(QHostAddress::LocalHost,6787)){qDebug()<<"监听失败!";ui->statusLabel->setText(tr("监听失败!"));myServer->close();}ui->statusLabel->setText(tr("监听成功"));ui->RecevieDataLabel->setText(tr(" "));ui->listenButton->setEnabled(false);
}void Server::on_disconnectButton_clicked()
{ui->statusLabel->setText(tr("连接中断"));ui->RecevieDataLabel->setText(tr(" "));ui->listenButton->setEnabled(true);socketConnected->disconnectFromHost();myServer->close();
}
先运行服务端程序,点击监听按钮,再运行客户端程序,输入IP和端口,同样程序之间实现的是本地地址通信,端口6787,主机名或ip都可以,点击连接,若主机名和IP没有填写,直接点击连接,会弹出提示窗口,提示查看IP和端口的填写情况,对话框下面会显示连接状态,连接成功后,输入要发送的内容,点击发送按钮可以发送信息,会有相应的发送和接收数据成功与否的显示。
效果图如下:
该注意的点:
在数据传输的过程中,编码格式的一致,否则会导致乱码,代码中含有我对与一些函数的理解,加以记录,以备后用。
Qt中Tcp通信的简单使用二相关推荐
- Qt中UDP通信的简单示例
udp通信分为发送端和接收端,通信步骤可以分为以下: 接收端: 创建QUdpSocket对象.在.h文件中添加类的前置声明,定义该类的指针,在.cpp的构造函数中定义指向该类的指针. bind().绑 ...
- Qt下Tcp通信的简单使用三
和之前两个例子一样,程序比较简单,刚入门的可以看看,先上效果图. 下面是客户端: myClient.h #ifndef CLIENT_H #define CLIENT_H#include <QD ...
- qint64转为qstring qt_Qt项目中TCP通信的实现方式经验总结(服务端部分)
总第20篇 本文接第19篇,继续梳理TCP通信过程中的重要知识.本文主要系统地讲解通信服务端部分,以供在以后的项目开发过程中参考.如果觉得不错可以关注专栏 面向加薪编程C/C++ ,第一时间接收文章更 ...
- Qt关于Tcp通信步骤的总结
Qt中TCP通信,与C++中tcp通信还是有差别的,下面总结一下Qt中TCP通信. 服务端: 创建QTcpServer对象.可以在构造函数中创建,在.h中声明类QTcpServer,并在类中定义其指针 ...
- QT中TCP文件传输
QT中TCP文件传输 一.UI文件 1.serverwidget.ui 2.clientwidget.ui 二..h文件 1.serverwidget.h 2.clientwidget.h 三.cpp ...
- c++语言 tcp例子,C++中TCP通信实现文件传输
作为Computer networks课程的一个project,我们需要实现用TCP在mininet中client和server的相互通信,需要能够传输文本文件,binary file 和image ...
- qt中socket通信流程图_使用QT实现简单的tcp/ip通信
使用QT实现tcp/ip的通信非常的简单,下面我将直接贴出代码: 一.服务器端 1.头文件#ifndef SERVERWIDGET_H #define SERVERWIDGET_H #include ...
- 基于QT的TCP通信
一.简介 TCP通信必须先建立TCP链接,通信端分为客户端和服务器端.QT提供了QTcpServer类和QTcpSocket类用于建立TCP通信应用程序.QTcpServer用于端口监听,建立服务器: ...
- QT中串口通信程序(转)
(说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三 ...
最新文章
- http协议头信息详解
- 面向对象的5个基本设计原则
- IIS 发布网站到外网
- 知识库问答中的关系识别研究回顾
- Qt Creator使用版本控制系统
- django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
- php 创mysql_PHP MySQL 创建表
- ubuntu18.04安装unity tweak tool
- tuning 02 Diagnostic and Tuning Tools
- pku1063 Flip and Shift严格证明
- 安装vs2008之后系统好像变慢了?
- matlab数字信号处理 王彬 pdf,MATLAB数字信号处理
- php mysqli 字段缺失,mysqli 为什么不提示字段异常
- 取消一个项目git版本控制
- unity3d工程Plugin文件夹笔记
- 公有云、私有云及混合云应用场景辨析
- Mysql 1864 主从错误解决方法
- [导入]中国车牌号的识别
- D-月之暗面(树形dp)
- mysql性能监控 调优_MySQL管理之道:性能调优、高可用与监控(第2版)
热门文章
- 模仿Spring实现一个类管理容器
- 阿里仿真灰度变更测试简介
- 技术干货 | 如何在 Library 中使用/依赖 mPaaS?
- 实时计算无线数据分析
- RocksDB 写入流程详解
- 承担集团数万应用、研发人员日常工作,阿里持续交付平台的设计、迭代之道... 1
- 锐捷发布极简以太全光解决方案 打造“不一样”的全光网
- Hadoop精华问答 | Hadoop 和Spark有什么区别?
- libmysqld_dev linux,解决mysql安装mysqld doesn\'t exist or is not-鸟哥のlinux-ChinaUnix博客
- git 撤销挂起的更改_小姐姐带你用Git