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和端口的填写情况,对话框下面会显示连接状态,连接成功后,输入要发送的内容,点击发送按钮可以发送信息,会有相应的发送和接收数据成功与否的显示。
效果图如下:
在这里插入图片描述
该注意的点:
在数据传输的过程中,编码格式的一致,否则会导致乱码,代码中含有我对与一些函数的理解,加以记录,以备后用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

atom插件安装方法

Search Atom packages 安装插件前提&#xff1a; 1、安装git 和node.js2、node官网&#xff1a;https://nodejs.org/en/3、下载稳定版 4、安装node.js 详细安装步骤&#xff1a; http://www.runoob.com/nodejs/nodejs-install-setup.html 5、插件搜索官网&#xff1a; https…

Docker精华问答:Docker与虚拟机的区别?| 技术头条

Docker 是个划时代的开源项目&#xff0c;它彻底释放了计算虚拟化的威力&#xff0c;极大提高了应用的维护效率&#xff0c;降低了云计算应用开发的成本&#xff01;使用 Docker&#xff0c;可以让应用的部署、测试和分发都变得前所未有的高效和轻松&#xff01;1Q&#xff1a;…

Qt下Tcp通信的简单使用三

和之前两个例子一样&#xff0c;程序比较简单&#xff0c;刚入门的可以看看&#xff0c;先上效果图。 下面是客户端&#xff1a; myClient.h #ifndef CLIENT_H #define CLIENT_H#include <QDialog>QT_BEGIN_NAMESPACE namespace Ui { class Client; } QT_END_NAMESPAC…

docker创建jdk镜像

前言&#xff1a; 现在有需求要用docker跑java项目&#xff0c;而且有多个项目&#xff0c;所以我的思路是自己搭建一个基于jdk8的基础镜像&#xff0c;后边所有的项目镜像在这个基础上再编译。 将要用到的技术及软件&#xff1a; 编译方式&#xff1a;Dockerfile Linux镜像&am…

44年前的今天,改变世界的TA诞生了! | 极客头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;1975年4月4日&#xff0c;是历史上普通的一天。这一天&#xff0c;有两个人成立…

第二篇:Spring Boot 热部署

文章目录1. 依赖2. 开启实时自动编译3. 开启运行自动编译开关1. 依赖 <!-- 热部署DevTools --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency>2. 开启实时自…

Qt关于Tcp通信步骤的总结

Qt中TCP通信&#xff0c;与C中tcp通信还是有差别的&#xff0c;下面总结一下Qt中TCP通信。 服务端&#xff1a; 创建QTcpServer对象。可以在构造函数中创建&#xff0c;在.h中声明类QTcpServer,并在类中定义其指针变量&#xff1b;监听。使用函数listen()来监听IP和端口&…

Spring Boot 企业实战_前夕

Spring Boot 专栏设置意在实战微服务&#xff0c;依赖统一由父工程进行依赖控制&#xff0c;其他子项目均依赖此工程。 小技巧&#xff1a; Spring Boot 集成周边技术3部曲 1.pom文件引入maven依赖 2.配置文件中配置相关信息 3.启动类上加注解 创建Spring Boot 父工程&#xff…

西门子和阿里云要搞啥事情?| 极客头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;重 磅• 西门子MindShpere成功部署在阿里功云上并开始运营• 信守承诺、按期推…

Qt中UDP通信的简单示例

udp通信分为发送端和接收端&#xff0c;通信步骤可以分为以下&#xff1a; 接收端&#xff1a; 创建QUdpSocket对象。在.h文件中添加类的前置声明&#xff0c;定义该类的指针&#xff0c;在.cpp的构造函数中定义指向该类的指针。bind()。绑定IP和端口。connect()。绑定readyR…

FB接连出事儿?上亿用户记录在亚马逊云服务器上就公之于众了……下滑到第七?领英说苹果怎么就不受雇员欢迎了呢? | 极客头条...

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 销售火…

C/C++ 有 1 、 2 、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

目录 一.结果演示二.源代码三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 面向对象 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 设计模式 零基础 C/C 学习路线推荐 : C/C 学习目录…

第三篇:Spring Boot整合Servlet

一、Springboot整合Servlet 第一种方案&#xff1a; 1、创建一个自定义的servlet&#xff0c;继承HttpServlet添加WebServlet注解 以前ssm中的web.xml配置文件中的servlet> <servlet><servlet-name>FirstServlet</servlet-name><servlet-class>c…

Qt中线程的简单使用

对于线程过去写的比较少&#xff0c;现在也几乎是小白的水平。先创建Qt empty project,即Qt空项目&#xff0c;打开QtCreate->文件->新建文件或项目->其它项目->empty qmke project,接着按提示创建Qt空项目&#xff0c;创建之后&#xff0c;在项目上右键添加新文件…

C/C++ 企业发放的奖金根据利润提成。利润 (i) 低于或等于 10 万元时,奖金可提 10% ;利润高 于 10 万元,低于 20 万元时,低于 10 万元的部分按 10% 提成,高于 10 万元

目录 一.结果演示二.源代码三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 面向对象 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 设计模式 零基础 C/C 学习路线推荐 : C/C 学习目录…

第四篇:Spring Boot 整合listener

一、Spring Boot整合listener 第一种方案&#xff1a;通过注解扫描完成Listener的注册 1.1 编写一个listener WebListener public class FirstListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.pri…

2019年关于VM和Kubernetes的思考 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;转自&#xff1a;开源云中文社区近年来&#xff0c;容器已成为云原生应用程序架构的同义词。它们重新定义了打包、分发、部署和管理应用程序的方式。但是&#xff0c;容器本身就是已有Linux技术的重新兴起&#xff0c;只不过这些技术…

Qt实现界面的窗口的局部动态添加并布局

此程序实现的是点击界面的添加界面按钮&#xff0c;新增加一个窗口&#xff0c;并实现窗口的布局&#xff0c;随着窗口个数的在布局中的增加&#xff0c;窗口大小自动缩小。创建基于QT widget Application的应用程序&#xff0c;选择基类QDialog,去掉Generate form前的勾&#…

第五篇:Spring Boot整合filter

一、Springboot整合Servlet 第一种方案&#xff1a;通过注解扫描完成filter组建的注册 1、编写自定义filter(FirstFilter) //urlPattern是一个数组可以添加多个 //WebFilter(filterName "FirstFilter",urlPatterns {"*.do","*.jsp"}) WebFilt…

C/C++ 一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少?

目录 一.结果演示二.源代码三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 面向对象 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 设计模式 零基础 C/C 学习路线推荐 : C/C 学习目录…