tcp的简单使用实例一

话不多说,直接上自己写的一个tcp小程序,分为客户端和服务端两个程序,实现了单一方向的数据传输。下面来看具体的代码:
先看客户端的程序。创建基于Qt Widgets Application
的应用程序,选择基类QDialog,修改类名为myClient。创建后在.pro文件中添加“QT += network”,保存文件。在.ui文件中拖入控件,布局界面,界面效果如下图所示,再在Client.h和Client.cpp中添加代码。
界面效果如下:
在这里插入图片描述
在这里插入图片描述
客户端的代码:
myClinet.h

#ifndef MYCLIENT_H
#define MYCLIENT_H#include <QDialog>
#include <QAbstractSocket>QT_BEGIN_NAMESPACE
namespace Ui { class myClient; }
QT_END_NAMESPACEclass QTcpSocket;
class QFile;class myClient : public QDialog
{Q_OBJECTpublic:myClient(QWidget *parent = nullptr);~myClient();
private slots:void openFile();void send();void startTransfer();void updateClientProgress(qint64);void displayError(QAbstractSocket::SocketError);void on_openButton_clicked();void on_sendButton_clicked();private:Ui::myClient *ui;QTcpSocket *tcpClient;QFile *localFile;//要发送的文件qint64 totalBytes;//发送的总字节数qint64 bytesWritten;//已经发送数据的大小qint64 bytesToWrite;//剩余数据的大小qint64 payloadSize;//每次发送数据的大小QString fileName;//保存文件的路径QByteArray outBlock;//存放每次要发送的数据块,缓存区
};
#endif // MYCLIENT_H

myClinet.cpp

#include "myclient.h"
#include "ui_myclient.h"
#include <QtNetwork>
#include <QFileDialog>
#include <QDebug>myClient::myClient(QWidget *parent): QDialog(parent), ui(new Ui::myClient)
{ui->setupUi(this);payloadSize = 64 *1024;//64kb  1kb = 1024btotalBytes =0;bytesWritten = 0;bytesToWrite = 0;tcpClient = new QTcpSocket(this);connect(tcpClient,&QTcpSocket::connected,this,&myClient::startTransfer);connect(tcpClient,&QTcpSocket::bytesWritten,this,&myClient::updateClientProgress);void (QTcpSocket:: *tcpSocketsign)(QAbstractSocket::SocketError) = &QTcpSocket::error;connect(tcpClient,tcpSocketsign,this,&myClient::displayError);ui->sendButton->setEnabled(false);
}myClient::~myClient()
{delete ui;tcpClient->close();
}void myClient::openFile()
{fileName = QFileDialog::getOpenFileName(this);if(!fileName.isEmpty()){ui->sendButton->setEnabled(true);ui->clientStateLabel->setText(tr("打开文件%1成功!").arg(fileName));}
}void myClient::send()
{ui->sendButton->setEnabled(false);bytesWritten = 0;ui->clientStateLabel->setText(tr("连接中....."));tcpClient->connectToHost(ui->hostLineEdit->text(),ui->portLineEdit->text().toInt());
}void myClient::startTransfer()
{localFile = new QFile(fileName);if(!localFile->open(QFile::ReadOnly)){qDebug()<<"client open file error!";return ;}totalBytes = localFile->size();QDataStream sendOut(&outBlock,QIODevice::WriteOnly);sendOut.setVersion(QDataStream::Qt_5_13);QString currentFileName = fileName.right(fileName.size() - fileName.lastIndexOf('/') - 1);sendOut<<qint64(0)<<qint64(0)<<currentFileName;totalBytes += outBlock.size();sendOut.device()->seek(0);sendOut<<totalBytes<<qint64(outBlock.size()-sizeof(qint64)*2);bytesToWrite = totalBytes-tcpClient->write(outBlock);ui->clientStateLabel->setText(tr("已连接"));outBlock.resize(0);
}void myClient::updateClientProgress(qint64 numBytes)
{bytesWritten += (int)numBytes;if(bytesToWrite > 0){outBlock = localFile->read(qMin(bytesToWrite,payloadSize));bytesToWrite -= (int)tcpClient->write(outBlock);outBlock.resize(0);}else{localFile->close();}ui->clientProgressBar->setMaximum(totalBytes);ui->clientProgressBar->setValue(bytesWritten);if(bytesWritten == totalBytes){ui->clientStateLabel->setText(tr("传文件%1成功").arg(fileName));localFile->close();tcpClient->close();}
}void myClient::displayError(QAbstractSocket::SocketError)
{qDebug()<<tcpClient->errorString();tcpClient->close();ui->clientProgressBar->reset();ui->clientStateLabel->setText(tr("客户端就绪"));ui->sendButton->setEnabled(true);
}void myClient::on_openButton_clicked()
{ui->clientProgressBar->reset();ui->clientStateLabel->setText(tr("状态:等待打开文件!"));openFile();
}void myClient::on_sendButton_clicked()
{send();
}

main.cpp中没有改动,所以便不再贴代码。下面用创建客户端的方法,来创建服务端的程序,基类依旧选择QDialog,修改类名为myServer,创建好项目后,在.ui文件中进行界面的实现,在.pro文件中添加“QT += network”,并保存。在myServer.h和myServer.cpp文件中添加代码,完整的代码如下。
myServer.h

#ifndef MYSERVER_H
#define MYSERVER_H#include <QDialog>
#include <QAbstractSocket>
#include <QTcpServer>QT_BEGIN_NAMESPACE
namespace Ui { class myServer; }
QT_END_NAMESPACEclass QTcpSocket;
class QFile;
class myServer : public QDialog
{Q_OBJECTpublic:myServer(QWidget *parent = nullptr);~myServer();
private slots:void start();void acceptConnection();void updateServerProgress();void displayError(QAbstractSocket::SocketError socketError);void on_startButton_clicked();private:Ui::myServer *ui;QTcpServer tcpServer;QTcpSocket *tcpServerConnection;//客户端连接对象qint64 totalBytes;//存放总大小信息qint64 bytesReceived;//接收的字节数qint64 fileNameSize;//文件名大小信息QString fileName;//存放文件名QFile *localFile;//本地文件QByteArray inBlock;//缓存区
};
#endif // MYSERVER_H

myServer.cpp

#include "myserver.h"
#include "ui_myserver.h"
#include <QtNetwork>
#include <QDebug>myServer::myServer(QWidget *parent): QDialog(parent), ui(new Ui::myServer)
{ui->setupUi(this);connect(&tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
}myServer::~myServer()
{delete ui;
}void myServer::start()
{if(!tcpServer.listen(QHostAddress::LocalHost,6666)){qDebug()<<tcpServer.errorString();close();return ;}ui->startButton->setEnabled(false);totalBytes = 0;bytesReceived = 0;fileNameSize = 0;ui->serverStatusLabel->setText(tr("监听"));ui->serverProgressBar->reset();
}void myServer::acceptConnection()
{qDebug()<<"acceptConnection()";tcpServerConnection = tcpServer.nextPendingConnection();connect(tcpServerConnection,SIGNAL(readyRead()),this,SLOT(updateServerProgress()));connect(tcpServerConnection,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));ui->serverStatusLabel->setText(tr("接受连接"));tcpServer.close();
}void myServer::updateServerProgress()
{QDataStream in(tcpServerConnection);in.setVersion(QDataStream::Qt_5_13);if(bytesReceived <= sizeof(qint64)*2){if((tcpServerConnection->bytesAvailable() >= sizeof(qint64)*2)&&fileNameSize  == 0){in >> totalBytes >>fileNameSize;bytesReceived += sizeof(qint64)*2;}if((tcpServerConnection->bytesAvailable() >= fileNameSize)&&fileNameSize != 0){in >>fileName;ui->serverStatusLabel->setText(tr("接收文件%1...").arg(fileName));bytesReceived += fileNameSize;fileName.prepend("./");localFile = new QFile(fileName);if(!localFile->open(QFile::WriteOnly)){qDebug()<<"server:open file error!";return ;}}else{qDebug()<<"没有接收到文件";return ;}}if(bytesReceived < totalBytes){bytesReceived += tcpServerConnection->bytesAvailable();inBlock = tcpServerConnection->readAll();localFile->write(inBlock);inBlock.resize(0);}ui->serverProgressBar->setMaximum(totalBytes);ui->serverProgressBar->setValue(bytesReceived);if(bytesReceived == totalBytes){tcpServerConnection->close();localFile->close();ui->startButton->setEnabled(true);ui->serverStatusLabel->setText(tr("接收文件%1成功!").arg(fileName));fileName = " ";}
}void myServer::displayError(QAbstractSocket::SocketError socketError)
{qDebug()<<tcpServerConnection->errorString();tcpServerConnection->close();ui->serverProgressBar->reset();ui->serverStatusLabel->setText(tr("服务端就绪"));ui->startButton->setEnabled(true);
}void myServer::on_startButton_clicked()
{start();
}

现在可以编译运行了,先启动服务端程序,然后点击监听按钮,再启动客户端的程序,由于本程序实现的是本机的通信,所以客户端的主机名或IP这一栏中可以输入localhost或者127.0.0.1,端口为6666,程序中有些,点击打开按钮,弹出文件选择框,选择要传输的文件,像txt,png,jpg,doc,pdf等都可以传输,选好文件后,点击发送按钮,此时会在服务端和客户端显示传输的进度。
当然这只是一个非常简单的程序,对于刚入手的小白希望有所帮助,另外,在.ui文件中实现界面的时候,lineEdit的背景提示文本,需要在属性一栏中设置placeholderText的文本。此文可能是我在QtCreate快速入门一书中看到的,具体记不清了,留以记载,以备后用。

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

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

相关文章

英特尔强势上新一大波数据产品,小伙伴们“奔走相告”…… | 极客头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;刘晶晶近日&#xff0c;英特尔推出了一款创新产品组合&#xff0c;点…

Qt中Tcp通信的简单使用二

tcp编程中写的一个简单的单项传输数据的小例子&#xff0c;和上一节一样&#xff0c;分为客户端和服务端程序&#xff0c;下面看一下界面的效果。 创建的方法和之前一样&#xff0c;上面上代码&#xff1a; 客户端 Client.h #ifndef CLIENT_H #define CLIENT_H#include <…

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…

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;说是缺少一个视频解码器。造成的现…