| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> QT tcp 简单服务端和客户端传输字符串(QDataStream 序列化) -> 正文阅读 |
|
[网络协议]QT tcp 简单服务端和客户端传输字符串(QDataStream 序列化) |
一、服务器端 ? ? ?在服务器端的程序中,我们绑定本地主机的一个端口,例如这里使用6666。 关联newConnection()信号与自己写的NewConnection()槽。一旦有客户端的连接请求,就会执行NewConnection()函数,这个函数的功能就是初始化字符接收长度为0,记录当前连接的客户端,关联接收处理函数等。 //新连接进入处理函数 //数据接收函数 } //发送函数
为了保证在客户端能接收到完整的文件,我们都在数据流的最开始写入完整文件的大小信息,这样客户端就可以根据大小信息来判断是否接受到了完整的文件。而在服务器端,在发送数据时就要首先发送实际文件的大小信息,但是,文件的大小一开始是无法预知的,所以这里先使用了out<<(quint16) 0;在block的开始添加了一个quint16大小的空间,也就是两字节的空间,它用于后面放置文件的大小信息。然后out<<mes;输入字符串。输入完成后我们再使用out.device()->seek(0);返回到block的开始,加入实际的文件大小信息,也就是后面的代码,它是实际文件的大小:out<<(quint16) (block.size() - sizeof(quint16)); void Widget::on_sendButton_clicked() { ??? // 关联按钮 执行发送数据 ??? sendMessage(); } 5.这样服务器的程序就完成了,可以先运行一下程序。 二、客户端 我们在客户端程序中向服务器发送连接请求,当连接成功时接收服务器发送的数据。 步骤1:新建Qt Gui应用, 项目名tcpClient,基类选择QWidget,类名为Widget。完成后打开项目文件tcpClient.pro并添加一行代码:QT += network ,然后保存该文件。 步骤2:我们在widget.ui中添加几个标签Label和两个Line Edit(设置主机ip机端口号)以及2个按钮Push Button,两个textedit 用于接收和发送数据。 其中“主机”后的LineEdit的objectName为hostEdit,“端口号”后的为portEdit。 “收到的信息”textedit的objectName为recedit?。 步骤3:在widget.h文件中做更改。 添加头文件:#include?<QtNetwork> 添加private变量: QTcpSocket *tcpSocket; QString message;? //存放从服务器接收到的字符串 quint16? blockSize; //存放文件的大小信息 //添加私有槽: private?slots: void newConnect(); //连接服务器 void readData();? //接收数据 void sendData();//发送数据 void on_conBtn_clicked(); void on_sendbtn_clicked(); 步骤4:在widget.cpp文件中做更改。 (1)在构造函数中添加代码: tcpSocket = new QTcpSocket(this); connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readData())); 这里关联了tcpSocket的信号,当有数据到来时发出readyRead()信号,我们执行读取数据的readDate()函数 (2)实现newConnect()函数。 void?Widget::newConnect() {
??? tcpSocket->abort(); //取消已有的连接 ??? //连接到主机,这里从界面获取主机地址和端口号 ??? tcpSocket->connectToHost(ui->hostEdit->text(), ui->portEdit->text().toInt());} 这个函数实现了连接到服务器,下面会在“连接”按钮的单击事件槽函数中调用这个函数。 (3)实现readData()函数。 void Widget::readData() { ??? QDataStream in(tcpSocket); ??? in.setVersion(QDataStream::Qt_5_8); ??? //设置数据流版本,这里要和服务器端相同 ??? if(blockSize==0) //如果是刚开始接收数据 ????? { ???????? //判断接收的数据是否有两字节,也就是文件的大小信息 ???????? //如果有则保存到blockSize变量中,没有则返回,继续接收数据 ???????? if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return; ???????? in >> blockSize; ????? } ??? if(tcpSocket->bytesAvailable() < blockSize) return; ???? //如果没有得到全部的数据,则返回,继续接收数据 ??? in >> message; ???? //将接收到的数据存放到变量中 ??? ui->recEdit->append(message); ?? // ui->recEdit->setText(message); ??? //重新初始化 ??? blockSize = 0; //重新设置其为0 ??? //显示接收到的数据 } 这个函数实现了数据的接收,它与服务器端的发送函数相对应。首先我们要获取文件的大小信息,然后根据文件的大小来判断是否接收到了完整的文件。 (5)我们在widget.ui中进入“连接”按钮的单击事件槽函数,然后更改如下。 void?Widget::on_pushButton_clicked() //连接按钮 { ? ??newConnect(); //请求连接 } 这里直接调用了newConnect()函数。 //发送函数 void Widget::sendData() { ??? QString mes; ??? mes=ui->sendEdit->toPlainText(); ??? //用于暂存我们要发送的数据 ???? QByteArray block; ??? //使用数据流写入数据 ???? QDataStream out(&block,QIODevice::WriteOnly); ???? //设置数据流的版本,客户端和服务器端使用的版本要相同 ???? out.setVersion(QDataStream::Qt_5_8); ???? out<<(quint16) 0; ???? out<<mes; ???? out.device()->seek(0); ???? out<<(quint16) (block.size() - sizeof(quint16)); ???? tcpSocket->write(block); } 关联按钮 void Widget::on_sendbtn_clicked() { ? sendData(); } 5.我们运行程序,同时运行服务器程序,然后在“主机”后填入“127.0.0.1”,在“端口号”后填入“6666”,点击“连接”按钮,即可发送和接收消息 源码下载: |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:33:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |