1.头文件
#ifndef CTCPSERVER_H
#define CTCPSERVER_H
#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
class CTcpServer : public QObject
{
Q_OBJECT
public:
CTcpServer(quint16 port, QObject* parent = nullptr);
public slots:
void NewConnectionSlot(); // 连接
void ClientDisconnectedSlot(); // 断开连接
void ClientReadyReadSlot(); // 有数据
private:
QTcpServer* m_pServer; // tcp服务
QMap<QString, QTcpSocket*> m_sockets; // 所有连接的客户端
};
#endif // CTCPSERVER_H
2.源文件
#include "ctcpserver.h"
CTcpServer::CTcpServer(quint16 port, QObject* parent):
QObject(parent),
m_pServer(new QTcpServer(this))
{
m_pServer->listen(QHostAddress::Any, port);
connect(m_pServer, &QTcpServer::newConnection, this, &CTcpServer::NewConnectionSlot);
}
void CTcpServer::NewConnectionSlot()
{
if(m_pServer == nullptr) {
return;
}
while (m_pServer->hasPendingConnections()) {
QTcpSocket* pSocket = m_pServer->nextPendingConnection();
if(pSocket == nullptr) {
continue;
}
QString ip = QHostAddress(pSocket->peerAddress().toIPv4Address()).toString();
connect(pSocket, &QTcpSocket::disconnected, this, &CTcpServer::ClientDisconnectedSlot);
connect(pSocket, &QTcpSocket::readyRead, this, &CTcpServer::ClientReadyReadSlot);
m_sockets.insert(ip, pSocket);
}
}
void CTcpServer::ClientDisconnectedSlot()
{
QTcpSocket* pSocket = qobject_cast<QTcpSocket*>(sender());
if(pSocket == nullptr) {
return;
}
QString ip = QHostAddress(pSocket->peerAddress().toIPv4Address()).toString();
disconnect(pSocket, &QTcpSocket::disconnected, this, &CTcpServer::ClientDisconnectedSlot);
disconnect(pSocket, &QTcpSocket::readyRead, this, &CTcpServer::ClientReadyReadSlot);
m_sockets.remove(ip);
}
void CTcpServer::ClientReadyReadSlot()
{
QTcpSocket* pSocket = qobject_cast<QTcpSocket*>(sender());
if(pSocket == nullptr) {
return;
}
QString ip = QHostAddress(pSocket->peerAddress().toIPv4Address()).toString();
QByteArray buffer = pSocket->readAll();
}