赞
踩
目录
本文在QT中利用TCP协议实现了一个多线程的文件互传系统,其中遇到了不少槽点,甚至还有很多亟待解决的问题,因此想写一篇博文来记录一下。
因为运用了多线程,所以可以支持多个客户端同时登陆,服务器主界面也不会陷入假死状态。
鼠标选中后,进行发送即可。
(1)创建一个TCP服务器对象
我这里是新建了一个myTcpServer的类,该类继承自QTcpServer。
- #ifndef MYTCPSERVER_H
- #define MYTCPSERVER_H
-
- #include <QTcpServer>
-
- class myTcpServer : public QTcpServer
- {
- Q_OBJECT
- public:
- explicit myTcpServer(QObject *parent = nullptr);
-
- protected:
- void incomingConnection(qintptr handle) override;
-
- signals:
- void sendDescriptor(qintptr handle);
-
- public slots:
-
- };
-
- #endif // MYTCPSERVER_H
(2)实例化myTcpServer对象,并对服务器的IP和端口设置监听
- //实例化myTcpServer对象,用重写incomingConnection的方式获取通讯socket
- m_serverRecv = new myTcpServer(this);
- m_serverSend = new myTcpServer(this);
- //设置监听ip和端口
- m_serverRecv->listen(QHostAddress::AnyIPv4,port);
- m_serverSend->listen(QHostAddress::AnyIPv4,port);
(3)在myTcpServer中重写incomingConnection函数
每当有新连接的时候,会自动触发该函数,并获得一个与该连接通信的描述符。
- #include "mytcpserver.h"
-
- myTcpServer::myTcpServer(QObject *parent) : QTcpServer(parent)
- {
-
- }
-
- //创建一个class,并继承qtcpserver,重写其中的incomingConnection函数,每当有新连接时执行下面的函数
- void myTcpServer::incomingConnection(qintptr handle)
- {
- //给主线程发送一个信号,并传递描述符
- emit sendDescriptor(handle);
- }
(4)创建通信套接字对象(QTcpSocket)
创建一个通信套接字对象(QTcpSocket),并将上面获得的描述符写入。
- //创建套接字
- m_socket = new QTcpSocket;
- //写入描述符
- m_socket->setSocketDescriptor(handle);
(5)利用通信套接字对象和客户端进行数据传输
- //读
- fileData = m_socket->read(65536);
- //写
- m_socket->write((char*)&fileNameSize,4);
(1)创建通信的套接字类 QTcpSocket 对象
(2)绑定和连接服务器的IP地址和端口
- //创建套接字
- m_socket = new QTcpSocket;
- //绑定和连接
- m_socket->connectToHost(QHostAddress(ip),port);
(3)利用通信套接字对象和客户端进行数据传输
(1)创建一个工作类,继承QObject,将线程函数写在public中
(2)实例化工作类和线程
注意工作类不要指定父组件。
- //实例化一个发送文件的工作类
- sendWork* sendWorker = new sendWork;
- //实例化一个发送线程
- m_sendThread = new QThread;
(3)将工作类移入线程中,启动线程
- //将工作类挪入线程中
- sendWorker->moveToThread(m_sendThread);
- //启动线程
- m_sendThread->start();
(4)用信号槽在主线程激活子线程的线程函数
注意不要在主线程直接调用线程函数,一定要用信号槽,否则函数依然在主线程中执行
- //连接子线程的工作函数
- connect(this,&MainWindow::sendStart,sendWorker,&sendWork::sendFiles);
- //发射信号激活工作函数并传递通信描述符
- emit sendStart(handle);
源码放在这里了,0积分,有需要请大家自取
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。