目录
引言
QT是一个跨平台的C++图形用户界面应用程序开发框架,它不仅支持GUI程序的开发,也支持非GUI程序,如控制台工具和服务器。在QT的众多功能中,网络编程是一个重要的组成部分,使得开发者能够轻松构建基于TCP/IP协议的网络应用程序。本文将详细介绍QT网络编程的知识体系,包括网络编程的基本概念、QT网络编程的核心类以及实战示例。
一、网络编程基本概念
1. TCP与UDP
- TCP(传输控制协议):是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过三次握手建立连接,确保数据的可靠传输。
- UDP(用户数据报协议):是一种无连接的、不可靠的传输层协议。UDP不保证数据包的顺序和完整性,但传输速度快,适用于对实时性要求较高的应用。
2. 套接字(Socket)
套接字是网络通信的基石,它提供了一种抽象,使得不同计算机之间的应用程序可以通过网络进行通信。在QT中,网络通信主要通过套接字类实现。
二、QT网络编程核心类
请确保你的QT项目文件(.pro)中包含了网络模块的支持,这通常是通过在.pro文件中添加QT += network
来实现的。这样,QT的构建系统就会知道你的项目需要使用QT的网络功能,并相应地链接必要的库。在用到相关类时需添加相关的头文件。
1. QTcpServer
QTcpServer
类用于创建一个TCP服务器,监听进来的连接请求,并可以处理这些连接。主要成员函数包括:
listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
: 监听指定地址和端口的连接请求。newConnection()
: 当有新的连接请求时,会发出此信号。nextPendingConnection()
: 返回下一个待处理的连接。
2. QTcpSocket
QTcpSocket
类用于TCP客户端或服务器端的套接字编程。主要成员函数包括:
connectToHost(const QString &hostName, quint16 port, OpenMode openMode = ReadWrite)
: 连接到指定的主机和端口。readyRead()
: 当有新数据可读时,会发出此信号。readAll()
: 读取所有待处理的数据。
3. QNetworkInterface
QNetworkInterface
类提供了网络接口的信息,如IP地址、子网掩码等。主要成员函数包括:
allAddresses()
: 返回所有网络接口的地址列表。
4. QHostInfo
QHostInfo
类用于查询主机名对应的IP地址信息。主要成员函数包括:
fromName(const QString &hostName)
: 异步查询主机名的IP地址信息。addresses()
: 返回查询到的IP地址列表。
三、实战示例
示例1:获取本地主机名称和IP地址及所有信息
- UI界面
-
核心代码
#include "gethostnameipinfo.h"
#include "ui_gethostnameipinfo.h"
GetHostNameIPInfo::GetHostNameIPInfo(QWidget *parent)
: QDialog(parent)
, ui(new Ui::GetHostNameIPInfo)
{
ui->setupUi(this);
}
GetHostNameIPInfo::~GetHostNameIPInfo()
{
delete ui;
}
void GetHostNameIPInfo::GetHostNameAndIPAddress() // 获取主机名称和IP地址
{
// 获取主机名称
QString StrLocalHostName = QHostInfo::localHostName();
ui->lineEdit_HostName->setText(StrLocalHostName);
// 根据主机名称获取相应的IP地址
QString StrLocalIPAddress = "";
QHostInfo hostinfo = QHostInfo::fromName(StrLocalHostName);
QList<QHostAddress> ipaddresslist = hostinfo.addresses();
if(!ipaddresslist.isEmpty())
{
for(int i = 0; i < ipaddresslist.size(); i++)
{
QHostAddress hostaddress = ipaddresslist.at(i);
if(QAbstractSocket::IPv4Protocol == hostaddress.protocol())
{
StrLocalIPAddress = hostaddress.toString();
break;
}
}
ui->lineEdit_IP->setText(StrLocalIPAddress);
}
}
void GetHostNameIPInfo::on_pushButton_GetHostNameIP_clicked()
{
GetHostNameAndIPAddress();
}
void GetHostNameIPInfo::on_pushButton_GetHostInfo_clicked()
{
QString StrTemp = "";
// 返回主机所找到的所有网络接口的列表
QList<QNetworkInterface> netlist = QNetworkInterface::allInterfaces();
for(int i = 0; i < netlist.size(); i++)
{
QNetworkInterface netinterfaces = netlist.at(i);
StrTemp += "设备名称:" + netinterfaces.name() + "\n"; // 获取设备名称
StrTemp += "硬件地址:" + netinterfaces.hardwareAddress() + "\n"; // 获取硬件地址
QList<QNetworkAddressEntry> entrylist = netinterfaces.addressEntries(); // 遍历每一个IP地址对应的信息
for(int j = 0; j < entrylist.count(); j++)
{
QNetworkAddressEntry etry = entrylist.at(j);
StrTemp += "IP地址:" + etry.ip().toString() + "\n"; // 获取设备IP地址
StrTemp += "子网掩码:" + etry.netmask().toString() + "\n"; // 获取子网掩码
StrTemp += "广播地址:" + etry.broadcast().toString() + "\n"; // 获取子网掩码
}
}
ui->label_AllInfo->setText(StrTemp);
}
-
运行结果
示例2:查询域名或IP地址
- UI界面
- 核心代码
#include "getdomainips.h"
#include "ui_getdomainips.h"
GetDomainIps::GetDomainIps(QWidget *parent)
: QDialog(parent)
, ui(new Ui::GetDomainIps)
{
ui->setupUi(this);
}
GetDomainIps::~GetDomainIps()
{
delete ui;
}
// 网络层协议
QString GetDomainIps::ProtocolTypeName(QAbstractSocket::NetworkLayerProtocol protocoltype)
{
switch (protocoltype)
{
case QAbstractSocket::IPv4Protocol:
return "IPv4 Protocol";
case QAbstractSocket::IPv6Protocol:
return "IPv6 Protocol";
case QAbstractSocket::AnyIPProtocol:
return "Any IP Protocol";
default:
return "Unknown Network Layer Protocol";
}
}
// 获取IP地址列表
void GetDomainIps::LookupHostInfoFunc(const QHostInfo &host)
{
QList<QHostAddress> addresslist = host.addresses();
for(int i = 0; i < addresslist.count(); i++)
{
QHostAddress host = addresslist.at(i);
ui->plainTextEdit_outputDomainIp->appendPlainText("协议类型:"+ProtocolTypeName(host.protocol()));
ui->plainTextEdit_outputDomainIp->appendPlainText("本机IP地址:"+host.toString()+"\n");
}
}
void GetDomainIps::on_pushButton_clear_clicked()
{
ui->plainTextEdit_outputDomainIp->clear();
}
void GetDomainIps::on_pushButton_GetDomainIp_clicked()
{
QString strhostname = ui->lineEdit_inputUrl->text();
ui->plainTextEdit_outputDomainIp->appendPlainText("查询主机信息:"+strhostname+"\n");
QHostInfo::lookupHost(strhostname,this,SLOT(LookupHostInfoFunc(QHostInfo)));
}
- 运行结果
四、总结
通过本篇文章,你已经基本了解了QNetworkInterface和QHostInfo两个类及其核心成员函数的使用,可以自己动手实战一下,后面将持续介绍Qt中TCP协议和UDP协议的工作原理及实战!!!