使用QtQSignalMapper建立服务器多客户端处理
Qt作为服务器时,当多个客户端使用TCPSocket与服务器建立长连接,无法区分客户端,导致不能准确与客户端进行通信
原因:
每当新建立一个连接时会发出一个newConnection()
信号,在处理信号函数中调用nextPendingConnection()
会建立一个新的通信Socket,但是多个客户端连接时,上以个Socket会被覆盖,如果使用QList储存所有客户端时,QList内的Socket无法及时通过readyRead()
信号读取信息等问题,需要不断遍历QList的来获取信号,而且效率不高.
解决方案:
通过QSignalMapper与QList组合,将readyRead()
信号全部绑定到QSignalMapper
里面,在将Socket添加到QSignalMapper``中时建立与QList一直的索引,每次
QSignalMapper发出'
readyRead()`'信号时会同时发出索引值,从而取得当前通信的Socket
- 实现void incomingConnection(qintptr socketDescriptor)虚函数
//.h文件
#ifndef __REWRITETCPSERVER
#define __REWRITETCPSERVER
#include <QObject>
#include <QTcpServer>
class RewriteTcpServer : public QTcpServer{
Q_OBJECT
protected:
void incomingConnection(qintptr socketDescriptor);
signals:
void sendSocket(qintptr ocketDescriptor);
public:
RewriteTcpServer(QObject* parent);
~RewriteTcpServer();
};
#endif //__REWRITETCPSERVER
//cpp文件
#include "RewriteTcpServer.h"
RewriteTcpServer::RewriteTcpServer(QObject* parent)
: QTcpServer(parent) {
}
//重写tcpserver将套接字描述符转发到其他线程中
void RewriteTcpServer::incomingConnection(qintptr socketDescriptor) {
emit sendSocket(socketDescriptor);
}
RewriteTcpServer::~RewriteTcpServer()
{
}
//.h
//服务器监听类
#ifndef __SERVERNETWORK
#define __SERVERNETWORK
#include "QObject"
#include "RewriteTcpServer.h"
#include "SocketFactory.h"
#include "ConnectSqlPool.h"
class ServerNetwork : public QObject
{
Q_OBJECT
public:
ServerNetwork(QObject* parent = 0);
~ServerNetwork();
signals:
void repetionSendSocketDescriptor(qintptr SocketDescriptor);
protected slots:
void receptionSocketDescriptor(qintptr SocketDescriptor);
private:
RewriteTcpServer* listenSocker;//监听类
SocketFactory * socketFa