#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//打印主线程id
qDebug()<<"主线程id"<< QThread::currentThread();
//设置主窗口标题
setWindowTitle("server");
//设置端口的默认值
ui->lineEdit_recvPort->setText("8888");
ui->lineEdit_sendPort->setText("9999");
//实例化myTcpServer对象,用重写incomingConnection的方式获取通讯socket
m_serverRecv = new myTcpServer(this);
m_serverSend = new myTcpServer(this);
//当有新连接时触发该slot,并传递一个与新连接对应的通讯描述符
connect(m_serverRecv,SIGNAL(sendDescriptor(qintptr)),this,SLOT(newConnectionRecv(qintptr)));
connect(m_serverSend,SIGNAL(sendDescriptor(qintptr)),this,SLOT(newConnectionSend(qintptr)));
}
MainWindow::~MainWindow()
{
//清理子线程
for (int i=0;i<m_recvThreadVector.size();i++) {
m_recvThreadVector[i]->quit();
m_recvThreadVector[i]->wait();
m_recvThreadVector[i]->deleteLater();
}
for (int i=0;i<m_sendThreadVector.size();i++) {
m_sendThreadVector[i]->quit();
m_sendThreadVector[i]->wait();
m_sendThreadVector[i]->deleteLater();
}
delete ui;
}
//服务器接收端口被连接时
void MainWindow::newConnectionRecv(qintptr handle)
{
//实例化一个接收文件的工作类
recvWork* recvWorker = new recvWork;
//实例化一个接收线程
QThread* recvThread = new QThread;
//将接收线程放到vector中
m_recvThreadVector.push_back(recvThread);
//将工作类挪入线程中
recvWorker->moveToThread(recvThread);
//启动线程
recvThread->start();
//获取客户端的ip和端口并显示
connect(recvWorker,&recvWork::getClientData,this,[=](QStringList clientData)
{
QIcon icon(":/images/icons/1.bmp");
QListWidgetItem* item = new QListWidgetItem(icon,"client("+clientData.at(0)+","+clientData.at(1)+")");
item->setData(Qt::UserRole,clientData);
ui->listWidget->addItem(item);
});
//获取已经完成接收的文件名并显示
connect(recvWorker,&recvWork::recvFinished,this,[=](QString fileName)
{
ui->plainTextEdit_recv->appendPlainText(fileName+"已接收完毕!!!");
});
//连接子线程的工作函数
connect(this,&MainWindow::recvStart,recvWorker,&recvWork::recvFiles);
//发射信号激活工作函数并传递通信描述符
emit recvStart(handle);
//取消连接,避免多次触发该线程
disconnect(this,&MainWindow::recvStart,recvWorker,&recvWork::recvFiles);
//当客户端连接断开时,在主界面上下线该客户端,清理释放内存
connect(recvWorker,&recvWork::disconnectOK,this,[=](QStringList clientData)
{
for (int i = 0;i<ui->listWidget->count();i++) {
QListWidgetItem* item = ui->listWidget->item(i);
QStringList itemData = item->data(Qt::UserRole).toStringList();
if(itemData.at(0) == clientData.at(0) && itemData.at(1) == clientData.at(1))
{
delete item;
}
}
//从vector中移除存入的线程
removeThread(m_recvThreadVector,recvThread);
recvThread->quit();
recvThread->wait();
recvThread->deleteLater();
recvWorker->deleteLater();
//qDebug()<<"recv"<<m_sendWorkVector<<m_sendHandleVector<<m_sendThreadVector<<m_recvThreadVector;
});
}
//服务器发送端口被连接时
void MainWindow::newConnectionSend(qintptr handle)
{
//实例化一个发送文件的工作类
sendWork* sendWorker = new sendWork;
//实例化一个发送线程
QThread* sendThread = new QThread;
//将线程放到vector中
m_sendThreadVector.push_back(sendThread);
//将工作类放到vector中
m_sendWorkVector.push_back(sendWorker);
//将描述符放到vector中
m_sendHandleVector.push_back(handle);
//获取客户端的ip和端口并显示
connect(sendWorker,&sendWork::getClientData,this,[=](QStringList clientData)
{
// clientData<<QString::number(m_clientNum);
// m_clientNum++;
m_clientIpVector.push_back(clientData.at(0));
QIcon icon(":/images/icons/1.bmp");
QListWidgetItem* item = new QListWidgetItem(icon,"client("+clientData.at(0)+","+clientData.at(1)+")");
item->setData(Qt::UserRole,clientData);
ui->listWidget->addItem(item);
});
//将工作类挪入线程中
sendWorker->moveToThread(sendThread);
//启动线程
sendThread->start();
//连接子线程的工作函数
connect(this,&MainWindow::sendStart,sendWorker,&sendWork::sendFiles);
//发射信号激活工作函数并传递通信描述符
emit sendStart(handle);
//取消连接,避免多次触发该线程
disconnect(this,&MainWindow::sendStart,sendWorker,&sendWork::sendFiles);
//当客户端连接断开时,在主界面上下线该客户端,清理释放内存
connect(sendWorker,&sendWork::disconnectOK,this,[=](QStringList clientData)
{
m_connectFlag = false;
for (int i = 0;i<ui->listWidget->count();i++) {
QListWidgetItem* item = ui->listWidget->item(i);
QStringList itemData = item->data(Qt::UserRole).toStringList();
if(itemData.at(0) == clientData.at(0) && itemData.at(1) == clientData.at(1))
{
delete item;
}
}
removeIp(m_clientIpVector,clientData.at(0));
removeThread(m_sendThreadVector,sendThread);
removeSendWork(m_sendWorkVector,sendWorker);
removeHandle(m_sendHandleVector,handle);
sendThread->quit();
sendThread->wait();
sendThread->deleteLater();
sendWorker->deleteLater();
//qDebug()<<"send"<<m_sendWorkVector<<m_sendHandleVector<<m_sendThreadVector<<m_recvThreadVector;
});
m_connectFlag = true;
}
void MainWindow::removeThread(QVector<QThread *> &v, QThread *thread)
{
for (auto it = v.begin(); it != v.end(); it++) {
if (*it == thread) {
v.erase(it); // 移除
it--; // 让该迭代器指向前一个
}
}
}
void MainWindow::removeSendWork(QVector<sendWork *> &v, sendWork *work)
{
for (auto it = v.begin(); it != v.end(); it++) {
if (*it == work) {
v.erase(it); // 移除
it--; // 让该迭代器指向前一个
}
}
}
void MainWindow::removeHandle(QVector<qintptr> &v, qintptr handle)
{
for (auto it = v.begin(); it != v.end(); it++) {
if (*it == handle) {
v.erase(it); // 移除
it--; // 让该迭代器指向前一个
}
}
}
void MainWindow::removeIp(QVector<QString> &v, QString ip)
{
for (auto it = v.begin(); it != v.end(); it++) {
if (*it == ip) {
v.erase(it); // 移除
it--; // 让该迭代器指向前一个
}
}
}
int MainWindow::getIpIndex(QVector<QString> &v, QString ip)
{
int num = 0;
for (auto it = v.begin(); it != v.end(); it++) {
if (*it == ip) { // 条件语句
return num;
}
num++;
}
return -1;
}
//当发送按钮被点击时
void MainWindow::on_pushButton_sendFile_clicked()
{
//如果服务器发送端口已经被连接
if(m_connectFlag == true)
{
//当用户未选择文件时
if(m_filePathList.count() == 0)
{
QMessageBox::warning(this,"warning","请选择文件后再尝�
没有合适的资源?快使用搜索试试~ 我知道了~
QT中利用TCP协议实现了一个多线程的文件互传系统
共123个文件
dll:44个
qm:44个
cpp:9个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 167 浏览量
2023-08-29
23:36:17
上传
评论
收藏 40.56MB ZIP 举报
温馨提示
QT中利用TCP协议实现了一个多线程的文件互传系统
资源推荐
资源详情
资源评论
收起资源包目录
QT中利用TCP协议实现了一个多线程的文件互传系统
(123个子文件)
1.bmp 45KB
3.bmp 1KB
4.bmp 1KB
3.bmp 1KB
4.bmp 1KB
mainwindow.cpp 11KB
mainwindow.cpp 8KB
recvwork.cpp 4KB
recvwork.cpp 4KB
sendwork.cpp 4KB
sendwork.cpp 3KB
mytcpserver.cpp 385B
main.cpp 183B
main.cpp 183B
opengl32sw.dll 19.95MB
opengl32sw.dll 19.95MB
Qt5Gui.dll 6.21MB
Qt5Gui.dll 6.21MB
Qt5Core.dll 5.87MB
Qt5Core.dll 5.87MB
Qt5Widgets.dll 5.33MB
Qt5Widgets.dll 5.33MB
D3Dcompiler_47.dll 3.98MB
D3Dcompiler_47.dll 3.98MB
libGLESV2.dll 3.41MB
libGLESV2.dll 3.41MB
qwindows.dll 1.4MB
qwindows.dll 1.4MB
Qt5Network.dll 1.27MB
Qt5Network.dll 1.27MB
qwebp.dll 486KB
qwebp.dll 486KB
qjpeg.dll 394KB
qjpeg.dll 394KB
qtiff.dll 371KB
qtiff.dll 371KB
Qt5Svg.dll 331KB
Qt5Svg.dll 331KB
qwindowsvistastyle.dll 140KB
qwindowsvistastyle.dll 140KB
qgenericbearer.dll 52KB
qgenericbearer.dll 52KB
qicns.dll 46KB
qicns.dll 46KB
qsvgicon.dll 40KB
qsvgicon.dll 40KB
qico.dll 37KB
qico.dll 37KB
qgif.dll 37KB
qgif.dll 37KB
qsvg.dll 31KB
qsvg.dll 31KB
qtga.dll 30KB
qtga.dll 30KB
qwbmp.dll 29KB
qwbmp.dll 29KB
libEGL.dll 24KB
libEGL.dll 24KB
server.exe 108KB
client.exe 88KB
mainwindow.h 2KB
mainwindow.h 1KB
recvwork.h 906B
recvwork.h 864B
sendwork.h 787B
sendwork.h 737B
mytcpserver.h 365B
000000241677.jpg 290KB
OM3xOVYQvl.png 63KB
server.pro 1KB
client.pro 1KB
qt_de.qm 196KB
qt_de.qm 196KB
qt_gd.qm 185KB
qt_gd.qm 185KB
qt_ru.qm 182KB
qt_ru.qm 182KB
qt_ca.qm 180KB
qt_ca.qm 180KB
qt_fi.qm 176KB
qt_fi.qm 176KB
qt_cs.qm 171KB
qt_cs.qm 171KB
qt_da.qm 170KB
qt_da.qm 170KB
qt_fr.qm 162KB
qt_fr.qm 162KB
qt_bg.qm 161KB
qt_bg.qm 161KB
qt_es.qm 161KB
qt_es.qm 161KB
qt_pl.qm 159KB
qt_pl.qm 159KB
qt_it.qm 157KB
qt_it.qm 157KB
qt_hu.qm 157KB
qt_hu.qm 157KB
qt_ar.qm 156KB
qt_ar.qm 156KB
qt_uk.qm 155KB
共 123 条
- 1
- 2
资源评论
- m0_616345662023-12-14超赞的资源,感谢资源主分享,大家一起进步!
小风飞子
- 粉丝: 325
- 资源: 1511
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功