一.前言
楼主在Qt笔记(三十五)之QWebSocket简单使用(1)-实现服务端
以及Qt笔记(三十六)之QWebSocket简单使用(2)-实现客户端
实现了简单是消息发送,既然可以传输消息,那么传输文件可以不,答案是肯定的,于是楼主就QWebSocket简单的传输文件做一个记录分享
二.实现过程
1.总体思路:
客户端发送文件名,给服务端做记录,然后再发送文本的二进制流,服务端收到文件名,做一个记录,接收到二进制流,再写入文件名保存即可
2.客户端实现,发送逻辑
void ClientWidget::on_pushButton_4_clicked()
{
qDebug()<<"选择文件,并发送";
QString sendFile = QFileDialog::getOpenFileName(this,QStringLiteral("选择发送文件"),"C://","TEXT(*.txt)");
if(sendFile.isEmpty())
return;
// 先发送文件名,可以先裁剪剩下文件名,楼主为了方便,直接发送文件路径
webSocket.sendTextMessage("send_file_name:"+sendFile);
// 发送文件内容
QFile file(sendFile);
if(!file.open(QIODevice::ReadOnly))
return;
QByteArray data = file.readAll();
webSocket.sendBinaryMessage(data);
file.close();
}
3.服务端实现
3.1绑定两个信号槽,分别用来接收文件名以及文本二进制流
// 单纯文本
connect(webSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(onTextMessageReived(QString)));
// 二进制流
connect(webSocket,SIGNAL(binaryMessageReceived(const QByteArray)),this,SLOT(onBinaryReived(const QByteArray)));
3.2 对应的信号槽函数
void ServerWidget::onTextMessageReived(QString msg)
{
ui->textEdit_2->append(QDateTime::currentDateTime().toString()+":客户端发来消息:"+msg);
// 楼主只是简单分割出了上传上来的文件名 可自己制定通讯协议
QString flag="send_file_name";
if(msg.contains(flag))
{
qDebug()<<"客户端上传的文件名:"+msg.mid(flag.length()+1);
}
}
void ServerWidget::onBinaryReived(const QByteArray ba)
{
qDebug()<<"onBinaryReived:"<<ba.toHex();
QFile file("recive.txt");
if(file.open(QIODevice::WriteOnly))
{
file.write(ba);
file.close();
qDebug()<<"服务器保存好上传的文件";
}
else
{
qDebug()<<"保存文件失败";
}
}
三.演示截图