当前位置: 首页 > wzjs >正文

网站集约化建设 通知合肥网站建设

网站集约化建设 通知,合肥网站建设,网站开发备案认证,开发小程序服务热线文章目录 实现思路示例代码代码解释主要功能和用法注意事项 在 Qt 5.9.9 的 C 开发中,使用 QTcpSocket 时,要判断是服务端主动断开 TCP Socket 连接,可以通过处理 QTcpSocket 的 disconnected 信号,结合 QTcpSocket 的状态以及…

文章目录

      • 实现思路
      • 示例代码
      • 代码解释
      • 主要功能和用法
      • 注意事项

在 Qt 5.9.9 的 C++ 开发中,使用 QTcpSocket 时,要判断是服务端主动断开 TCP Socket 连接,可以通过处理 QTcpSocketdisconnected 信号,结合 QTcpSocket 的状态以及相关事件信息来综合判断。以下是具体的实现思路和示例代码:

实现思路

  1. 监听 disconnected 信号:当连接断开时,QTcpSocket 会发出 disconnected 信号,我们可以在槽函数中处理该信号。
  2. 检查连接状态:在 disconnected 信号的槽函数中,检查 QTcpSocket 的状态,判断是否为主动断开。可以结合网络错误码、服务端发送的特定消息等进行判断。
  3. 服务端主动断开的特征判断:例如,如果服务端在断开连接前发送了特定的关闭消息,客户端接收到该消息后就可以知道是服务端主动断开;或者通过网络错误码判断是否是服务端正常关闭连接。
    在这里插入图片描述

示例代码

#include <QtNetwork/QTcpSocket>
#include <QDebug>
#include <QCoreApplication>class MyTcpClient : public QObject
{Q_OBJECT
public:MyTcpClient(QObject *parent = nullptr) : QObject(parent){socket = new QTcpSocket(this);connect(socket, &QTcpSocket::disconnected, this, &MyTcpClient::onDisconnected);connect(socket, &QTcpSocket::readyRead, this, &MyTcpClient::onReadyRead);// 连接到服务端socket->connectToHost("127.0.0.1", 12345);}private slots:void onDisconnected(){// 检查是否是服务端主动断开if (socket->state() == QAbstractSocket::UnconnectedState) {// 可以进一步根据错误码判断if (socket->error() == QAbstractSocket::RemoteHostClosedError) {qDebug() << "Server主动断开连接";} else {qDebug() << "连接断开,错误码:" << socket->errorString();}}}void onReadyRead(){QByteArray data = socket->readAll();// 假设服务端发送 "CLOSE_CONNECTION" 表示主动断开连接if (data == "CLOSE_CONNECTION") {qDebug() << "收到服务端断开连接消息,即将断开连接";socket->disconnectFromHost();}}private:QTcpSocket *socket;
};#include "main.moc"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);MyTcpClient client;return a.exec();
}
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>
#include <QDebug>
#include <QCoreApplication>class MyServer : public QTcpServer
{Q_OBJECT
public:explicit MyServer(QObject *parent = nullptr) : QTcpServer(parent) {}protected:void incomingConnection(qintptr socketDescriptor) override{QTcpSocket *socket = new QTcpSocket(this);if (!socket->setSocketDescriptor(socketDescriptor)) {qDebug() << "Failed to set socket descriptor.";delete socket;return;}connect(socket, &QTcpSocket::readyRead, this, [socket]() {QByteArray data = socket->readAll();qDebug() << "Received from client:" << data;// 将收到的数据原样返回给客户端socket->write(data);});connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);}
};#include "server.moc"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);MyServer server;if (!server.listen(QHostAddress::Any, 12345)) {qDebug() << "Server could not start!";} else {qDebug() << "Server started!";}return a.exec();
}
#include <QtNetwork/QTcpSocket>
#include <QDebug>
#include <QCoreApplication>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTcpSocket socket;socket.connectToHost(QHostAddress::LocalHost, 12345);if (socket.waitForConnected()) {qDebug() << "Connected to server!";// 向服务器发送消息socket.write("Hello, server!");socket.waitForBytesWritten();if (socket.waitForReadyRead()) {QByteArray data = socket.readAll();qDebug() << "Received from server:" << data;}} else {qDebug() << "Connection failed!";}socket.disconnectFromHost();if (socket.state() != QAbstractSocket::UnconnectedState) {socket.waitForDisconnected();}return a.exec();
}

代码解释

  1. MyTcpClient:继承自 QObject,封装了 QTcpSocket 对象,用于处理与服务端的连接。
  2. 构造函数:创建 QTcpSocket 对象,并连接 disconnectedreadyRead 信号到相应的槽函数。然后尝试连接到服务端。
  3. onDisconnected 槽函数:在连接断开时被调用,检查 QTcpSocket 的状态和错误码。如果错误码为 QAbstractSocket::RemoteHostClosedError,则表示服务端主动断开连接。
  4. onReadyRead 槽函数:在有数据可读时被调用,检查服务端发送的数据。如果收到特定的关闭消息(如 “CLOSE_CONNECTION”),则认为服务端要主动断开连接,调用 disconnectFromHost() 方法断开连接。

主要功能和用法

  • 1 包含必要的头文件
    在使用 QTcpSocket 之前,需要包含相应的头文件,并在 .pro 文件中添加 QT += network 以引入网络模块。
#include <QtNetwork/QTcpSocket>
  • 2 创建 QTcpSocket 对象
QTcpSocket *socket = new QTcpSocket(this);
  • 3 连接到服务器(客户端)
socket->connectToHost(QHostAddress::LocalHost, 12345);
// 可以使用 waitForConnected 等待连接成功
if (socket->waitForConnected()) {qDebug() << "Connected to server!";
} else {qDebug() << "Connection failed!";
}
  • 4.发送数据
QByteArray data = "Hello, server!";
socket->write(data);
// 可以使用 waitForBytesWritten 等待数据发送完成
if (socket->waitForBytesWritten()) {qDebug() << "Data sent successfully!";
}
  • 5.接收数据
// 连接 readyRead 信号到槽函数
connect(socket, &QTcpSocket::readyRead, this, [socket]() {QByteArray data = socket->readAll();qDebug() << "Received data:" << data;
});
  • 6.断开连接
socket->disconnectFromHost();
// 可以使用 waitForDisconnected 等待断开连接完成
if (socket->waitForDisconnected()) {qDebug() << "Disconnected from server!";
}
  • 7.错误处理
connect(socket, QOverload<QAbstractSocket::SocketError>::of(&QTcpSocket::error),[](QAbstractSocket::SocketError socketError) {qDebug() << "Socket error:" << socketError;
});// 获取错误信息
qDebug() << "Error message:" << socket->errorString();

注意事项

  • 上述示例中的错误码判断和特定消息判断只是一种常见的方式,具体的判断逻辑需要根据实际的业务需求和服务端的实现进行调整。
  • 确保服务端和客户端对断开连接的消息和状态处理达成一致,避免出现误解。
http://www.dtcms.com/wzjs/273914.html

相关文章:

  • 地方性网站赚钱seo薪资seo
  • 网站优化方案范文营销型企业网站诊断
  • 上海龙元建设网站成都关键词优化排名
  • 找工作临时工运营seo是什么意思
  • 做网站需要什么线上推广的方式
  • 国外辣妹服装设计网站推荐社交媒体推广
  • 彩票网站建设需要什么自己怎样在百度上做推广
  • 六安门户网站建设哪家好大数据推广公司
  • 乌鲁木齐建设主管部门网站重庆网站排名提升
  • 健康网站模板怎么做游戏推广员
  • 四川营销型网站建设超链接友情外链查询
  • 赌博网站建设第三方关键词优化排名
  • 自贡建设能源开发有限公司网站大兴今日头条新闻
  • 手机便宜电商网站建设疫情最新消息今天封城了
  • 广西南宁建设银行最新招聘网站一个产品的网络营销方案
  • 长沙的汽车网站建设skr搜索引擎入口
  • 西安网站制作优化建站平台哪个好
  • 上线了小程序官网登录重庆seo网络优化咨询热线
  • flash做网站通栏百度关键词排名qq
  • 桓台网站制作南宁seo外包平台
  • 网站建设 10万元广州网站排名优化公司
  • 网站模板安卓广告平台网站有哪些
  • 无锡网站建设哪家做seo网络推广公司排名
  • 大型网站建设与维护过程太原seo计费管理
  • 做视频的网站那几个盈利了代运营公司排行榜
  • 我想自己做网站吗免费开店的电商平台
  • 网站建设电话营销推广
  • 滕州住房城乡建设局网站搜索引擎广告案例
  • 微信公众号开发平台聊城优化seo
  • react做的电商网站能上线吗合肥正规的seo公司