QTcpServer基本用法

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;
        }
    }
}
要使用Qt搭建HTTP服务,可以使用Qt的网络模块和HTTP服务器类。以下是一个简单的示例: ```cpp #include <QtCore> #include <QtNetwork> class HttpServer : public QObject { Q_OBJECT public: HttpServer(QObject* parent = nullptr) : QObject(parent) { server = new QTcpServer(this); connect(server, &QTcpServer::newConnection, this, &HttpServer::handleRequest); server->listen(QHostAddress::Any, 8080); } private slots: void handleRequest() { QTcpSocket* client = server->nextPendingConnection(); if (client) { connect(client, &QTcpSocket::readyRead, this, &HttpServer::readRequest); } } void readRequest() { QTcpSocket* client = qobject_cast<QTcpSocket*>(sender()); if (client) { QByteArray requestData = client->readAll(); // Parse request and send response QByteArray responseData = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nHello World!"; client->write(responseData); client->disconnectFromHost(); } } private: QTcpServer* server; }; int main(int argc, char** argv) { QCoreApplication app(argc, argv); HttpServer server; return app.exec(); } ``` 在上面的示例中,我们创建了一个名为`HttpServer`的类,该类继承自QObject,并包含了一个QTcpServer对象。在构造函数中,我们将QTcpServer对象绑定到所有本地IP地址的8080端口上,并连接了QTcpServer的newConnection信号到handleRequest槽上。handleRequest槽会在有新的连接请求时被触发,它会创建一个新的QTcpSocket来处理请求,并将readyRead信号连接到readRequest槽上。readRequest槽会在请求数据可用时被触发,它会读取请求并发送响应。 请注意,这只是一个基本示例,您需要根据您的需求扩展和修改它。如果要提供静态文件服务或处理其他HTTP方法(例如POST或PUT),则需要进行更多的工作。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值