Qt开发:QTcpServer的详解

5、QT的使用——TCP客户端和服务器 TCP客户端和服务器 阅读详情

一、QTcpServer 简介

  QTcpServer 是 Qt 网络模块中的一个核心类,用于实现 基于 TCP 协议的服务端(Server),它负责监听端口、接收客户端连接请求,并通过 QTcpSocket 与客户端通信。

头文件:

#include <QTcpServer>
#include <QTcpSocket>

所属模块:

QT += network

二、常用成员函数的使用

2.1 void close()

作用:

  • 停止当前的监听;
  • 不再接受新的客户端连接;
  • 但 不会主动断开已连接的客户端(你需要自行关闭相关的 QTcpSocket);

使用方式:

QTcpServer server;

// 启动监听
server.listen(QHostAddress::Any, 12345);

// 停止监听
server.close();

调用 close() 后,服务器不再监听新的连接。如果要重新监听,可以再次调用 listen()。

配合判断函数使用:

if (server.isListening()) {
    server.close();
    qDebug() << "Server closed.";
}

注意事项:

  • close() 只是关闭监听端口,不会自动关闭通过 nextPendingConnection() 创建的 QTcpSocket;
  • 如果要释放所有资源,应在 close() 之后手动删除或管理已连接的 socket。

2.2 QString errorString() const

作用:

  • 当 QTcpServer::listen() 调用失败时,可以使用 errorString() 获取失败原因;
  • 返回值是一个用户可读的字符串(QString),便于调试或显示在日志/界面中;
  • 不适用于成功的监听,仅在发生错误时有效。

典型用法示例:

QTcpServer server;
if (!server.listen(QHostAddress::Any, 12345)) {
    qDebug() << "Server failed to start:" << server.errorString();
} else {
    qDebug() << "Server started on port" << server.serverPort();
}

常见输出示例:

  • “The address is already in use”(端口已被占用)
  • “Permission denied”(在受限端口启动服务)
  • “Operation not permitted”(无权限)
  • “Unknown error”

2.3 virtual bool hasPendingConnections() const

作用:

  • 返回 true 表示有客户端连接已到达,但尚未被你用 nextPendingConnection() 拿出来;
  • 返回 false 表示当前没有等待处理的连接;
  • 常配合 nextPendingConnection() 使用,用于服务器主动轮询处理连接(非 newConnection 信号方式)。

常见使用场景:
场景 1:在主循环或定时器中轮询客户端连接

if (server.hasPendingConnections()) {
    QTcpSocket* clientSocket = server.nextPendingConnection();
    // 处理 socket...
}

场景 2:与 newConnection 信号搭配,增强安全性(防止 nextPendingConnection 为 nullptr)

void MyServer::onNewConnection() {
    while (server.hasPendingConnections()) {
        QTcpSocket* socket = server.nextPendingConnection();
        if (socket) {
            connect(socket, &QTcpSocket::readyRead, this, &MyServer::onReadyRead);
        }
    }
}

完整使用示例:

QTcpServer server;
server.listen(QHostAddress::Any, 12345);

QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, [&]() {
    while (server.hasPendingConnections()) {
        QTcpSocket* socket = server.nextPendingConnection();
        qDebug() << "New client:" << socket->peerAddress();
        connect(socket, &QTcpSocket::readyRead, [socket]() {
            qDebug() << "Data:" << socket->readAll();
        });
    }
});
timer->start(100); // 每 100ms 检查新连接

2.4 bool isListening() const

作用:

  • 返回 true 表示服务器已经成功调用 listen() 并正在监听端口;
  • 返回 false 表示服务器当前未监听任何端口,例如尚未调用 listen(),或者已调用了 close() 停止监听。

使用示例:
示例 1:启动服务器前判断状态

if (!server.isListening()) {
    if (!server.listen(QHostAddress::Any, 12345)) {
        qDebug() << "Failed to listen:" << server.errorString();
    } else {
        qDebug() << "Server started.";
    }
}

示例 2:停止监听前判断是否正在监听

if (server.isListening()) {
    server.close();
    qDebug() << "Server stopped.";
}

2.5 bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)

作用:

  • 在指定 IP 地址和端口上开启监听;
  • 等待客户端连接(触发 newConnection() 信号);
  • 返回 true 表示监听成功,false 表示失败(可配合 errorString() 查看原因)。

使用示例:
示例 1:监听所有网卡的 12345 端口

QTcpServer server;
if (!server.listen(QHostAddress::Any, 12345)) {
    qDebug() << "Listen failed:" << server.errorString();
} else {
    qDebug() << "Server started on port" << server.serverPort();
}

示例 2:监听本机(127.0.0.1)

server.listen(QHostAddress::LocalHost, 9999);

监听成功后该做什么?
连接 newConnection() 信号:

connect(&server, &QTcpServer::newConnection, [&]() {
    QTcpSocket *client = server.nextPendingConnection();
    // 处理客户端
});

2.6 int maxPendingConnections() const

  • 表示服务器还没有调用 nextPendingConnection() 接收的连接最大数量;
  • 超过该数量的新连接会被拒绝;
  • 实际是 listen() 的 backlog 参数在 Qt 封装下的表现。

使用示例:
示例:获取最大挂起连接数

QTcpServer server;
qDebug() << "Default max pending connections:" << server.maxPendingConnections(); // 默认是 30

server.setMaxPendingConnections(100);
qDebug() << "Updated max pending connections:" << server.maxPendingConnections(); // 现在是 100

配合使用函数:
在这里插入图片描述
*2.7 virtual QTcpSocket nextPendingConnection()

作用:

  • 当客户端连接到服务器时,QTcpServer 会触发 newConnection() 信号;
  • 可以在信号槽中调用 nextPendingConnection() 来取出并处理这个连接;
  • 返回一个指向新建 QTcpSocket 的指针,代表该客户端的连接;
  • 多次调用可以获取多个挂起的连接(由 hasPendingConnections() 控制);

基本用法:
示例:处理新连接

connect(&server, &QTcpServer::newConnection, [&]() {
    while (server.hasPendingConnections()) {
        QTcpSocket* clientSocket = server.nextPendingConnection();
        if (clientSocket) {
            qDebug() << "New client from" << clientSocket->peerAddress();
            connect(clientSocket, &QTcpSocket::readyRead, [clientSocket]() {
                QByteArray data = clientSocket->readAll();
                qDebug() << "Received:" << data;
                clientSocket->write("Echo: " + data);
            });
            connect(clientSocket, &QTcpSocket::disconnected, clientSocket, &QObject::deleteLater);
        }
    }
});

2.8 void QTcpServer::pauseAccepting()

作用:

  • 暂时“挂起”新连接的接收;
  • QTcpServer 不会再触发 newConnection() 信号;
  • 内部仍然监听端口,只是不处理新连接;
  • 可通过 resumeAccepting() 恢复正常接收。

使用示例:
示例:服务繁忙时暂停接收

QTcpServer server;

// 假设客户端过多时调用
if (tooManyClients()) {
    server.pauseAccepting();
    qDebug() << "Server paused accepting new connections.";
}

// 一段时间后或条件满足时恢复
server.resumeAccepting();
qDebug() << "Server resumed accepting new connections.";

注意事项:
在这里插入图片描述
2.9 void QTcpServer::resumeAccepting()

功能简介:

  • 当调用 pauseAccepting() 后,服务器会停止处理传入连接;
  • 此时客户端仍然可以连接服务器的端口,但 incomingConnection() 和 newConnection() 信号不会触发;
  • 当调用 resumeAccepting() 时,服务器恢复监听并处理新的连接请求。

示例:每秒只允许一个连接(含 resumeAccepting)

// 在 MyServer.h 中
QTimer *m_acceptTimer;
bool m_paused;

// 在 MyServer.cpp 中
MyServer::MyServer(QObject *parent)
    : QTcpServer(parent), m_paused(false) {
    
    m_acceptTimer = new QTimer(this);
    m_acceptTimer->setInterval(1000); // 每秒一次
    connect(m_acceptTimer, &QTimer::timeout, this, [this]() {
        if (m_paused) {
            this->resumeAccepting();  // 恢复接受连接
            m_paused = false;
            qDebug() << "Resumed accepting connections.";
        }
    });
    m_acceptTimer->start();
}

void MyServer::incomingConnection(qintptr socketDescriptor) {
    QTcpSocket *socket = new QTcpSocket(this);
    socket->setSocketDescriptor(socketDescriptor);
    qDebug() << "New connection from:" << socket->peerAddress();
    
    // 立即暂停后续连接
    pauseAccepting();
    m_paused = true;
}

2.10 QHostAddress serverAddress() const

**函数作用:**回服务器监听的本地 IP 地址(QHostAddress 类型),它表示服务器是在哪个地址上监听的连接。

使用示例:

QTcpServer server;
if (server.listen(QHostAddress::AnyIPv4, 12345)) {
    qDebug() << "Listening on:"
             << server.serverAddress().toString()
             << ":" << server.serverPort();
} else {
    qDebug() << "Failed to listen:" << server.errorString();
}

监听本地并输出地址:

QTcpServer server;
if (server.listen(QHostAddress::LocalHost, 0)) {
    qDebug() << "Server running at:"
             << server.serverAddress().toString()
             << "on port" << server.serverPort();
}

输出:

Server running at: "127.0.0.1" on port 54321

2.11 QAbstractSocket::SocketError QTcpServer::serverError() const

作用:

  • 返回最近一次调用 listen()、setSocketDescriptor() 等操作中发生的错误枚举值;
  • 搭配 errorString() 使用,可以获得详细的错误描述;
  • 仅在失败时调用有意义(如 listen() 返回 false 时);
  • 错误类型为 QAbstractSocket::SocketError 枚举。

常见错误类型(枚举值):
在这里插入图片描述
完整列表见官方文档:QAbstractSocket::SocketError

示例代码:

QTcpServer server;

if (!server.listen(QHostAddress::Any, 12345)) {
    qDebug() << "Listen failed!";
    qDebug() << "Error code:" << server.serverError();
    qDebug() << "Error message:" << server.errorString();
}

2.12 quint16 serverPort() const

作用:

  • 返回服务器当前监听的端口号;
  • 通常在调用 listen() 成功之后使用;
  • 如果 listen() 中传入的端口号是 0(表示让系统自动分配),则通过此函数可以获取实际分配的端口;
  • 返回值类型为 quint16(即无符号16位整数,范围为 0~65535)。

使用示例:
示例 1:指定端口监听

QTcpServer server;
if (server.listen(QHostAddress::Any, 12345)) {
    qDebug() << "Server is listening on port:" << server.serverPort();
}

示例 2:动态分配端口

QTcpServer server;
if (server.listen(QHostAddress::LocalHost, 0)) {
    qDebug() << "Server is listening on dynamically assigned port:"
             << server.serverPort();
}

2.13 void setMaxPendingConnections(int numConnections)

作用说明:

  • 控制“连接等待队列”的长度;
  • 当客户端连接服务器但尚未被 accept()(即 nextPendingConnection() 处理)时,它们会进入“等待队列”;
  • 如果等待队列已满,操作系统会拒绝新的连接尝试;
  • 默认为 30 个连接(Qt 默认值)。

使用示例:

QTcpServer server;
server.setMaxPendingConnections(100);  // 设置最多等待100个连接

if (server.listen(QHostAddress::Any, 12345)) {
    qDebug() << "Server is listening. Max pending:" << server.maxPendingConnections();
} else {
    qDebug() << "Listen failed:" << server.errorString();
}

2.14 bool setSocketDescriptor(qintptr socketDescriptor)

作用说明:

  • 用于将一个外部创建的监听 socket(底层 socket fd)交给 QTcpServer 管理;
  • 可用于支持“继承 socket”,如服务热更新(fork 子进程继承父进程监听的 socket);
  • 成功绑定后,QTcpServer 会像自己调用 listen() 一样工作;
  • 参数 socketDescriptor 是一个平台相关的 socket 文件描述符(int 或 SOCKET)。

使用示例:
示例:使用已有 socket 描述符初始化 QTcpServer

QTcpServer *server = new QTcpServer();

int nativeSocket = ::socket(AF_INET, SOCK_STREAM, 0);
// 配置绑定端口、listen 等(略)
// ...

// 假设 nativeSocket 已处于 listen 状态
if (!server->setSocketDescriptor(nativeSocket)) {
    qDebug() << "Failed to set socket descriptor:"
             << server->errorString();
} else {
    qDebug() << "Server is using existing socket descriptor!";
}

2.15 qintptr QTcpServer::socketDescriptor() const

作用说明:

  • 返回当前 QTcpServer 使用的操作系统原生 socket 描述符;
  • 适用于需要与非 Qt 网络库协同工作,或进行底层操作(如跨进程传递 socket、设置 socket 选项等);
  • 与 setSocketDescriptor(qintptr) 配合使用,可以实现 socket 的“迁移”或“重用”;
  • qintptr 是一个平台无关的整数类型,表示 native socket(在 Linux 是 int,在 Windows 是 SOCKET)。

使用示例:

QTcpServer server;
if (server.listen(QHostAddress::Any, 12345)) {
    qintptr fd = server.socketDescriptor();
    qDebug() << "Server socket descriptor:" << fd;
    // 可以传递 fd 给系统调用
}

2.16 bool QTcpServer::waitForNewConnection(int msec = 0, bool *timedOut = nullptr)

作用:用于在阻塞模式下等待一个新的客户端连接的到来,常用于非事件驱动(非 signal-slot)或子线程中手动接收连接。

参数说明:
在这里插入图片描述

使用示例:
示例 1:等待连接 3 秒

QTcpServer server;
if (server.listen(QHostAddress::Any, 12345)) {
    bool timeout = false;
    if (server.waitForNewConnection(3000, &timeout)) {
        QTcpSocket *client = server.nextPendingConnection();
        qDebug() << "Client connected from" << client->peerAddress();
    } else {
        if (timeout)
            qDebug() << "Waited 3 seconds: no client connected.";
        else
            qDebug() << "Error:" << server.errorString();
    }
}

示例 2:在子线程中轮询连接

while (running) {
    if (server.waitForNewConnection(1000)) {
        QTcpSocket *client = server.nextPendingConnection();
        handleClient(client);
    }
}

三、信号函数的使用

3.1 void QTcpServer::acceptError(QAbstractSocket::SocketError socketError)

作用说明:

  • 信号,在服务器尝试接收连接(即内部 accept() 系统调用)失败时触发;
  • 可通过连接该信号,打印错误日志、报警、记录等;
  • 参数 socketError 是 QAbstractSocket::SocketError 枚举类型,表示具体的错误类型,如 SocketResourceError、SocketAccessError 等。

常见错误类型(QAbstractSocket::SocketError):
在这里插入图片描述
使用示例:

#include <QTcpServer>
#include <QDebug>

class MyServer : public QTcpServer {
    Q_OBJECT
public:
    MyServer(QObject *parent = nullptr) : QTcpServer(parent) {
        connect(this, &QTcpServer::acceptError, this, &MyServer::onAcceptError);
    }

private slots:
    void onAcceptError(QAbstractSocket::SocketError socketError) {
        qDebug() << "Accept error:" << socketError << "-" << this->errorString();
    }
};

3.2 void QTcpServer::newConnection()

作用说明:

  • 当有新的客户端尝试连接,并被成功 accept() 后,Qt 会自动发出该信号;
  • 此时可以调用 nextPendingConnection() 来获取新的 QTcpSocket;
  • 这是 Qt 中推荐的事件驱动方式 来处理新连接,避免使用阻塞式 waitForNewConnection()。

使用示例:

// MyServer.h
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>

class MyServer : public QTcpServer {
    Q_OBJECT
public:
    MyServer(QObject *parent = nullptr) : QTcpServer(parent) {
        connect(this, &QTcpServer::newConnection, this, &MyServer::handleNewConnection);
    }

private slots:
    void handleNewConnection() {
        QTcpSocket *client = nextPendingConnection();
        qDebug() << "New client connected from" << client->peerAddress().toString();

        connect(client, &QTcpSocket::readyRead, this, [client]() {
            QByteArray data = client->readAll();
            qDebug() << "Received:" << data;
            client->write("Echo: " + data);
        });

        connect(client, &QTcpSocket::disconnected, client, &QTcpSocket::deleteLater);
    }
};

四、虚函数的使用

4.1 void QTcpServer::addPendingConnection(QTcpSocket *socket)
作用:用于手动将一个已经建立连接的 QTcpSocket 添加到服务器的等待连接队列中,从而触发 newConnection() 信号,供后续通过 nextPendingConnection() 获取。

这个函数通常用于自定义服务端行为,例如:
在这里插入图片描述
使用示例:
自定义 incomingConnection() 并使用 addPendingConnection()

class CustomTcpServer : public QTcpServer {
    Q_OBJECT
public:
    CustomTcpServer(QObject *parent = nullptr) : QTcpServer(parent) {}

protected:
    void incomingConnection(qintptr socketDescriptor) override {
        QTcpSocket *socket = new QTcpSocket(this);
        if (socket->setSocketDescriptor(socketDescriptor)) {
            qDebug() << "Custom socket accepted from:" << socket->peerAddress();
            addPendingConnection(socket); // 添加到等待队列,触发 newConnection()
        } else {
            delete socket;
        }
    }
};

4.2 virtual void QTcpServer::incomingConnection(qintptr socketDescriptor)

作用:允许你自定义服务器如何处理新连接的底层行为。它通常在你需要更精细控制 socket 创建方式、实现自定义 socket 类型或与多线程结合时使用。

参数说明:

  • qintptr socketDescriptor:这是一个原始 socket 文件描述符(FD),可以用来构造一个 QTcpSocket。
  • 该函数在新连接到达时由 Qt 的事件循环自动调用。

典型使用示例:自定义线程分发

// CustomServer.h
#include <QTcpServer>
#include <QTcpSocket>
#include <QThread>
#include <QDebug>

class ClientHandler : public QThread {
    Q_OBJECT
public:
    ClientHandler(qintptr socketDescriptor, QObject *parent = nullptr)
        : QThread(parent), socketDescriptor(socketDescriptor) {}

protected:
    void run() override {
        QTcpSocket socket;
        if (!socket.setSocketDescriptor(socketDescriptor)) {
            qDebug() << "Socket descriptor error";
            return;
        }

        connect(&socket, &QTcpSocket::readyRead, [&]() {
            QByteArray data = socket.readAll();
            socket.write("Echo: " + data);
        });

        connect(&socket, &QTcpSocket::disconnected, &socket, &QTcpSocket::deleteLater);
        exec();  // 进入线程事件循环
    }

private:
    qintptr socketDescriptor;
};

class CustomServer : public QTcpServer {
    Q_OBJECT
protected:
    void incomingConnection(qintptr socketDescriptor) override {
        qDebug() << "New incoming connection:" << socketDescriptor;
        ClientHandler *handler = new ClientHandler(socketDescriptor);
        handler->start();  // 每个连接交给新线程处理
    }
};

五、连接多客户端-服务端示例

结构说明:

  • MyServer:监听端口,接受连接;
  • ClientHandler:线程对象,处理每个客户端 socket;
  • 每个客户端连接一个线程。

ClientHandler.h

#pragma once

#include <QThread>
#include <QTcpSocket>

class ClientHandler : public QThread {
    Q_OBJECT
public:
    ClientHandler(QTcpSocket* socket, QObject* parent = nullptr);
    ~ClientHandler();

protected:
    void run() override;

private:
    QTcpSocket* m_socket;
};

ClientHandler.cpp

#include "ClientHandler.h"
#include <QDebug>

ClientHandler::ClientHandler(QTcpSocket* socket, QObject* parent)
    : QThread(parent), m_socket(socket) {}

ClientHandler::~ClientHandler() {
    if (m_socket) {
        m_socket->disconnectFromHost();
        m_socket->deleteLater();
    }
}

void ClientHandler::run() {
    connect(m_socket, &QTcpSocket::readyRead, [=]() {
        QByteArray data = m_socket->readAll();
        qDebug() << "Thread" << QThread::currentThreadId() << "Received:" << data;
        m_socket->write("Echo: " + data);
    });

    connect(m_socket, &QTcpSocket::disconnected, [=]() {
        qDebug() << "Client disconnected";
        m_socket->deleteLater();
        quit();
    });

    exec(); // 启动事件循环
}

MyServer.h

#pragma once

#include <QTcpServer>

class MyServer : public QTcpServer {
    Q_OBJECT
public:
    explicit MyServer(QObject* parent = nullptr);
    bool startServer(quint16 port);

protected:
    void incomingConnection(qintptr socketDescriptor) override;
};

MyServer.cpp

#include "MyServer.h"
#include "ClientHandler.h"
#include <QTcpSocket>
#include <QDebug>

MyServer::MyServer(QObject* parent)
    : QTcpServer(parent) {}

bool MyServer::startServer(quint16 port) {
    if (!listen(QHostAddress::Any, port)) {
        qDebug() << "Server failed:" << errorString();
        return false;
    }
    qDebug() << "Server started on port" << port;
    return true;
}

void MyServer::incomingConnection(qintptr socketDescriptor) {
    QTcpSocket* socket = new QTcpSocket;
    if (!socket->setSocketDescriptor(socketDescriptor)) {
        qDebug() << "Failed to set socket descriptor";
        socket->deleteLater();
        return;
    }

    qDebug() << "New client from" << socket->peerAddress().toString();

    auto* handler = new ClientHandler(socket);
    handler->start(); // 启动线程
}

main.cpp

#include <QCoreApplication>
#include "MyServer.h"

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    MyServer server;
    if (!server.startServer(12345)) {
        return -1;
    }

    return a.exec();
}
【QT】TCP通信(QTcpServer 和 QTcpSocket) TCP是一种被大多数Internet网络协议(如HTTP)用于数据传输的低级网络协议,它是可靠的、面向流、面向连接的传输协议,特别适合于连续数据传输。TCP通信必须先建立TCP连接,分为服务器端和客户端。Qt提供QTcpServer类和QTcpSocket类用于建立TCP通信。服务器端必须使用QTcpServer用于端口监听,建立服务器;QTcpSocket用于建立连接后使用套接字进行通信。 阅读详情

相关推荐

QT源码分析:QTcpServer

这里可以通过QT_CONFIG的标志判断来采取其中一种实现,qt_poll是QT自己实现的函数,实际上采用的是select模式,在早期的版本中应该是用的select模式,QT5.7以后的版本采用了poll模式,我所用的版本是QT5.9用的就是poll模式,之所以使用poll取代select是因为select模式监听的套接字长度是用的定长的数组,所以在运行期是无法扩展的,只要套接字超过FD_SETSIZE就会返回错误,在Linux默认的设置中FD_SETSIZE为1024。把套接字类型设置为Tcp。

QtCompany的博客 967

QT实现TCP通信(服务器与客户端搭建)

【代码】QT实现TCP通信(服务器与客户端搭建)

小钱努力学C的博客 1万+

qt4 tcp QTcpSocket QTcpServer 传输文件

tcpSender (客户端无QTcpServer) private: QTcpSocket *tcpClient; QFile *localFile; //要发送的文件 qint64 totalBytes; //数据总大小 qint64 bytesWritten; //已经发送数据大小 qint64 byte

luck_good的专栏 1万+

qt中Qtcpserver服务端_qt websocket

qt中Qtcpserver服务端_qt websocket

m0_60259116的博客 5043

Qt 中QTcpServer 模拟简单Tcp/HTTP Server

互联网时代,软件之间的通信比较频繁 最近用Qt写了一个监视软件,需要得到一个通知,所以上网找到方法,幸运的是,GitHub有很多例子,学习了一下 由于是小白 记录下流程:待以后慢慢学习   首先,因为我们用到了Qt中的类库,我们必须了解QT中信号(SIGNAL)和槽(SLOT)的机制。 当然了,这个依赖于Q_OBJECT的宏,带来的 Q_SIGNALS和Q_SLOTS。 然后用con...

xiaogaokun的博客 2804

【QT开发】TCP服务器QTcpServer类详解及实战应用

QTcpServer 是 Qt 提供的一个功能强大且灵活的 TCP 服务器类,通过本篇文章的学习,你应该对 QTcpServer 有了全面的理解,能够在自己的项目中正确使用它。QTcpServer 在用户界面中帮助你更好地管理和处理客户端连接,实现高效的 TCP 通信服务,有助于创建用户友好和高效的网络应用场景。

科技改变人类,技术成就未来 3171

QTcpServer实战:如何自定义TCP连接处理流程(含incomingConnection重写示例)

本文深入探讨了如何通过重写QTcpServer的incomingConnection函数来自定义TCP连接处理流程。核心在于理解并接管连接建立过程,使用自定义的QTcpSocket派生类(如示例中的LoggingTcpSocket),并正确调用addPendingConnection。文章提供了完整的实战代码示例,帮助开发者实现协议封装、连接初始化、多线程分配等高级需求,从而构建更灵活、强大的网络服务器应用。

c6d7e8f9g的博客 705

QTcpServer服务详解:Qt Creator实现与应用

在网络编程的世界中,QTcpServer扮演着至关重要的角色。它是Qt框架中的一个类,用于在TCP/IP协议基础上建立一个服务器端的网络服务。QTcpServer能够监听网络端口,接受客户端的连接请求,并管理这些连接,使得数据能够在客户端和服务器之间双向传输。QTcpServer的基本功能可以概括为以下几个方面:监听指定的TCP端口,等待客户端的连接请求。接受新的连接请求,并为每一个连接创建一个新的QTcpSocket对象。发送和接收数据,管理与客户端之间的数据交换。

weixin_32099703的博客 1110

QT学习:QTcpServer多线程实现

QTcpServer多线程实现 目的:每个客户端连接的tcpSocket分别分配一个专门的线程来处理。 实现时分别继承QTcpServer和QTcpScoket实现出自己需要的类。 继承QTcpServer为每个客户端连接时分配线程,并接受处理tcpScoket的信号和槽、、还有发送信息,储存连接信息等。 继承QTcpScoket为处理通信数据和增加信号的参数,以便和tcpServer更好的配合。 首先是继承并重写QTcpServer的incomingConnection函数去自己实现tcpsoc

zjy900507的博客 4627

避坑指南:大疆智图集群建模中5个90%新手会踩的雷(附错误日志分析)

本文针对大疆智图集群建模功能,总结了新手在部署和运行时极易遇到的五个常见问题,包括共享目录权限与路径、主从节点版本一致性、临时存储路径设置、网络与防火墙配置以及错误日志分析。文章结合具体错误日志,提供了详细的排查步骤和解决方案,旨在帮助用户快速定位并解决问题,充分发挥集群建模的效率优势。

weixin_29238147的博客 330

CESM2 实验笔记

文章目录1. 重新启动1.1 关于重启文件2. RUN_TYPE 初始化运行方式startupbranchhybrid3. branch 或者 hybrid运行的示例4. 其他声明5. 关于RESUBMIT 1. 重新启动 参考: https://bb.cgd.ucar.edu/cesm/threads/how-to-restart-cesm2-1-3-fhist-from-a-backup.5245/#post-36275 适用情况:模型运行因时间不足或其它原因中断,需要继续运行 方法1:将CONTIN

qq_38607066的博客 1万+

Qt网络编程(1):QTcpSocket和QTcpServer的基本使用

0.前言 本文主要讲解 Qt TCP 相关接口的基本应用,一些实践相关的后面会单独写。 TCP 协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。 TCP 通过三次握手来建立可靠的连接。 TCP 四次挥手断开连接。TCP连接是双向的,在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。 TCP 知识参考:https://blog.csdn.net/sinat_36

龚建波 6万+

利用树莓派制作智能音箱

利用树莓派制作智能音箱

qq_61803022的博客 1773

Qt网络编程:QTcpSocket 与 QTcpServer 使用详解

摘要: Qt框架的QtNetwork模块为网络通信提供了高效解决方案。文章详细介绍了如何使用QTcpSocket类创建TCP客户端,包括:1)通过信号槽机制实现异步网络通信;2)连接服务器、发送/接收数据的核心流程;3)错误处理和连接状态管理。同时讲解了QTcpServer创建TCP服务器的步骤,包括端口监听、处理新连接以及管理客户端套接字。该方案具有跨平台特性,适用于桌面和嵌入式应用开发,简化了传统套接字编程的复杂性。

greenspan的专栏 2576

避坑指南:中国地面气候日值数据集(V3.0)处理中的常见错误与解决方案

本文详细解析了中国地面气候日值数据集(V3.0)处理中的常见错误与解决方案,包括数据清洗、特征值解码、时间序列处理和质量控制等关键步骤。通过Python实战代码示例,帮助研究者高效处理这一包含全国699个气象站多要素日值数据的数据集,避免常见陷阱,提升气候变化研究和农业气象分析的准确性。

xray4的博客 1014

Air780E模组AT指令实战:5分钟搞定MQTT连接EMQX服务器(附完整代码)

本文详细介绍了如何使用Air780E 4G模组通过AT指令快速连接MQTT服务器。从硬件接线、网络注册到MQTT连接配置,提供了完整的实战步骤和代码示例,帮助开发者快速实现物联网设备的数据上报与远程通信。

wdx012345的博客 734

Qt QTcpServer使用详解与实践

QTcpServer 是 Qt 网络模块中用于创建 TCP 服务端 的核心类,负责监听指定端口、接受客户端连接,并为每个连接创建独立的 QTcpSocket 对象进行通信。

BMN李的博客 1006

制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

实现的功能: l APP控制月球灯 l 本地月球灯控制 l APP控制“大白”颜色,实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯,连接服务器长亮,断开后闪烁 l 配网按键 l 云端定时功能 l 云端报警提示功能 l 云端历史数据查看 l 远程升级介绍 视频演示:【开源】制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)_哔哩哔哩_bilibili 一、界面展示 ...

东小东博客 7108

Qt:QTcpServer

QTcpSocket 功能: QTcpSocket类提供一个TCP套接字 引入: 头文件 #include <QTcpSocket> qmake QT += network 继承 QAbstractSocket 继承者 QSctpSocket 、QSslSocket 详细说明: TCP (Transmission Control Protocol)是一种可靠的、面向流的、面向连接的传输协议。它特别适合于数据的连续传输。 QTcpSocket是QAbstract

OceanStar的博客 2528

前端使用二开Thingsboard一、二、三事(四)-部件库

以项目实战为基础,逐步介绍前端在thingsboard系统二次开发中的一些注意事项以及一些thingsboard一些页面功能讲解,为前端人员开发使用thingsboard提供一种可靠思路,打造一个完美的物联网系统。

weixin_43163457的博客 732

使用 Simulink + Simscape Electrical 实现一个变压器耦合式单相全波整流器的仿真模型

本文介绍了基于Simulink的变压器耦合式单相全波整流器建模与仿真方法。详细说明了从项目创建、模块添加、电路搭建到参数配置的完整建模过程,重点分析了整流器的效率与损耗特性,包括变压器损耗和二极管导通损耗。通过仿真展示了输入输出波形特征,并提出了选用高效元件、优化变压器设计等改进建议。该案例为电力电子系统建模提供了实用参考,有助于深入理解整流电路工作原理和性能优化方法。

amy_mhd的博客 180

qt之QTcpServer

这个QTcpServer 类提供了一个TCP基础连接      这个类创建一个即将到来的tcp连接 调用listen去建立服务,当一个客户连接到达的时候,会发射newConnection()信号。    调用 nextPendingConnection( )去接受一个等待的连接,返回一个指向QTcpSocket        如果出现了错误,将会返回一个错误类型,可以调用errorS

1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

QT QTcpServer多线程服务器

客户端程序 1. 在.pro工程文件中,加入qt 网络支持 QT += core gui \ network 2.创建TcpCilent 类 class TcpCilent : public QTcpSocket { Q_OBJECT public: explicit TcpCilent(QObject *parent = Q_NULLPTR); ~TcpCilent(); bool CilentConect(QHost.

zhaopeng的博客 5079

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Qt一步步搭建TcpServer1——封装QTcpServer,QTcpSocket

序 一安装git 二下载安装depot_tools 三安装chromium其他依赖项 四下载pdfium项目源码 五生成pdfium的vs2015项目 六编译pdfium的vs项目 七结语  本篇直接介绍谷歌开源项目pdfium怎么编译,pdfium是其实官网里已经有很一个介绍,但是是英文的,而且实际会遇到很多问题: 序  注意: 1、所有资源都需要翻墙下载,包括文档,同时,从g

破晓前的彷徨 8551

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Qt网络编程01-QTcpSocket和QTcpServer的基本使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码

宁静致远的博客 7940

从源码角度透视QTcpServer:解构QTcpServer的底层原理与技术细节

TCP(Transmission Control Protocol,传输控制协议)是因特网协议套件中的一部分,它位于传输层,提供可靠的、面向连接的数据传输服务。TCP协议的特点:面向连接:在进行数据传输之前,TCP在通信双方之间建立连接,之后才会开始数据的传输。连接建立包括三步握手,以确保通信的正常进行。可靠性:TCP协议通过序号、确认和重传等机制来确保数据的可靠传输。如果一个数据包未能正确传输,TCP会进行重传以保证数据的完整性。

Lion_Long的博客 3068
上一篇: Qt开发:QHostInfo的使用
下一篇: Qt开发:QTcpSocket的详解
TechNomad
博客等级 码龄2年 787粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值