【Qt开发流程】之TCP

这篇具有很好参考价值的文章主要介绍了【Qt开发流程】之TCP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输协议。它是互联网协议套件中的一部分,用于在网络上可靠地传输数据。
TCP通过建立连接、数据传输和连接终止三个阶段来进行通信。在建立连接阶段,客户端和服务器之间会进行握手,确认彼此的身份并建立一个可靠的连接。在数据传输阶段,数据会被分成小的数据包,每个数据包都包含序列号,接收方会根据序列号对数据包进行排序和重组,以确保数据的正确顺序和完整性。在连接终止阶段,连接会被关闭,释放资源。

TCP提供了可靠的数据传输服务,通过使用确认和重传机制来确保数据的准确性和完整性。它还支持流量控制和拥塞控制机制,以避免网络拥塞和数据丢失。TCP的连接是全双工的,意味着数据可以在两个方向上同时传输。

同时,TCP是一种面向连接的协议,这意味着在进行通信之前,客户端和服务器必须先进行握手建立连接。这种连接的特点是可靠性和顺序性,数据包会按照发送的顺序被接收方接收和处理。

【Qt开发流程】之TCP,Qt开发流程,tcp/ip,qt,网络

QTcpSocket

QTcpSocket类提供一个TCP套接字。该类继承于QAbstractSocket。
QTcpSocket是异步进行工作的,通过发送信号来报告状态改变和错误信息,依靠事件循环来检测接收的数据。
可以使用QTcpSocket::write()方法写入数据,使用QTCPSocket::read()方法读取数据。
当从一个QTcpSocket中读取数据前,必须先调用QTcpSocket::bytesAvailable()函数来确保已有足够的数据可用。
如果要处理到来的TCP连接,需要使用到QTcpServer类。

QTcpServer

QTcpServer类提供了一个基于tcp的服务器。
这个类使得接受传入的TCP连接成为可能。可以指定端口,也可以让QTcpServer自动选择一个。可以监听一个特定的地址,也可以监听所有机器的地址。
调用listen()让服务器侦听传入的连接。然后,每次客户端连接到服务器时都会发出newConnection()信号。
调用nextPendingConnection()将挂起的连接作为已连接的QTcpSocket接受。该函数返回QAbstractSocket::ConnectedState中指向QTcpSocket的指针,可以使用该指针与客户端进行通信。
如果发生错误,serverError()返回错误的类型,并且可以调用errorString()来获得关于发生的错误描述。
当监听连接时,服务器正在监听的地址和端口可以作为serverAddress()和serverPort()使用。
调用close()使QTcpServer停止侦听传入的连接。
虽然QTcpServer主要是为与事件循环一起使用而设计的,但是不使用事件循环也可以使用它。在这种情况下,必须使用waitForNewConnection(),它会阻塞,直到连接可用或超时过期。

bool QTcpServer::waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR)
最多等待几毫秒,或者直到进入的连接可用为止。如果连接可用,则返回true;否则返回false。如果操作超时且timemedout不为0,则* timemedout将被设置为true。
这是一个阻塞函数调用。不建议在单线程GUI应用程序中使用它,因为整个应用程序将停止响应,直到函数返回。waitForNewConnection()在没有事件循环可用时非常有用。
非阻塞的替代方法是连接到newConnection()信号。
如果msec为-1,则该函数不会超时。

TCP 客户端和服务端连接流程

【Qt开发流程】之TCP,Qt开发流程,tcp/ip,qt,网络

示例

先上UI
【Qt开发流程】之TCP,Qt开发流程,tcp/ip,qt,网络
服务端监听,客户端连接,如果成功,服务端发送helloworld,客户端显示
server部分源码

    m_pServer = new QTcpServer(this);
    if(!m_pServer->listen(QHostAddress::LocalHost, 4567))
    {
        QMessageBox::information(this, "prompt", m_pServer->errorString());
        return;
    }
    connect(m_pServer, &QTcpServer::newConnection, this, &MainWindow::slot_sendMsg);
}
void MainWindow::slot_sendMsg()
{
    QByteArray ba("helloworld");

    QTcpSocket* m_pSocket = m_pServer->nextPendingConnection();
    connect(m_pSocket, &QTcpSocket::disconnected, m_pSocket, &QTcpSocket::deleteLater);
    m_pSocket->write(ba, ba.size());
    m_pSocket->disconnectFromHost();
    ui->plainTextEdit->appendPlainText(QString("发送数据 :%1").arg(QString(ba)));
}
  • 解释:
    首先创建一个Server对象,然后监听本地主机的4567端口,如果成功,就发射newConnection()信号
    client部分源码
    m_pSocket = new QTcpSocket(this);


    connect(m_pSocket, &QTcpSocket::readyRead, this, [=](){
        QString strInfo;
        strInfo = m_pSocket->readAll();
        ui->plainTextEdit->appendPlainText(strInfo);
    });
}

void MainWindow::on_toolButton_con_clicked()
{
    m_pSocket->abort();
    m_pSocket->connectToHost(ui->lineEdit->text(), ui->lineEdit_2->text().toShort());
}
  • 解释
    连接本地主机的4567端口,当有可读数据时,发送readyRead()信号。

使用场景

  1. 网页浏览:当用户在浏览器中请求网页时,使用HTTP协议进行通信,而HTTP通常基于TCP协议。TCP确保网页的可靠传输,确保网页内容的准确性和完整性。

  2. 文件传输:当用户需要通过网络传输文件时,常用的协议如FTP(文件传输协议)和SCP(Secure Copy)使用TCP协议。TCP可以确保文件的完整性和准确性。

  3. 电子邮件:SMTP(简单邮件传输协议)和POP3(邮局协议版本3)都使用TCP协议。TCP保证了邮件的可靠传输,以及邮件的正确接收和发送。

  4. 远程登录:如Telnet和SSH(安全外壳)协议使用TCP协议进行远程登录。TCP提供了稳定的连接,确保远程用户的输入和输出可以正确传输。

  5. 数据库访问:在数据库服务器和客户端之间进行数据的传输和交互时,使用TCP协议进行连接和通信。TCP保证了数据的完整性和可靠性。

结论

心有多大,舞台就有多大文章来源地址https://www.toymoban.com/news/detail-830182.html

到了这里,关于【Qt开发流程】之TCP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt下Tcp套接字(socket)通信的整个流程

    QT += network Qt中提供的所有的Socket类都是非阻赛的 Qt中常用的用于socket通信的套接字类         QTcpServer 用于TCP/IP通信,作为服务器端套接字使用         QTcpSocket 用于TCP/IP通信,作为客户端套接字使用。         QUdpSocket 用于UDP通信,服务器,客户端均使用此套接字

    2024年02月10日
    浏览(32)
  • QT程序设计多人聊天室(基于QT、sqlite3、TCP/IP)

    目录 技术路线 效果展示 程序主体 sqoperator.h mylogin.h myenroll.h chatinterface.h tips.h myapp.h ******************* sqoperator.cpp mylogin.cpp myenroll.cpp chatinterface.cpp tips.cpp myapp.cpp main.cpp widget.h widget.cpp main.cpp QT程序设计、sqlite数据库调用、TCP/IP客户端与服务端的搭建 通过次程序代码,可以学习如

    2024年02月09日
    浏览(60)
  • QT网络编程之TCP

    TCP 编程需要用到俩个类: QTcpServer 和 QTcpSocket。

    2024年02月13日
    浏览(33)
  • Qt实现TCP网络通信

    在标准C++中没有提供专门用于套接字通信的类,所以只能使用操作系统提供的基于C语言的API函数,基于这些C的API函数我们也可以封装自己的C++类。或者我们可以使用Qt框架,它提供了用于套接字通信的类(TCP、UDP)这样我们就可以直接调用相关API即可。 使用Qt提供的类进行基于

    2024年04月17日
    浏览(41)
  • Qt中的网络编程(TCP)

    在Qt中网络编程主要由Qt Network模块来编写基于TCP/Ip的网络程序,其中提供了许多的类: 可以点击该链接查看:Qt网络C++类|Qt网络 5.15.12  常见的有: QTcpServer 基于 TCP 的服务器 QTcpSocket TCP 套接字 QUdpSocket UDP 套接字 QDtls 此类为 UDP 套接字提供加密 QHostAddress IP地址 QHostInfo 用于主

    2024年02月07日
    浏览(99)
  • QT网络通信-TCP、UDP通信

    时间记录:2024/1/17 pro文件添加模块network (1)创建TCP服务器对象 QTcpServer (2)为 QTcpServer 对象的 newConnection 信号绑定槽,用来监听TCP客户端的新连接,有新的客户端连接便会触发此信号 (3)使用 nextPendingConnection 方法获取连接的Tcp客户端对象 QTcpSocket (4)为 QTcpSocket 的 r

    2024年01月18日
    浏览(57)
  • Qt 实现简单的tcp网络通信

    背景: 最近计网要结课了,匆忙之间有个计网实验还没做。 上网这里查查那里查查,随便搞搞 然后在 这篇文章里找到了能够实现的代码 自己想着把它图形化一下,最后在超级棒棒糖的帮助下实现了。 工具头文件tool.h 该头文件用于添加一些要用到的库,直接引用这个库,比

    2024年02月01日
    浏览(39)
  • QT TCP网络编程——服务端的实现

    温馨提示:初来乍到,请多关照,文章如有不足,还请不吝赐教。本程序是仿照通讯助手(NetAssist.exe)进行界面设计以及基本功能实现的,主要实现的功能有监听服务器端口、发送、接收数据。使用到的工具及编程语言为:visual studio 2015、QT、C++,其中代码仅供参考 提示:以

    2024年02月04日
    浏览(41)
  • 【Qt网络编程】实现TCP协议通信

    传输控制协议(TCP,Transmission Control Protocol)是 一种面向连接的、可靠的、基于字节流的传输层通信协议 ,由IETF的RFC 793 定义。 TCP建立连接前,需要进行三次握手,如下图所示: TCP断开连接前,需要进行四次挥手,如下图所示: Qt中提供了QTcpSocket类和QTcpServer类分别用于创

    2024年02月16日
    浏览(46)
  • QT学习TCP/IP通信(一个服务端对多个客户端)

    QT学习TCP/IP通信(一个服务端对多个客户端) 一、服务端: 1.创建QTcpServer对象 2.启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号) 3.定义一个QLis容器对象存储客户信息; 4.当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包