QTcpSocket 和 QUdpSocket 来实现基于 TCP 和 UDP 的网络通信

发布于:2025-05-01 ⋅ 阅读:(43) ⋅ 点赞:(0)

在 Qt 中,您可以通过 QTcpSocket 和 QUdpSocket 来实现基于 TCP 和 UDP 的网络通信。以下是如何使用 Qt 实现这两种通信方式的简要示例。

1. TCP 网络通信

TCP 是面向连接的协议,确保数据的可靠传输。下面是一个简单的 TCP 客户端和服务器示例。

TCP 服务器 (使用 QTcpServer 和 QTcpSocket)

#include <QTcpServer>
#include <QTcpSocket>
#include <QCoreApplication>
#include <QTextStream>
#include <QDebug>

class TcpServer : public QTcpServer {
    Q_OBJECT
public:
    TcpServer() {
        if (!this->listen(QHostAddress::Any, 1234)) {
            qDebug() << "Server could not start!";
            return;
        }
        qDebug() << "Server started on port 1234!";
    }

protected:
    void incomingConnection(qintptr socketDescriptor) override {
        QTcpSocket *clientConnection = new QTcpSocket(this);
        if (clientConnection->setSocketDescriptor(socketDescriptor)) {
            connect(clientConnection, &QTcpSocket::readyRead, this, &TcpServer::onDataReceived);
            connect(clientConnection, &QTcpSocket::disconnected, clientConnection, &QTcpSocket::deleteLater);
            qDebug() << "New client connected!";
        } else {
            delete clientConnection;
        }
    }

private slots:
    void onDataReceived() {
        QTcpSocket *client = qobject_cast<QTcpSocket *>(sender());
        if (client) {
            QByteArray data = client->readAll();
            qDebug() << "Received data:" << data;
            client->write("Hello from server!");
        }
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    TcpServer server;
    return a.exec();
}
#include "main.moc"

TCP 客户端 (使用 QTcpSocket)

#include <QTcpSocket>
#include <QCoreApplication>
#include <QTextStream>
#include <QDebug>

class TcpClient : public QObject {
    Q_OBJECT
public:
    TcpClient() {
        socket.connectToHost("127.0.0.1", 1234);
        if (socket.waitForConnected()) {
            qDebug() << "Connected to server!";
            socket.write("Hello from client!");
            socket.flush();
            socket.waitForBytesWritten();
            socket.waitForReadyRead();
            qDebug() << "Received from server:" << socket.readAll();
        } else {
            qDebug() << "Connection failed!";
        }
    }

private:
    QTcpSocket socket;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    TcpClient client;
    return a.exec();
}

#include "main.moc"

2. UDP 网络通信

UDP 是无连接的协议,数据传输不保证可靠性,因此可以用于实时传输,如视频流或游戏通信。

UDP 服务器 (使用 QUdpSocket)

#include <QUdpSocket>
#include <QCoreApplication>
#include <QTextStream>
#include <QDebug>

class UdpServer : public QObject {
    Q_OBJECT
public:
    UdpServer() {
        socket.bind(QHostAddress::Any, 1234);
        connect(&socket, &QUdpSocket::readyRead, this, &UdpServer::onDataReceived);
        qDebug() << "UDP server started!";
    }

private slots:
    void onDataReceived() {
        QByteArray datagram;
        QHostAddress sender;
        quint16 senderPort;
        while (socket.hasPendingDatagrams()) {
            datagram.resize(int(socket.pendingDatagramSize()));
            socket.readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
            qDebug() << "Received from" << sender.toString() << ":" << senderPort << "Data:" << datagram;
        }
    }

private:
    QUdpSocket socket;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    UdpServer server;
    return a.exec();
}

#include "main.moc"

UDP 客户端 (使用 QUdpSocket)

#include <QUdpSocket>
#include <QCoreApplication>
#include <QTextStream>
#include <QDebug>

class UdpClient : public QObject {
    Q_OBJECT
public:
    UdpClient() {
        QByteArray datagram = "Hello from UDP client!";
        socket.writeDatagram(datagram, QHostAddress("127.0.0.1"), 1234);
        qDebug() << "Datagram sent to server!";
    }

private:
    QUdpSocket socket;
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);
    UdpClient client;
    return a.exec();
}

#include "main.moc"

关键点:

  • TCP 通信使用 QTcpSocket 和 QTcpServer,QTcpServer 负责监听连接,QTcpSocket 用于客户端和服务器之间的数据传输。
  • UDP 通信使用 QUdpSocket,它不需要建立连接,适用于快速且实时的数据传输。数据通过 writeDatagram 方法发送,接收使用 readyRead 信号。
    常见注意事项:
  • TCP 适用于需要可靠数据传输的场合,例如文件传输、聊天应用等。
  • UDP 更适用于对延迟要求较高、但不需要保证每个数据包都到达的应用,例如视频流、游戏等。

网站公告

今日签到

点亮在社区的每一天
去签到