#include "serverwidget.h"
#include "ui_serverwidget.h"
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
ServerWidget::ServerWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::ServerWidget)
{
ui->setupUi(this);
setWindowTitle("服务器端口:8888");
fileSize = 0;
//未连接时设置为不可用
ui->buttonSend->setEnabled(false);
ui->buttonSelect->setEnabled(false);
tcpServer = new QTcpServer(this);
//监听端口号为8888的所有IP地址
tcpServer->listen(QHostAddress::Any, 8888);
//如果与客户端成功连接,会触发QTcpServer::newConnection()信号
connect(tcpServer, &QTcpServer::newConnection, [=](){
//取出通信套接字
tcpSocket = tcpServer->nextPendingConnection();
QString ip = tcpSocket->peerAddress().toString();
quint16 port = tcpSocket->peerPort();
//qDebug()<<ip<<port;
ui->textBrowser->setText(QString("[%1:%2]: 成功与客户端连接").arg(ip).arg(port));
//连接时设置“选择文件”为可用
ui->buttonSelect->setEnabled(true);
connect(tcpSocket, &QTcpSocket::readyRead, [=](){
//取客户端的信息
QByteArray buf = tcpSocket->readAll();
if(QString(buf) == "file done")
{
//文件发送完毕
ui->textBrowser->append("文件发送完毕");
ui->buttonSend->setEnabled(false);
//关闭文件且断开连接
file.close();
tcpSocket->disconnectFromHost();
tcpSocket->close();
}
});
});
//定时器处理
connect(&timer, &QTimer::timeout, [=](){
timer.stop();
//发送文件
sendFile();
});
}
ServerWidget::~ServerWidget()
{
delete ui;
}
//选择文件
void ServerWidget::on_buttonSelect_clicked()
{
//初始化文件属性
QString filePath = QFileDialog::getOpenFileName(this, "Open", "../");
if(!filePath.isEmpty())
{
QFileInfo info(filePath);
fileName = info.fileName();
fileSize = info.size();
//qDebug()<<fileName<<fileSize;
file.setFileName(filePath);
if(file.open(QIODevice::ReadOnly))
{
ui->textBrowser->append(QString("FileName:%1 \n\nFileSize:%2 KB").arg(fileName).arg(fileSize/1024));
//连接时设置“选择文件”为不可用,“发送文件”可用
ui->buttonSend->setEnabled(true);
ui->buttonSelect->setEnabled(false);
}
else {
qDebug()<<"打开文件失败";
}
}
else
{
qDebug()<<"文件路径出错";
}
}
//发送文件
void ServerWidget::on_buttonSend_clicked()
{
//1.发送文件头 格式:文件名###文件大小
QString fileHead = QString("%1###%2").arg(fileName).arg(fileSize);
qint16 len = tcpSocket->write(fileHead.toUtf8());
if(len > 0)
{
//让文件头与文件内容之间发送间隔相隔10ms
timer.start(10);
}
else {
//发送头部文件失败
qDebug()<<"发送头部文件失败";
file.close();
}
}
void ServerWidget::sendFile()
{
ui->textBrowser->append("正在发送文件...");
qint64 len = 0;
do{
//每次发送4KB
char buf[4*1024] = {0};
len = 0;
len = file.read(buf, sizeof(buf));
len = tcpSocket->write(buf, len);
}while (len > 0);
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
test10.zip (9个子文件)
test10
serverwidget.cpp 4KB
test10.pro.user 24KB
clientwidget.h 714B
clientwidget.ui 2KB
serverwidget.h 716B
serverwidget.ui 2KB
main.cpp 252B
test10.pro 1KB
clientwidget.cpp 3KB
共 9 条
- 1
资源评论
- 皮皮hhh2023-09-12资源是宝藏资源,实用也是真的实用,感谢大佬分享~
- ashdahs2022-05-23用户下载后在一定时间内未进行评价,系统默认好评。
心梓
- 粉丝: 849
- 资源: 8042
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功