基于QT和websocket协议的多线程文件传输

基于QT和websocket协议的多线程文件传输 一,目的与要求 做两个程序,实现文件收发 发送端放两个按钮,点击后打开电脑目录选择所要传输的文件

本文包含相关资料包-----> 点击直达获取<-------

基于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 &); connect(&m_webSocket, static_cast (&QWebSocket::sslErrors), this, &SslEchoClient::onSslErrors); m_webSocket.open(QUrl(url)); }

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 &errors) { Q_UNUSED(errors);

// 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 &); connect(&m_webSocket, static_cast (&QWebSocket::sslErrors), this, &SslEchoClient::onSslErrors); m_webSocket.open(QUrl(url)); }

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 &errors) { Q_UNUSED(errors);

// 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://bishedaima.com/yuanma/35158.html

相关推荐

发表回复

登录后才能评论