一、异步读写
在 Qt 中实现 TCP 客户端和服务器的同步和异步读写消息涉及使用 QTcpSocket 和 QTcpServer 类。这两个类提供了用于建立 TCP 连接、发送和接收数据的功能。下面是一个简单的示例,演示了如何在 Qt 中实现 TCP 客户端和服务器的同步和异步读写消息:
TCP 服务器端示例(异步)
#include <QCoreApplication> #include <QTcpServer> #include <QTcpSocket> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTcpServer server; server.listen(QHostAddress::Any, 1234); // 监听端口 1234 QObject::connect(&server, &QTcpServer::newConnection, [&](){ QTcpSocket* clientSocket = server.nextPendingConnection(); QObject::connect(clientSocket, &QTcpSocket::readyRead, [&](){ QByteArray requestData = clientSocket->readAll(); qDebug() << "Received request from client:" << requestData; // Echo back the received data clientSocket->write(requestData); }); }); qDebug() << "TCP server started. Listening on port 1234..."; return a.exec(); }
TCP 客户端端示例(异步)
#include <QCoreApplication> #include <QTcpSocket> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTcpSocket client; client.connectToHost("127.0.0.1", 1234); // 连接到服务器的 IP 地址和端口 QObject::connect(&client, &QTcpSocket::connected, [&](){ qDebug() << "Connected to server."; // Send a message to the server client.write("Hello, Server!"); }); QObject::connect(&client, &QTcpSocket::readyRead, [&](){ QByteArray responseData = client.readAll(); qDebug() << "Received response from server:" << responseData; }); return a.exec(); }
示例简单演示了如何在 Qt 中实现 TCP 客户端和服务器的异步读写消息。在异步通信中,使用信号和槽机制来处理数据的接收和发送。
二、同步读写
以下是一个简单的示例,演示了如何在 Qt 中实现 TCP 客户端和服务器的同步读写消息:
TCP 服务器端示例(同步)
#include <QCoreApplication> #include <QTcpServer> #include <QTcpSocket> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTcpServer server; server.listen(QHostAddress::Any, 1234); // 监听端口 1234 if (!server.isListening()) { qDebug() << "Failed to start TCP server."; return 1; } QTcpSocket* clientSocket = nullptr; while (true) { if (server.hasPendingConnections()) { clientSocket = server.nextPendingConnection(); break; } } if (clientSocket) { qDebug() << "Client connected."; // Read data from client QByteArray requestData = clientSocket->readAll(); qDebug() << "Received request from client:" << requestData; // Echo back the received data clientSocket->write(requestData); } return a.exec(); }
TCP 客户端端示例(同步)
#include <QCoreApplication> #include <QTcpSocket> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTcpSocket client; client.connectToHost("127.0.0.1", 1234); // 连接到服务器的 IP 地址和端口 if (!client.waitForConnected()) { qDebug() << "Failed to connect to server."; return 1; } qDebug() << "Connected to server."; // Send a message to the server client.write("Hello, Server!"); if (!client.waitForBytesWritten()) { qDebug() << "Failed to write data to server."; return 1; } if (!client.waitForReadyRead()) { qDebug() << "Failed to read response from server."; return 1; } // Read response from server QByteArray responseData = client.readAll(); qDebug() << "Received response from server:" << responseData; return a.exec(); }
示例简单演示了如何在 Qt 中实现 TCP 客户端和服务器的同步读写消息。在同步通信中,使用 waitForConnected、waitForBytesWritten 和 waitForReadyRead 等方法来等待连接建立、数据写入和数据读取完成。这种方式适用于需要确保数据传输完整性和顺序性的场景。