1、QT地址获取
1.1 QT工程文件
QT += network
1.2 相关类
QHostAddress IP地址
QHostInfo 主机信息
QNetworkInterface 主机的IP地址和网络接口列表
1.3 地址获取
//获取主机名
QString localHostName = QHostInfo::localHostName();
ui->label_hostname->setText(localHostName);
//获取本机的IP地址
QHostInfo info = QHostInfo::fromName(localHostName);
qDebug()<<"IP:"<<info.addresses();
QList<QHostAddress> address = info.addresses();
foreach (QHostAddress addr, address)
{
//挑选出ipv4的地址
if(addr.protocol() == QAbstractSocket::IPv4Protocol)
qDebug()<<addr.toString();
}
//直接通过QNetworkInterface拿到QList<QHostAddress>
QList<QHostAddress> addrs = QNetworkInterface::allAddresses();
foreach (QHostAddress addr, addrs)
{
//挑选出ipv4的地址
if(addr.protocol() == QAbstractSocket::IPv4Protocol
&& addr.toString() != "127.0.0.1")
{
qDebug()<<addr.toString();
ui->label_ip->setText(addr.toString());
}
}
//访问更详细的网络接口信息
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
foreach (QNetworkInterface i, list) {
qDebug()<<i.name();//网络接口名
qDebug()<<i.hardwareAddress();//硬件地址
//获取子网掩码和广播地址相关信息
QList<QNetworkAddressEntry> addressEntry = i.addressEntries();
foreach (QNetworkAddressEntry j, addressEntry) {
qDebug()<<"IP:"<<j.ip().toString();
qDebug()<<"子网掩码:"<<j.netmask().toString();
qDebug()<<"广播地址:"<<j.broadcast().toString();
}
}
2、 TCP通信
2.1 服务器
QTcpServer:监听套接字(创建socket,绑定,监听,创建连接)
QTcpSocket:通讯套接字(建立连接的时候创建,收发数据)
(1)在工程文件里面添加
QT += network
(2)创建QTcpServer对象
#include QTcpServer mserver;
(3)调用方法开启监听
mserver.listen(QHostAddress::Any, ui->lineEdit->text().toUShort());
(4)当有客户端连接的时候,QTcpServer监听套接字,产生信号newConnection
connect(&mserver, &QTcpServer::newConnection, this, &MainWindow::new_client);
void MainWindow::new_client()
{
QTcpSocket *lsocket = mserver.nextPendingConnection();//连接获取与新连接客户端的通讯套接字
//可以把新连入的套接字存在一个集合里面
}
(5)发送数据 write
lsocket->write(“connect OK”);
(6)接收数据:当服务器接收到客户端放数据的时候,通信套接字会产生readyRead()信号
connect(lsocket, &QTcpSocket::readyRead, this, &MainWindow::read_data);
void MainWindow::read_data()
{
//获取信号发送者
QTcpSocket *msocket = dynamic_cast<QTcpSocket *>(sender());
//读取数据
QString msg = msocket->readAll();
//得到发送者的IP
QString ip = (msocket->peerAddress().toString()).remove(0, 7);
ui->textBrowser->setText(ui->textBrowser->toPlainText().append(msg));
}
(7)关闭监听套接字
mserver.close();
2.2 客户端
QTcpSocket:通讯套接字(建立连接的时候创建,收发数据)
(1)在工程文件里面添加
QT += network
(2)创建QTcpSocket对象
#include QTcpSocket msocket;
(3)连接服务器connectToHost
msocket.connectToHost(ui->lineEdit_IP->text(), ui->lineEdit_Port->text().toUShort());
连接成功会产生一个connected信号
(4)接收数据 readyRead
connect(&msocket, &QTcpSocket::readyRead, this, &MainWindow::read_data);
void MainWindow::read_data() { QString msg = msocket.readAll(); ui->textBrowser->append(msg); }
(5)发送数据
msocket.write(ui->textEdit->toPlainText().toUtf8());
3 、HTTP通信
#include <QNetworkRequest> //存放请求对象的类
#include <QNetworkReply> //接收服务器回发的数据
#include <QNetworkAccessManager> //http通信过程管理类
#include <QJsonDocument> //json的解析器
#include <QJsonObject> //对象
#include <QJsonArray> //数组
#include <QJsonValue> //值
3.1 HTTP的客户端
(1)创建套接字——与服务器进行连接
(2)向服务器发送一个请求数据(http头、请求数据)
(3)如果请求合法,服务器就会返回请求的数据
3.2 qt 实现
#include <QNetworkAccessManager>
管理整个http通信,负责发送请求,后期应答
请求:get post put
#include <QNetworkRequest>
请求对象——请求数据放在这个对象中
#include <QNetworkReply>
当服务器回应的数据通过应答对象获取
(1)创建管理类对象
QNetworkAccessManager manager;
(2)调用对象的方法,发送请求
QUrl url(ui->lineEdit->text());
//创建一个请求对象
QNetworkRequest request(url);
//发送请求
manager.get(request);
(3)当请求发送完毕管理类对象有一个finished信号产生,关联一个槽函数
connect(&manaer, &QNetworkAccessManager::finished, this, &MainWindow::read_data);
(4)在槽函数中获取应答对象并且通过应答对象读取服务器返回的数据
void MainWindow::read_data(QNetworkReply *reply)
{
QByteArray array = reply->readAll();//读取所有数据
qDebug()<<array;
QPixmap map;//定义一个图片空间
map.loadFromData(array);//给图片空间导入数据
ui->label->setPixmap(map);
}
4、Apache
4.1 安装Apache服务器
sudo apt-get install apache2
4.2 查看apache的路径
cd /var/www/html/
原有文件:
index.html
4.3 在浏览器上直接输入服务器IP加文件路径名
4.3 在浏览器上直接输入服务器IP加文件路径名
服务器根路径:http://192.168.1.117
(/var/www/html/)
文件路径:http://192.168.1.117/picture/1.jpg
5、json数据格式与天气应用
5.1 json数据格式
https://blog.csdn.net/weixin_40877388/article/details/86526154
http://www.weather.com.cn/data/cityinfo/101010100.html
(1)对象{}
——在对象中只能出现键值对 “city”:“北京”(多个键值对,用 , 隔开)
键必须是字符串
键值对的值:
字符串
整数
浮点数
bool
对象
(2)数组[]——在数组里放相同类型的数据
[{}, {}, {}] 对象数组
[“”, “”, “”] 字符串数组
[1, 2, 3]整数数组
#include <QJsonDocument> josn的解析器,实现json的读取写入
#include <QJsonObject> 对象
#include <QJsonArray> 数组
#include <QJsonValue> 值
#include <QJsonParseError> 过程错误检查
5.2 解析json数据
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(array, &error);
if(error.error != QJsonParseError::NoError)
{
qDebug()<<"json error";
return;
}
QJsonObject obj = doc.object();
QJsonObject dataobj = obj.value("data").toObject();
QJsonArray forecast_Array = dataobj.value("forecast").toArray();
QJsonObject day = forecast_Array[1].toObject();
QString type = day.value("type").toString();
ui->textBrowser->append("明天重庆的天气类型为:" + type);
/*
QJsonObject obj = doc.object();
QJsonObject cityobj = obj.value("weatherinfo").toObject();//获取对象,这个对象是一个键的值
QString city = cityobj.value("city").toString();
QString htemp = cityobj.value("temp2").toString();
QString ltemp = cityobj.value("temp1").toString();
ui->textBrowser->append("城市:" + city);
ui->textBrowser->append("最高温度:" + htemp);
ui->textBrowser->append("最低温度:" + ltemp);
*/
6、UDP
6.1 工程添加
QT += network
6.2 类的头文件
#include <QUdpSocket>
QUdpSocket
6.3 数据发送端
(1)QUdpSocket对象
QUdpSocket msocket;
(2)直接调用发送数据的函数
msocket.writeDatagram(ui->textEdit->toPlainText().toUtf8(),
QHostAddress(ui->lineEdit_IP->text()),
ui->lineEdit_Port->text().toUShort());
6.4 数据接收
(1)创建QUdpSocket对象
QUdpSocket msocket;
(2)绑定端口地址
msocket.bind(QHostAddress::Any, ui->lineEdit_port->text().toUShort());
(3)关联信号和槽函数,接收消息
connect(&msocket, &QUdpSocket::readyRead, this, &MainWindow::read_data);
void MainWindow::read_data()
{
char buf[1024] = {};
QHostAddress address;
quint16 port;
msocket.readDatagram(buf, 1024, &address, &port);
ui->textBrowser>setText("【" + address.toString().remove(0, 7) +
"_" + QString::number(port) + "】"+ ":" + buf);
}
6.5 广播
msocket.writeDatagram(ui->textEdit->toPlainText().toUtf8(),
QHostAddress("192.168.1.255"),
ui->lineEdit_Port->text().toUShort());
6.6 组播
(1)地址:
网关地址:192.168.1.1
普通IP:192.168.1.2~254
广播地址:192.168.1.255
组播地址:
224.0.0.0 ~ 239.255.255.255
224.0.0.0 ~ 224.0.0.255:预留的组播地址(永久组地址)
224.0.1.0 ~ 224.0.1.255:公用组播地址
224.0.2.0 ~ 238.255.255.255:临时组地址(用户可用),全网范围有效
239.0.0.0 ~ 239.255.255.255:本地管理组播地址,仅在特定的本地范围内有效
(2)添加到多播组
msocket.joinMulticastGroup(QHostAddress(ui->lineEdit_groupIP->text()));
(3)从多播组移除
msocket.leaveMulticastGroup(QHostAddress(ui->lineEdit_groupIP->text()));