基于QT和websocket协议的多线程文件传输
一、目的与要求
-
做两个程序,实现文件收发
-
发送端放两个按钮,点击后打开电脑目录选择所要传输的文件,选好以后,把文件名和路径显示在界面上,点击第二个按钮,把文件传到远程机器(或者虚拟机)上由接收端接收
-
编写一接收端,把文件接收下来,存进指定的某个目录里
-
要能测试通过三个发送端同时发100M的文件,接收端能分别接收
-
使用多线程实现
二、工具/准备工作
-
Qt开发环境
-
websocket传输协议库
-
Win10_x64
三、分析
UI界面设计,使用qtdesigner工具,设计界面如下:
Server端
Client端
多线程实现
Qt中提供了创建线程的基类,并且新创建dialog默认为多线程,利用此特性,可以实现通过创建多个dialog从而实现多个client与服务器同时传输文件。
文件传输协议
使用Websocket协议,实现客户端与服务端的长连接,并且可以双方相互主动推送文本消息或文件流。
四、实现步骤
-
创建项目
-
编写客户端主线程程序,为按钮添加创建窗口消息相应事件
- 子线程程序
- 文件传输协议代码
```c++ / * * * * * * * * * * * * * * * * * * * * * * ****/
include "sslechoclient.h"
include
include
include
include
include
include
include
include
include
include
include
include
using namespace std;
QT_USE_NAMESPACE
//! [constructor]
SslEchoClient::SslEchoClient(const QUrl &url, QObject
parent) : QObject(parent)
{
ssl_dia.show();
QCoreApplication::processEvents();
connect(&m_webSocket, &QWebSocket::connected, this, &SslEchoClient::onConnected);
typedef void (QWebSocket::
sslErrorsSignal)(const QList
void SslEchoClient::onConnected() { m_webSocket.sendTextMessage(QStringLiteral("Hello, world! Server,I'am client!")); connect(&m_webSocket, &QWebSocket::textMessageReceived, this, &SslEchoClient::onTextMessageReceived); connect(ssl_dia.m_pushButton, &QPushButton::clicked,this, &SslEchoClient::sendMessage); connect(ssl_dia.m_pushButton_2, &QPushButton::clicked,this, &SslEchoClient::sendFile);
}
void SslEchoClient::onTextMessageReceived(QString message) { ssl_dia.m_textEdit->setPlainText(message); }
void SslEchoClient::onSslErrors(const QList
// WARNING: Never ignore SSL errors in production code.
// The proper way to handle self-signed certificates is to add a custom root
// to the CA store.
qDebug() << "ssl Error!";
m_webSocket.ignoreSslErrors();
}
void SslEchoClient::sendMessage() { QString message = ssl_dia.m_textEdit->toPlainText(); m_webSocket.sendTextMessage(message); }
void SslEchoClient::sendFile() { try{ QString path = QFileDialog::getOpenFileName(&ssl_dia, tr("Select File To Send"),".",tr("File(*)")); if(path.length()<1) return; QFileInfo info(path); QString file_name = info.fileName(); //文件发送消息标记协议 m_webSocket.sendTextMessage("f:" + file_name); QFile file(path); if(!file.open(QIODevice::ReadOnly)) { qDebug() << "Can't open file for writing"; return; } // out.setVersion(QDataStream::Qt_5_8); qDebug() << "read"; QByteArray byte = file.readAll(); m_webSocket.sendBinaryMessage(byte); qDebug() << "send"; file.close(); }catch(exception e){ e.what(); } } ```
- 服务端消息发送预处理程序
```c++ / * * * * * * * ** * * * * * * * /
include "sslechoclient.h"
include
include
include
include
include
include
include
include
include
include
include
include
using namespace std;
QT_USE_NAMESPACE
//! [constructor]
SslEchoClient::SslEchoClient(const QUrl &url, QObject
parent) : QObject(parent)
{
ssl_dia.show();
QCoreApplication::processEvents();
connect(&m_webSocket, &QWebSocket::connected, this, &SslEchoClient::onConnected);
typedef void (QWebSocket::
sslErrorsSignal)(const QList
void SslEchoClient::onConnected() { m_webSocket.sendTextMessage(QStringLiteral("Hello, world! Server,I'am client!")); connect(&m_webSocket, &QWebSocket::textMessageReceived, this, &SslEchoClient::onTextMessageReceived); connect(ssl_dia.m_pushButton, &QPushButton::clicked,this, &SslEchoClient::sendMessage); connect(ssl_dia.m_pushButton_2, &QPushButton::clicked,this, &SslEchoClient::sendFile);
}
void SslEchoClient::onTextMessageReceived(QString message) { ssl_dia.m_textEdit->setPlainText(message); }
void SslEchoClient::onSslErrors(const QList
// WARNING: Never ignore SSL errors in production code.
// The proper way to handle self-signed certificates is to add a custom root
// to the CA store.
qDebug() << "ssl Error!";
m_webSocket.ignoreSslErrors();
}
void SslEchoClient::sendMessage() { QString message = ssl_dia.m_textEdit->toPlainText(); m_webSocket.sendTextMessage(message); }
void SslEchoClient::sendFile() { try{ QString path = QFileDialog::getOpenFileName(&ssl_dia, tr("Select File To Send"),".",tr("File(*)")); if(path.length()<1) return; QFileInfo info(path); QString file_name = info.fileName(); //文件发送消息标记协议 m_webSocket.sendTextMessage("f:" + file_name); QFile file(path); if(!file.open(QIODevice::ReadOnly)) { qDebug() << "Can't open file for writing"; return; } // out.setVersion(QDataStream::Qt_5_8); qDebug() << "read"; QByteArray byte = file.readAll(); m_webSocket.sendBinaryMessage(byte); qDebug() << "send"; file.close(); }catch(exception e){ e.what(); } } ```
五、测试
服务器窗口
客户端主程序窗口
客户端简历连接后窗口
建立多个线程
选择发送文件
文件发送成功
六、总结
-
熟悉了网络传输协议WEBSOCKET,该协议可以在客户端与服务器之间建立长连接,并且可以双方互发信息,相比于HTTP协议,该协议更适合用于作为如聊天工具、视频直播等数据交互的领域
-
进一步熟悉了QT编程,大一的时候使用过VC编写图形化界面,相比之下,QT更简单高效,并且轻量化,个人更倾向于使用QT编程
参考文献
- 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航)
- 基于QUIC的微服务架构下文件传输服务设计与实现(华南理工大学·蔡承平)
- “Things-Cloud-People”:一个“Web of Things”实现方案(华东师范大学·汤承刚)
- 基于Web的在线交流平台的开发技术研究与应用(燕山大学·卢仕伟)
- 基于Qt的跨平台web服务开发框架(西安电子科技大学·张劲峰)
- 基于.NET技术的企业信息系统分析与集成(华南理工大学·邱璟翀)
- 基于Web的性能测试平台关键技术研究及实现(华南理工大学·曾波)
- 基于SSH架构的Web OA系统的设计与实现(吉林大学·李乐)
- 基于云平台的文件管理系统的设计与测试研究(厦门大学·陈洁瑜)
- 基于Spring技术的大型视频网站后台上传系统的设计与实现(南京大学·徐悦轩)
- 基于Spring技术的大型视频网站后台上传系统的设计与实现(南京大学·徐悦轩)
- 多媒体通讯平台构建及应用研究(大连海事大学·曲智)
- 办公管理系统的设计研究与实现(南昌大学·梅磊)
- 基于Flex框架的Web即时通讯系统的研究与实现(中国海洋大学·刘昭纯)
- 3G网络中基站信息管理系统的设计与实现(北京邮电大学·孔德鲁)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设项目助手 ,原文地址:https://m.bishedaima.com/yuanma/35158.html