Josan学QT网络编程02-QTcpSocket

本文是Josan学QT网络编程系列的第二篇,重点介绍了QTcpSocket类。QTcpSocket提供TCP套接字功能,适合可靠的数据传输。作为QAbstractSocket的子类,它简化了TCP连接和数据流的处理。文章包括官方文档翻译、测试函数示例及源代码下载链接,鼓励读者动手实践以加深理解。
摘要由CSDN通过智能技术生成

Josan学QT网络编程02-QTcpSocket

导读

PS: 如果你在之前的文章,看过导读,那么你可以跳过这段的阅读。如果没有看过导读,我建议你耐心的看完。这样有助于你更快的获取新知识。

  • 文章编写的整体思路
    先简单描述一下某个类,一般以QT官网的”Detalied Description”为主;
    然后是自己测试这个类的接口所用到的测试函数。测试函数的有测试结果说明以及对某个函数的解释说明。强烈建议你,自己跑一下测试函数,光看的话,印象是不深刻的。
    最后,送上一些参考链接,代码下载地址,以及自己的学习群:676908519。欢迎爱分享的小伙伴入群交流讨论。
    翻译说明:
    1. 对于一些常用的专业词汇,尽量不翻译,使用英文说明。
    2. 对于自己把握不是很准备的语句,会选择性跳过。
    3. 本翻译不是默守陈规式的翻译,对于一些语句翻译,会追加一些个人心得的补充。

QTcpSocket

官方文档翻译

QTcpSocket提供了一个TCP套接字。
TCP提供一个可靠的,面向字节的,面向连接的传输协议。它尤其适用于连续性传输数据。
QTcpSocket是QAstractSocket的子类。在建立TCP连接,传输数据流的时候,QTcpSocket显得十分方便。更多信息,可以参考QAbstractSocket文档说明
注意:TCP套接字不能以QIODevice::Unbuffered的模式打开,TCP套接字必须使用缓存

  • // 服务端主体代码
/**
 *  Josan学QT网络编程02-QTcpSocket
 */

connect(tcpServer, &QTcpServer::newConnection,
        [=]()
{
    qcout << "---------------------before connected -------------------";
    // 由于在connect之前,tcpSocket是nullptr。因此,不能调用这些内容QTcpSocket提供的接口

    tcpSocket = tcpServer->nextPendingConnection();

    qcout << "-------------------- after connected -------------------";
    // test tcpSocket相关属性值
    // error信号,还有信号信息
    qcout << "tcpSocket error        : " << tcpSocket->error();                           // QAbstractSocket::UnknownSocketError
    // 本地的地址和端口
    qcout << "tcpSocket local address: " << tcpSocket->localAddress().toString();         // 127
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你的问题是关于 QTcpSocket 自动重连的。为了实现 QTcpSocket 的自动重连,可以使用 QTimer 和 QTcpSocket 的 error() 信号。具体步骤如下: 1. 设置一个 QTimer,用于定时重连 QTcpSocket。 2. 创建 QTcpSocket,并连接它的 error() 信号到一个槽函数中。 3. 在槽函数中判断 error() 信号传递的错误码是否为 QAbstractSocket::RemoteHostClosedError。 4. 如果错误码为 QAbstractSocket::RemoteHostClosedError,则说明连接已经断开,重连 QTcpSocket。 5. 如果错误码为其他值,则说明连接出现了其他错误,不再重连。 下面是示例代码: ```cpp class MySocket : public QObject { Q_OBJECT public: explicit MySocket(QObject *parent = nullptr); private slots: void reconnect(); void onSocketError(QAbstractSocket::SocketError error); private: QTcpSocket *m_socket; QTimer *m_timer; }; MySocket::MySocket(QObject *parent) : QObject(parent) { m_socket = new QTcpSocket(this); connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onSocketError(QAbstractSocket::SocketError))); m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(reconnect())); } void MySocket::onSocketError(QAbstractSocket::SocketError error) { if (error == QAbstractSocket::RemoteHostClosedError) { m_timer->start(5000); // 5s 后重连 } else { qDebug() << "Socket error: " << m_socket->errorString(); } } void MySocket::reconnect() { m_socket->connectToHost("127.0.0.1", 1234); if (m_socket->waitForConnected(5000)) { m_timer->stop(); } } ``` 在上面的示例中,如果 QTcpSocket 的 error() 信号传递的错误码为 QAbstractSocket::RemoteHostClosedError,则启动定时器,在 5 秒后重连 QTcpSocket。如果连接成功,则停止定时器。如果连接出现其他错误,则输出错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值