Qt下Tcp通信的简单使用三

和之前两个例子一样,程序比较简单,刚入门的可以看看,先上效果图。
在这里插入图片描述
在这里插入图片描述
下面是客户端:
myClient.h

#ifndef CLIENT_H
#define CLIENT_H#include <QDialog>QT_BEGIN_NAMESPACE
namespace Ui { class Client; }
QT_END_NAMESPACEclass QTcpSocket;
class QTimer;class Client : public QDialog
{Q_OBJECTpublic:Client(QWidget *parent = nullptr);~Client();private slots:void slot_readyRead();void slot_connected();void slot_timeout();//    void slot_disconnected();void slot_error();void on_connectButton_clicked(bool checked);void on_sendButton_clicked();void slot_sendDatatimeout();
//    void on_sendTextEdit_cursorPositionChanged();//    void on_sendTextEdit_textChanged();private:Ui::Client *ui;QTcpSocket *myClient;QTimer *timer;//   qint8 flag;
};
#endif // CLIENT_H

myClent.cpp

#include "client.h"
#include "ui_client.h"
#include <QtNetwork>
#include <QDebug>
#include <QMessageBox>
#include <QTimer>Client::Client(QWidget *parent): QDialog(parent), ui(new Ui::Client)/*,flag(0)*/
{ui->setupUi(this);myClient = new QTcpSocket(this);connect(myClient,&QTcpSocket::readyRead,this,&Client::slot_readyRead);connect(myClient,&QTcpSocket::connected,this,&Client::slot_connected);connect(myClient,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slot_error()));
//    connect(myClient,&QTcpSocket::disconnected,this,&Client::slot_disconnected);ui->sendButton->setEnabled(false);ui->connectStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));ui->sendStatus->setText(tr(" "));timer = new QTimer;connect(timer,&QTimer::timeout,this,&Client::slot_timeout);connect(timer,&QTimer::timeout,this,&Client::slot_sendDatatimeout);
}Client::~Client()
{delete ui;
}void Client::slot_readyRead()
{if(myClient->bytesAvailable() > 0){ui->recevieTextEdit->append(myClient->readAll());ui->receiveStatus->setText(tr("接收服务端的数据完成!!"));//timer->start(2000);}
}void Client::slot_connected()
{ui->connectStatus->setText(tr("连接成功"));ui->sendButton->setEnabled(true);
}void Client::slot_timeout()
{ui->receiveStatus->setText(tr(" "));
}void Client::slot_error()
{qDebug()<<myClient->errorString();ui->connectButton->setText(tr("连接"));ui->connectStatus->setText(tr("连接断开"));ui->sendStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));myClient->close();//同上,都不会立即关闭套接字ui->connectButton->setChecked(false);//之前点击时checked=true,下一次点击时checked=false,//要想使下一次点击时是checked=true,就必须在中间设置一次checked=false
}//void Client::slot_disconnected()
//{
//    ui->connectButton->setText(tr("连接"));
//    ui->connectStatus->setText(tr("连接断开"));
//    ui->sendStatus->setText(tr(" "));
//    ui->receiveStatus->setText(tr(" "));
//    myClient->disconnectFromHost();//等待所有的数据被写完之后,关闭套接字
//    myClient->close();//同上,都不会立即关闭套接字
//    flag = 1;
//}void Client::on_connectButton_clicked(bool checked)//第一次点击时为checked=true,第二次点击时checked=false,依次类推
{if(ui->IPLineEdit->text().isEmpty() || ui->portLineEdit->text().isEmpty()){QMessageBox::information(this,tr("提示"),tr("请查看IP和端口是否输入"));return ;}if(checked){ui->connectButton->setText(tr("断开连接"));ui->connectStatus->setText(tr("连接中......"));myClient->connectToHost(ui->IPLineEdit->text(),ui->portLineEdit->text().toInt());}else{ui->connectButton->setText(tr("连接"));ui->connectStatus->setText(tr("连接断开"));ui->sendStatus->setText(tr(" "));ui->sendButton->setEnabled(false);myClient->close();}
}void Client::on_sendButton_clicked()
{QByteArray text = ui->sendTextEdit->toPlainText().toUtf8();if(text.isEmpty()){QMessageBox::information(this,tr("提示"),tr("请输入要发送的数据"));return ;}qint64 bytes = myClient->write(text);if(bytes > 0){ui->sendTextEdit->clear();ui->sendStatus->setText(tr("发送数据成功!"));timer->start(2000);}else{ui->sendTextEdit->clear();ui->sendStatus->setText(tr("发送数据失败!"));timer->start(2000);}
}void Client::slot_sendDatatimeout()
{ui->sendStatus->setText(tr(" "));
}//void Client::on_sendTextEdit_cursorPositionChanged()
//{
//    ui->sendStatus->setText(tr(" "));
//}//void Client::on_sendTextEdit_textChanged()
//{//    ui->sendStatus->setText(tr(" "));
//}

服务端:
myServer.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 QTimer;class Server : public QDialog
{Q_OBJECTpublic:Server(QWidget *parent = nullptr);~Server();private slots:void slot_newConnect();void slot_readyRead();void slot_error(QAbstractSocket::SocketError);void slot_timeout();void on_listenButton_clicked();void on_disconnectButton_clicked();void on_sendButton_clicked();void slot_sendDatatimeout();//    void on_sendTextEdit_cursorPositionChanged();private:Ui::Server *ui;QTcpServer *myServer;QTcpSocket *socketConnected;QTimer *timer;
};
#endif // SERVER_H

myServer.cpp

#include "server.h"
#include "ui_server.h"
#include <QtNetwork>
#include <QDebug>
#include <QMessageBox>Server::Server(QWidget *parent): QDialog(parent), ui(new Ui::Server)
{ui->setupUi(this);myServer = new QTcpServer(this);connect(myServer,&QTcpServer::newConnection,this,&Server::slot_newConnect);ui->disconnectButton->setEnabled(false);ui->connectStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));ui->sendStatus->setText(tr(" "));timer = new QTimer;connect(timer,&QTimer::timeout,this,&Server::slot_timeout);connect(timer,&QTimer::timeout,this,&Server::slot_sendDatatimeout);
}Server::~Server()
{delete ui;
}void Server::slot_newConnect()
{ui->connectStatus->setText(tr("连接成功"));ui->disconnectButton->setEnabled(true);socketConnected = myServer->nextPendingConnection();connect(socketConnected,SIGNAL(readyRead()),this,SLOT(slot_readyRead()));connect(socketConnected,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(slot_error(QAbstractSocket::SocketError)));myServer->close();
}void Server::slot_readyRead()
{if(socketConnected->bytesAvailable() > 0){ui->receiveTextEdit->append(socketConnected->readAll());ui->receiveStatus->setText(tr("接收数据成功!"));timer->start(2000);}
}void Server::slot_error(QAbstractSocket::SocketError)//在连接过程中,突然被断开,客户端主动断开连接时会调用该函数,服务端自己断开连接,不会调用该函数
{qDebug()<<socketConnected->errorString();ui->connectStatus->setText(tr("连接中断"));ui->receiveStatus->setText(tr(" "));ui->sendStatus->setText(tr(" "));ui->disconnectButton->setEnabled(false);socketConnected->disconnectFromHost();myServer->close();
}void Server::slot_timeout()
{ui->receiveStatus->setText(tr(" "));
}void Server::on_listenButton_clicked()
{if(!myServer->listen(QHostAddress::LocalHost,7878)){qDebug()<<"监听失败!!";ui->connectStatus->setText(tr("监听失败"));}ui->connectStatus->setText(tr("监听成功!!!"));
}void Server::on_disconnectButton_clicked()
{ui->connectStatus->setText(tr("连接断开"));ui->sendStatus->setText(tr(" "));ui->receiveStatus->setText(tr(" "));ui->disconnectButton->setEnabled(false);socketConnected->abort();//立即断开myServer->close();
}void Server::on_sendButton_clicked()
{if(ui->sendTextEdit->toPlainText().isEmpty()){QMessageBox::information(this,tr("提示"),tr("请输入要发送的数据!!"));return ;}qint64 bytes = socketConnected->write(ui->sendTextEdit->toPlainText().toUtf8());if(bytes > 0){ui->sendTextEdit->clear();ui->sendStatus->setText(tr("发送数据成功!!"));timer->start(2000);}else{ui->sendTextEdit->clear();ui->sendStatus->setText(tr("发送数据失败!!"));timer->start(2000);}//ui->sendTextEdit->clear();//为什么在这里的时候达不到先显示数据发送的结构,再将提示小时
}void Server::slot_sendDatatimeout()
{ui->sendStatus->setText(tr(" "));
}//void Server::on_sendTextEdit_cursorPositionChanged()
//{
//    ui->sendStatus->setText(tr(" "));
//}

运行服务端的程序,点击监听按钮,运行客户端,输入IP和端口,IP是本地地址,端口为7878,点击连接按钮,连接成功后,窗口下面均有连接成功的提示,此时可以客户端和服务端之间相互发送消息,也可以在客户端和服务端任意断开连接后重连,窗口消息发送与接收都有是否成功的提示,没有输入IP和端口之前,若点击了连接按钮,会有提示。

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

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

相关文章

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. 开启实时自…

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 销售火…

第三篇:Spring Boot整合Servlet

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

微服务精华问答:什么是微服务架构中的DRY?| 技术头条

微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。 究竟什么是微服务呢?今天就让我们一探究竟。1Q&#xff1a;什么是微服务架构中的DRY&#xff1f;A&#xff1a;DRY代表不要重复自己。它基本上促进了重用代码的概念。这导致开发和…

第六篇:Spring Boot 访问静态资源

Spring Boot的默认静态资源的路径为&#xff1a; spring.resources.static-locationsclasspath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ 优先级从从高到低 一、Spring Boot 访问静态资源有二种方案 第一种方案&#xff08;默认&…

C/C++ 输入某年某月某日,判断这一天是这一年的第几天?

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

QT中DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80040216 ()问题的解决

亲身经历此问题的困惑后&#xff0c;第二次遇到该问题&#xff0c;实在忍不住想把这个解决方法写下来&#xff0c;愿对和我一样遇到该问题的人有所帮助。 至于Qt产生该问题的原因&#xff0c;网上众说纷云&#xff0c;但都是一样的&#xff0c;说是缺少一个视频解码器。造成的现…

成为最大的独立开源公司,对SUSE意味着什么? | 人物志

戳蓝字“CSDN云计算”关注我们哦&#xff01;极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;作者&#xff1a;孙浩峰如果你在科技展会上看到了一只可爱的绿色小蜥蜴&#x…

第七篇:Spring Boot 整合_Thymeleaf 入门试炼 QuickStart

1.1 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId&…

移动场景在其缩略图中显示场景中所显示的区域

需求描述 在场景中实现拖动&#xff0c;缩放&#xff0c;并在场景的缩略图中显示其对应在视口中显示的矩形区域。 程序效果图如下&#xff1a; 开发环境&#xff1a;Qt 5.13.1 编译环境&#xff1a;MinGW64 项目结构&#xff1a; 直接上程序: main.cpp #include "dial…

那些中国式家庭的小烦恼,我看用AI来解决就“都挺好” | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;转自&#xff1a;趣味科技v今天&#xff0c;又是《都挺好》全面承包热搜的一天。自从这…

penGL ES 2.0 和 3.0区别

目录 一.嵌入式设备的 OpenGL ES 版本二.兼容性三.着色器脚本 1.OpenGL ES shader 2.02.OpenGL ES shader 3.03.版本声明4. 默认精度修饰符 precision4.输入输出5.变量赋值 四.关于顶点缓冲区对象 VBO 与顶点数组对象 VAO五.PBO六.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : O…