Qt中的网络编程(TCP)

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

在Qt中网络编程主要由Qt Network模块来编写基于TCP/Ip的网络程序,其中提供了许多的类:

可以点击该链接查看:Qt网络C++类|Qt网络 5.15.12

 常见的有:

QTcpServer 基于 TCP 的服务器
QTcpSocket TCP 套接字
QUdpSocket UDP 套接字
QDtls 此类为 UDP 套接字提供加密

QHostAddress

IP地址
QHostInfo 用于主机名查找的静态函数
QLocalServer 基于本地套接字的服务器
QLocalSocket 本地插座
QNetworkAccessManager 允许应用程序发送网络请求和接收答复
QNetworkCacheMetaData 缓存信息
QNetworkDatagram UDP 数据报的数据和元数据
QNetworkInterface 列出主机的 IP 地址和网络接口
QNetworkProxy 网络层代理

 使用时:需要在pro文件中添加 QT +=network 

Socket(套接字) 

套接字由 ip和端口号组成    ip指定主机  端口指定主机的一个程序,通过套接字来实现网络中两台主机的通信。

TCP 

TCP是用于数据传输的低级网络协议 ,它是一种可靠的、面向流的、面向连接的传输协议。它特别适合数据的连续传输。是一种面向数据流何连接的可靠的传输协议。

TCP分为客户端(TCP Client)和服务器端(TCP Server),在任何数据传输之前,必须建立一个TCP连接到远程的主机和端口上

TCP的两个类:

  • QTcpSocket  (TCP套接字)
  • QTcpServer(TCP服务器)

注意:QTcpSocket是基于流进行传输的

QTcpSocket类 :

QTcpSocket 继承自QAbstractSocket,为TCP提供一个接口

常用的函数:

peer:是对使用TCP协议连接在一起的主机的统称

在任何时候peer都可以关闭连接,这样数据传输就会立刻停止

localAddress()

本地套接字的主机地址(如果可用),否则返回空

等价于QHostAddress::LocalHost(127.0.0.1)用于连接本地主机

localPort() 返回本地套接字的主机端口号,否则返回0
peerAddress() 如果套接字处于连接状态,返回连接的对等方的地址,否则返回NULL
peerName() 返回由connectToHost()指定的对等方的名称
peerPort() 如果套接字处于连接状态,返回连接的对等方的端口
connectToHost() 尝试与给定端口上的主机名建立连接。协议参数可用于指定要使用的网络协议(例如。IPv4 或 IPv6)。
discinnectFromHost() 尝试关闭套接字。如果有挂起的数据等待写入,QABstractSocket 将进入 Closesing State并等待所有数据都写入完毕
error() 返回上次发生的错误类型。
flush() 此函数尽可能多地从内部写入缓冲区写入基础网络套接字,而不会阻塞

isValid()

如果套接字有效且可供使用,返回true否则返回False
proxy() 返回此套接字的网络代理
readBufferSize() 返回内部读取缓冲区的大小
read() 读取数据
write() 写入数据
readDate() 读取数据

readLineData()

读取一行数据
writeData() 写数据
bytesAvailable() 返回可用于读取的字节数
setLocalAddress() 设置地址
setLocalPort() 设置端口号
setPeerAddress() 设置连接端的地址
setPeerName() 设置连接方的主机名
setPeerPort() 设置连接方的端口
setProxy() 设置网络代理
setReadBufferSize() 设置内部读取缓冲区的大小
waitForBytesWrite(int msecs) 此功能将一直阻塞,直到至少一个字节写入套接字并发出 bytesWrite() 信号

waitForReadyRead(int

msecs)

此功能将阻止,直到有新数据可供读取并且发出 readyRead() 信号
waitForConnected(int msecs) 等待直到套接字连接完毕,建立连接返回true 否则返回false
waitForDisConnected(int msecs) 等待直到套接字断开连接

信号:

connected() 成功建立连接后发出
disconnected() 断开连接后发出
errorOccured() 发生错误后发出(Qt 5.15中引入)
readyRead() 每次有新的数据块到达时都会发出

QNetworkProxy::ProxyType:

QNetworkProxy::NoProxy 不使用代理
QNetworkProxy::DefaultProxy 代理是根据使用setApplictionProxy设置的程序代理确定的
QNetworkProxy::Socks5Proxy 使用Socks5代理(任何类型的连接的通用代理)
QNetworkProxy::HttpProxy 使用 HTTP 透明代理(使用“连接”命令实现,仅支持传出TCP连接;支持身份验证。)
QNetworkProxy::HttpCachingProxy 仅代理 HTTP 请求
QNetworkProxy::FtpCachingProxy 仅代理 FTP 请求

客户端的建立过程:

  1. 创建一个QTcpSocke对象,QString 获取信息
  2. 使用connectToHost()来连接服务器端
  3. 如果有数据可用 会触发readyRead()
  4. 创建流,和设置版本号
  5. 使用bytesAvailable()函数来获取数据的大小
  6. 然后通过流读取数据
  7. 如果出现错误,Qt5.15 之前的版本使用SIGNAL(error(QAbstractSocket::SocketError)) Qt5.15版本之后使用errorOccured()

QTcpServer类:

QTcpServer可以接受传入的 TCP 连接。您可以指定端口或让 QTcpServer 自动选择一个端口。您可以侦听特定地址或所有计算机的地址。

函数:

listen(监听地址,端口号) 告知服务器监听某个地址,可以指定端口号,如果端口号为0,则自动选择端口号
close() 关闭服务器
errorString() 返回上次发生的错误
isListening() 是否在监听
maxPendingConnections() 返回挂起的接受连接的最大数目。默认值为 30
nextPendingConnection() 将下一个挂起的连接作为连接的 QTcpsocket 对象返回
pauseAccepting() 暂停接受新连接。排队的连接将保留在队列中
resumeAccepting() 恢复接受新连接.
proxy() 返回此套接字的网络代理,默认为QNetworkProxy::DefaultProxy
serverAddress() 如果服务器正在侦听连接,则返回服务器的地址;
serverError() 返回上次发生的错误的错误代码
serverPort() 如果服务器正在侦听连接,则返回服务器的端口;否则返回 0。
setMaxPendingConnections(int) 设置最大的挂起数,默认情况下,限制为 30 个挂起的连接
setProxy 将此套接字的显式网络代理设置为网络代理
socketDescriptor() 返回服务器用于侦听传入指令的本机套接字描述符,如果服务器未侦听,则返回 -1。
setSocketDescriptor() 设置此服务器在侦听到套接字描述符的传入连接时应使用的套接字描述符
waitForNewConnection(int mesc=0,bool *timeout=nullptr)

等待最多毫秒毫秒或直到传入连接可用。这是一个阻塞函数调用。不建议在单线程 GUI 应用程序中使用它,因为整个应用程序将停止响应,直到函数返回waitForNewConnection()。 在没有可用的事件循环时最有用。

非堵塞的替代方案是连接到newConnection()信号

信号:

acceptError() 当接受新连接导致错误时,将发出此信号
newConnection() 每次有新连接可用时都会发出此信号

使用的大致过程:

  • 创建一个QTcpServer对象
  • 使用listen()来监听传入的连接,每次客户端连接到服务器都会触发newConnection()信号
  • 如果发生错误可以使用 serverError()返回错误的类型,也可以使用errorString()返回具体的描述
  • 调用nextPendingConnection()接受挂起的连接作为连接的QTcpSocket
  • 可以使用 serverAddress()返回正在监听的地址,serverPort()返回正在监听的端口
  • 连接好后需要获取已经连接的套接字
  • 然后使用QTcpSocket::wite()来发送数据
  • 传输完后可以调用qQTcpSocket::disconnectFromHost()来关闭套接字

注意:QTcpServer主要设计用于事件循环,但也可以在没有事件循环的情况下使用,但必须使用waitForNewConnection(),用来阻止(堵塞),直到连接可用或超时到期。

简单的TCP简单的连接: 

TCP服务器端的设计:

创建一个项目名为TCPserver

1.pro文件中添加 QT+=network

Qt中的网络编程(TCP)

 2.再.h文件中添加一个QTcpServer对象

Qt中的网络编程(TCP)

 3.在.cpp文件中添加一些配置

Qt中的网络编程(TCP)

TCP客户端的配置:

创建一个新的项目名为 TCPclient

1.在.pro文件中添加QT+=network

Qt中的网络编程(TCP)

 2.在ui界面中添加以下控件

Qt中的网络编程(TCP)

3. 在.h文件中添加一个QTcpSocket对象和一个QString  quint16 对象

Qt中的网络编程(TCP) 4.在.cpp中进行连接和读取数据

#include "client.h"
#include "ui_client.h"
#include<QMessageBox>
client::client(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::client)
{
    ui->setupUi(this);
    tcpsocket=new QTcpSocket(this);
    connect(tcpsocket,&QTcpSocket::readyRead,this,[=]()//有新数据可用时
    {
        QDataStream in(tcpsocket);//创建流
        in.setVersion(QDataStream::Qt_5_9);//设置版本号,客户端和服务器端的版本号要一致
        if(size==0)//如果刚开始接收数据
        {
            //如果接收的数据小于两个字节,直接返回
            if(tcpsocket->bytesAvailable()<(int)sizeof(quint16)) return;
            in>>size;//大于两个字节的话保存到size中
        }
        //如果没有得到全部的数据,则返回继续接收数据
        if(tcpsocket->bytesAvailable()<size)return;
        in>>str;//将接收的数据存放到变量中
        ui->lineEdit_3->setText(str);//显示数据

    });
    //如果出现错误,输出错误
    connect(tcpsocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));
}

client::~client()
{
    delete ui;
}

void client::on_pushButton_clicked()//点击连接
{
    size=0;//数据大小重置为0
    tcpsocket->abort();//断开已有的连接
    //连接lineEdit中的主机和端口号
    tcpsocket->connectToHost(ui->lineEdit->text(),ui->lineEdit_2->text().toInt());
}
 void client::displayError(QAbstractSocket::SocketError)//显示连接错误
 {
     QString S=tcpsocket->errorString();//错误信息
     QMessageBox::information(this,"提示信息",S,QMessageBox::Ok);
 }

运行结果:

由于是本地主机:可以输入localhost 或127.0.0.1 都可以运行

Qt中的网络编程(TCP)

 Qt中的网络编程(TCP)

参考文献 :

使用Qt |进行网络编程Qt网络 5.15.12

QTcpServer 类 |Qt网络 5.15.12

QTcpSocket Class | Qt Network 5.15.12文章来源地址https://www.toymoban.com/news/detail-471417.html

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

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

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

相关文章

  • 4、QT中的网络编程

    子网网络:局域网,只能进行内网的通信 公网网络:因特网,服务器等可以进行远程的通信 4层模型:应用层、传输层、网络层、物理层 应用层:用户自定义的网络数据传输协议:ssh、tftp、tfp、http 等 传输层:tcp/udp出传输协议 网络层:IPV4/IPV6,3G,4G,5G等网络协议 物理层

    2024年02月09日
    浏览(25)
  • Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令

    Socket 在Java中,Socket是一种用于网络通信的编程接口, 它允许不同计算机之间的程序进行数据交换和通信 。Socket使得网络应用程序能够通过TCP或UDP协议在不同主机之间建立连接、发送数据和接收数据。以下是Socket的基本介绍: Socket类型 :在Java中,有两种主要类型的Socket,分

    2024年02月10日
    浏览(33)
  • 【网络编程】(TCP流套接字编程 ServerSocket API Socket API 手写TCP版本的回显服务器 TCP中的长短连接)

    TCP提供的API主要是两个类:ServerSocket 和 Socket . TCP不需要一个类来表示\\\"TCP数据报\\\"因为TCP不是以数据报为单位进行传输的.是以字节的方式,流式传输 ServerSocket API ServerSocket 是专门给服务器使用的Socket对象. ServerSocket 构造方法: ServerSocket(int port) 创建一个服务端流套接字Socket,并绑

    2024年02月12日
    浏览(53)
  • 【Hello Network】网络编程套接字(一)

    作者:@小萌新 专栏:@网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍网络的基础概念 在互联网中每一台主机都有唯一标识的公网IP地址 在互联网中数据传输的时候报文中需要加上源ip和目的ip 源ip和目的ip本质上解决的是从哪里来到哪里去的问题

    2023年04月17日
    浏览(30)
  • 【Hello Network】网络编程套接字(二)

    作者:@小萌新 专栏:@网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍网络的基础概念 我们使用一个类来封装服务端 当我们定义一个服务器对象之后马上就进行初始化 初始化TCP服务器第一时间就要创建套接字 我们在使用TCP服务的时候用socket函数创

    2023年04月23日
    浏览(33)
  • 【Hello Network】网络编程套接字(三)

    作者:@小萌新 专栏:@网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍下各种类型的Tcp协议 我们在前面的网络编程套接字(二)中写出了一个单执行流的服务器 我们再来回顾下它的运行 我们首先启动服务器 之后启动客户端1 最后启动客户端2 我们

    2023年04月22日
    浏览(33)
  • 【Linux Network】网络编程套接字(代码练习)—UDP

    目录 1. 常用接口 2. C/S 回声模拟 3. C/S myshell 的制作  Linux网络编程✨ 1. 常用接口 socket:创建套接字: 返回值: 套接字创建成功返回一个文件描述符 ,创建失败返回-1,同时错误码会被设置。 参数: domain: 网络通信 设置为 AF_INET(IPv4)或AF_INET6(IPv6) ; type:基于 UDP的网

    2024年02月03日
    浏览(56)
  • 网络编程——TCP编程

    在C语言中进行TCP编程的一般步骤如下: (1) 包含头文件: 在代码中包含必要的头文件,以便使用TCP编程所需的函数和数据类型。通常情况下,你需要包含 sys/socket.h、netinet/in.h 和 arpa/inet.h。 (2) 创建套接字: 使用 socket() 函数创建一个套接字,该套接字将用于网络通信。

    2024年02月05日
    浏览(34)
  • 【网络编程】网络编程套接字(三)TCP网络程序

    与前边的UDP网络程序相同,创建套接字的接口都是socket,下边对socket接口进行介绍: 协议家族选择AF_INET,因为我们要进行网络通信。 而第二个参数,为服务类型,传入SOCK_STREAM,我们编写TCP程序,所以要选择流式的服务。 第三个参数默认传入0,由前两个参数就可以推出这是

    2024年02月16日
    浏览(44)
  • 网络编程 p4 TCP编程

    基本介绍 基于客户端——服务端的网络通信; 底层使用的是TCP/IP协议; 应用场景举例:客户端发送数据,服务端接收并显示在控制台; 基于Socket的TCP编程; 示意图 netstat指令 netstat -an 可以查看当前主机网络情况,包括 端口监听 情况和 网络连接 情况; netstat -an|more 可以分

    2024年02月17日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包