Server.h
#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QNetworkInterface>
#include "IMsgInterface.h"
class Server : public QObject
{
Q_OBJECT
public:
explicit Server(QObject *parent = 0);
~Server();
void init(IMsgInterface * pMsgHandler, int port);
void sendData(QString ip, QString data);
void sendData(QString ip, uchar *rawData);
signals:
private slots:
void newConnectSlot();
void readMessage();
void removeUserFormList();
private:
QTcpServer *m_tcpServer;
QMap<QString, QTcpSocket *> m_mapClient;
IMsgInterface *m_pMsgHandler;
};
Server.cpp
#include "Server.h"
Server::Server(QObject *parent) : QObject(parent)
{
m_tcpServer = new QTcpServer();
//设置最大允许连接数,不设置的话默认为30
m_tcpServer->setMaxPendingConnections(2000);
// QDBG << m_tcpServer->maxPendingConnections();
connect(m_tcpServer,SIGNAL(newConnection()),this,SLOT(newConnectSlot()));
}
Server::~Server()
{
}
void Server::init(IMsgInterface * pMsgHandler, int port)
{
m_pMsgHandler = pMsgHandler;
if(m_tcpServer->listen(QHostAddress::Any, port)){
QDBG << "listen OK!";
}else{
QDBG << "listen error!";
}
}
void Server::sendData(QString ip, QString data)
{
m_mapClient.value(ip)->write(data.toLatin1());
}
void Server::sendData(QString ip, uchar *rawData)
{
m_mapClient.value(ip)->write(QByteArray((char*)rawData));
}
void Server::newConnectSlot()
{
QTcpSocket *tcp = m_tcpServer->nextPendingConnection();
connect(tcp,SIGNAL(readyRead()),this,SLOT(readMessage()));
m_mapClient.insert(tcp->peerAddress().toString(), tcp);
m_pMsgHandler->devOnline(tcp->peerAddress().toString());
connect(tcp,SIGNAL(disconnected()),this,SLOT(removeUserFormList()));
}
void Server::readMessage()
{
QTcpSocket *socket = static_cast<QTcpSocket*>(sender());
m_pMsgHandler->recvFromServer(socket->peerAddress().toString(), QString(socket->readAll()));
}
void Server::removeUserFormList()
{
QTcpSocket* socket = static_cast<QTcpSocket*>(sender());
QMap<QString, QTcpSocket *>::iterator it;
for(it=m_mapClient.begin();it!=m_mapClient.end();it++)
{
if(socket->peerAddress().toString() == it.key())
{
m_mapClient.erase(it);
m_pMsgHandler->devOffline(socket->peerAddress().toString());
break;
}
}
}