当前位置: 首页 > news >正文

如何注册网站的名字学网站开发培训

如何注册网站的名字,学网站开发培训,.net 网站源码下载,企业微信小程序如何开发目录 1. UDP Socket 1.1 核心 API 概览 1.2 回显服务器 1.3 回显客户端 2. TCP Socket 2.1 核心 API 概览 2.2 回显服务器 2.3 回显客户端 3. HTTP Client 3.1 核心 API 3.2 代码示例 QT专栏:QT_uyeonashi的博客-CSDN博客 在进行网络编程之前, 需要在项目…

目录

1. UDP Socket

1.1 核心 API 概览

1.2 回显服务器

1.3 回显客户端

2. TCP Socket

2.1 核心 API 概览

2.2 回显服务器

2.3 回显客户端

3. HTTP Client

3.1 核心 API

3.2 代码示例


QT专栏:QT_uyeonashi的博客-CSDN博客

在进行网络编程之前, 需要在项目中的.pro 文件中添加 network 模块.
添加之后要手动编译一下项目, 使 Qt Creator 能够加载对应模块的头文件

1. UDP Socket

1.1 核心 API 概览

主要的类有两个. QUdpSocket 和 QNetworkDatagram
QUdpSocket 表示一个 UDP 的 socket 文件.

QNetworkDatagram 表示一个 UDP 数据报.

1.2 回显服务器

1) 创建界面, 包含一个 QListWidget 用来显示消息.

2) 创建 QUdpSocket 成员
修改 widget.h

class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;QUdpSocket* socket;
};

修改 widget.cpp, 完成 socket 后续的初始化
一般来说, 要先连接信号槽, 再绑定端口.
如果顺序反过来, 可能会出现端口绑定好了之后, 请求就过来了. 此时还没来得及连接信号槽. 那么这个请求就有可能错过了.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 1. 设置窗口标题this->setWindowTitle("服务器");// 2. 实例化 socketsocket = new QUdpSocket(this);// 3. 连接信号槽, 处理收到的请求connect(socket, &QUdpSocket::readyRead, this, &Widget::processRequest);// 4. 绑定端口bool ret = socket->bind(QHostAddress::Any, 9090);if (!ret){QMessageBox::critical(nullptr, "服务器启动出错", socket->errorString());return;}
}

3) 实现 processRequest , 完成处理请求的过程
• 读取请求并解析
• 根据请求计算响应
• 把响应写回到客户端

void Widget::processRequest()
{// 1. 读取请求const QNetworkDatagram& requestDatagram = socket->receiveDatagram();QString request = requestDatagram.data();// 2. 根据请求计算响应const QString& response = process(request);// 3. 把响应写回到客户端QNetworkDatagram responseDatagram(response.toUtf8(),requestDatagram.senderAddress(), requestDatagram.senderPort());socket->writeDatagram(responseDatagram);// 显示打印日志QString log = "[" + requestDatagram.senderAddress().toString() + ":" + QString::number(requestDatagram.senderPort())+ "] req: " + request + ", resp: " +  response;ui->listWidget->addItem(log);
}

4) 实现 process 函数
由于我们此处是实现回显服务器. 所以 process 方法中并没有包含实质性的内容.

QString Widget::process(const QString& request)
{return request;
}

"根据请求处理响应" 是服务器开发中的最核心的步骤.

此时, 服务器程序编写完毕.
但是直接运行还看不出效果. 还需要搭配客户端来使用.

1.3 回显客户端

1) 创建界面. 包含一个 QLineEdit , QPushButton , QListWidget
• 先使用水平布局把 QLineEdit 和 QPushButton 放好, 并设置这两个控件的垂直方向的
sizePolicy 为 Expanding
• 再使用垂直布局把 QListWidget 和上面的水平布局放好.
• 设置垂直布局的 layoutStretch 为 5, 1 (当然这个尺寸比例根据个人喜好微调).

2) 在 widget.cpp 中, 先创建两个全局常量, 表示服务器的 IP 和 端口

// 提前定义好服务器的 IP 和 端口
const QString& SERVER_IP = "127.0.0.1";
const quint16 SERVER_PORT = 9090;

3) 创建 QUdpSocket 成员
修改 widget.h, 定义成员

class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;// 创建 socket 成员QUdpSocket* socket;
};

修改 widget.cpp, 初始化 socket

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 1. 设置窗口名字this->setWindowTitle("客户端");// 2. 实例化 socketsocket = new QUdpSocket(this);
}

4) 给发送按钮 slot 函数, 实现发送请求

void Widget::on_pushButton_clicked()
{// 1. 获取到输入框的内容const QString& text = ui->lineEdit->text();// 2. 构造请求数据QNetworkDatagram requestDatagram(text.toUtf8(), QHostAddress(SERVER_IP),SERVER_PORT);// 3. 发送请求socket->writeDatagram(requestDatagram);// 4. 消息添加到列表框中ui->listWidget->addItem("客户端说: " + text);// 5. 清空输入框ui->lineEdit->setText("");
}

5) 再次修改 Widget 的构造函数, 通过信号槽, 来处理服务器的响应.

connect(socket, &QUdpSocket::readyRead, this, [=]() {const QNetworkDatagram responseDatagram = socket->receiveDatagram();QString response = responseDatagram.data();ui->listWidget->addItem(QString("服务器说: ") + response);
});

最终执行效果
启动多个客户端都可以正常工作.

2. TCP Socket

2.1 核心 API 概览

核心类是两个: QTcpServer 和 QTcpSocket
QTcpServer 用于监听端口, 和获取客户端连接.

QTcpSocket 用户客户端和服务器之间的数据交互.

QByteArray 用于表示一个字节数组. 可以很方便的和 QString 进行相互转换.
例如:
• 使用 QString 的构造函数即可把 QByteArray 转成 QString.
• 使用 QString 的 toUtf8 函数即可把 QString 转成 QByteArray.

2.2 回显服务器

1) 创建界面. 包含一个 QListWidget , 用于显示收到的数据.

2) 创建 QTcpServer 并初始化
修改 widget.h, 添加 QTcpServer 指针成员.

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;// 创建 QTcpServerQTcpServer* tcpServer;
};

修改 widget.cpp, 实例化 QTcpServer 并进行后续初始化操作.
• 设置窗口标题
• 实例化 TCP server. (父元素设为当前控件, 会在父元素销毁时被一起销毁).
• 通过信号槽, 处理客户端建立的新连接.
• 监听端口

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 1. 设置窗口标题this->setWindowTitle("服务器");// 2. 实例化 TCP servertcpServer = new QTcpServer(this);// 3. 通过信号槽, 处理客户端建立的新连接.connect(tcpServer, &QTcpServer::newConnection, this,&Widget::processConnection);// 4. 监听端口bool ret = tcpServer->listen(QHostAddress::Any, 9090);if (!ret) {QMessageBox::critical(nullptr, "服务器启动失败!", tcpServer->errorString());exit(1);}
}

3) 继续修改 widget.cpp, 实现处理连接的具体方法 processConnection
• 获取到新的连接对应的 socket.
• 通过信号槽, 处理收到请求的情况
• 通过信号槽, 处理断开连接的情况

void Widget::processConnection()
{// 1. 获取到新的连接对应的 socket.QTcpSocket* clientSocket = tcpServer->nextPendingConnection();QString log = QString("[") + clientSocket->peerAddress().toString()+ ":" + QString::number(clientSocket->peerPort()) + "] 客户端上线!";ui->listWidget->addItem(log);// 2. 通过信号槽, 处理收到请求的情况connect(clientSocket, &QTcpSocket::readyRead, this, [=](){// a) 读取请求QString request = clientSocket->readAll();// b) 根据请求处理响应const QString& response = process(request);// c) 把响应写回客户端clientSocket->write(response.toUtf8());QString log = QString("[") + clientSocket->peerAddress().toString()+ ":" + QString::number(clientSocket->peerPort()) + "] req: " +request + ", resp: " + response;ui->listWidget->addItem(log);});// 3. 通过信号槽, 处理断开连接的情况connect(clientSocket, &QTcpSocket::disconnected, this, [=]() {QString log = QString("[") + clientSocket->peerAddress().toString() + ":" + QString::number(clientSocket->peerPort()) + "] 客户端下线!";ui->listWidget->addItem(log);// 删除 clientSocketclientSocket->deleteLater();});
}

4) 实现 process 方法, 实现根据请求处理响应.
由于我们此处是实现回显服务器. 所以 process 方法中并没有包含实质性的内容.

QString Widget::process(const QString &request)
{return request;
}

此时, 服务器程序编写完毕.
但是直接运行还看不出效果. 还需要搭配客户端来使用.

2.3 回显客户端

1) 创建界面. 包含一个 QLineEdit , QPushButton , QListWidget
• 先使用水平布局把 QLineEdit 和 QPushButton 放好, 并设置这两个控件的垂直方向的
sizePolicy 为 Expanding
• 再使用垂直布局把 QListWidget 和上面的水平布局放好.
• 设置垂直布局的 layoutStretch 为 5, 1 (当然这个尺寸比例根据个人喜好微调).

2) 创建 QTcpSocket 并实例化
修改 widget.h, 创建成员.

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;// 新增 QTcpSocketQTcpSocket* socket;
};

修改 widget.cpp, 对 QTcpSocket 进行实例化.
• 设置窗口标题
• 实例化 socket 对象 (父元素设为当前控件, 会在父元素销毁时被一起销毁).
• 和服务器建立连接.
• 等待并确认连接是否出错.

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 1. 设置窗口标题.this->setWindowTitle("客户端");// 2. 实例化 socket 对象.socket = new QTcpSocket(this);// 3. 和服务器建立连接.socket->connectToHost("127.0.0.1", 9090);// 4. 等待并确认连接是否出错.if (!socket->waitForConnected()) {QMessageBox::critical(nullptr, "连接服务器出错!", socket->errorString());exit(1);}
}

3) 修改 widget.cpp, 给按钮增加点击的 slot 函数, 实现发送请求给服务器.

void Widget::on_pushButton_clicked()
{// 获取输入框的内容const QString& text = ui->lineEdit->text();// 清空输入框内容ui->lineEdit->setText("");// 把消息显示到界面上ui->listWidget->addItem(QString("客户端说: ") + text);// 发送消息给服务器socket->write(text.toUtf8());
}

4) 修改 widget.cpp 中的 Widget 构造函数, 通过信号槽, 处理收到的服务器的响应

// 处理服务器返回的响应.
connect(socket, &QTcpSocket::readyRead, this, [=]() {QString response = socket->readAll();qDebug() << response;ui->listWidget->addItem(QString("服务器说: ") + response);
});

先启动服务器, 再启动客户端(可以启动多个), 最终执行效果:
由于我们使用信号槽处理同一个客户端的多个请求, 不涉及到循环, 也就不会使客户端之间相互影响了.

3. HTTP Client

进行 Qt 开发时, 和服务器之间的通信很多时候也会用到 HTTP 协议.
• 通过 HTTP 从服务器获取数据.
• 通过 HTTP 向服务器提交数据.

3.1 核心 API

关键类主要是三个. QNetworkAccessManager , QNetworkRequest , QNetworkReply .
QNetworkAccessManager 提供了 HTTP 的核心操作.

QNetworkRequest 表示一个 HTTP 请求(不含 body).
如果需要发送一个带有 body 的请求(比如 post), 会在 QNetworkAccessManager 的 post 方法中通过单独的参数来传入 body.

其中的 QNetworkRequest::KnownHeaders 是一个枚举类型, 常用取值:

QNetworkReply 表示一个 HTTP 响应. 这个类同时也是 QIODevice 的子类.

此外, QNetworkReply 还有一个重要的信号 finished 会在客户端收到完整的响应数据之后触发.

3.2 代码示例

给服务器发送一个 GET 请求.
1) 创建界面. 包含一个 QLineEdit , QPushButton
• 先使用水平布局把 QLineEdit 和 QPushButton 放好, 并设置这两个控件的垂直方向的
sizePolicy 为 Expanding
• 再使用垂直布局把 QPlainTextEdit 和上面的水平布局放好. ( QPlainTextEdit 的
readOnly 设为 true )
• 设置垂直布局的 layoutStretch 为 5, 1 (当然这个尺寸比例根据个人喜好微调).

💡 此处建议使用 QPlainTextEdit 而不是 QTextEdit . 主要因为 QTextEdit 要进行富文本解析, 如果得到的 HTTP 响应体积很大, 就会导致界面渲染缓慢甚至被卡住.

2) 修改 widget.h, 创建 QNetworkAccessManager 属性

class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;// 新增属性QNetworkAccessManager* manager;
};

3) 修改 widget.cpp, 创建实例

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 实例化属性manager = new QNetworkAccessManager(this);
}

4) 编写按钮的 slot 函数, 实现发送 HTTP 请求功能

void Widget::on_pushButton_clicked()
{// 1. 获取到输入框中的 URL, 构造 QUrl 对象QUrl url(ui->lineEdit->text());// 2. 构造 HTTP 请求对象QNetworkRequest request(url);// 3. 发送 GET 请求QNetworkReply* response = manager->get(request);// 4. 通过信号槽来处理响应connect(response, &QNetworkReply::finished, this, [=]() {if (response->error() == QNetworkReply::NoError) {// 响应正确QString html(response->readAll());ui->plainTextEdit->setPlainText(html);// qDebug() << html;} else {// 响应出错ui->plainTextEdit->setPlainText(response->errorString());}response->deleteLater();});
}

执行程序, 观察效果

发送 POST 请求代码也是类似. 使用 manager->post() 即可. 此处不再演示.


本篇完!

http://www.yayakq.cn/news/729323/

相关文章:

  • alt网站标签怎么做深圳做网站网络公司
  • 保定网站建设浩森宇特下载个网上销售网站
  • 怎样装修公司网站广东省建设行业统一身份认证平台
  • 一个网站添加多个网址广州网站建设:
  • 设计免费素材网站.net电商网站全站开发
  • 医疗网站模板泸西网站建设
  • 网站建设兼职在哪找企业网站设计的基本内容包括哪些
  • 直播做ppt的网站有哪些网站建设是属于软件吗
  • 建立论坛网站网站做百度推广要多少钱
  • 抚顺网站建设wordpress 博客地址
  • 做网站的公司排名长沙人才招聘网最新招聘2022
  • 搭建网站需要钱吗网站优化排名易下拉系统
  • 合肥市建设工程劳务分包合同备案表在哪个网站下载2345影视大全可以放心下载吗
  • 网站被谷歌收录新浪sae部署wordpress配置
  • 南京凯盛建设集团有限公司网站最具口碑的企业网站建设
  • 苏州建网站哪个好百度营销大学
  • 网站 防采集品牌网站建设磐石网络优等
  • 网站建设报价 下载建设项目自主验收公示网站
  • 东莞网站建设在线推广百度商城购物
  • 西安浐灞生态区规划建设局网站企业宣传片制作公司天津
  • 出格网站建设公司网络营销软文范例500字
  • 小型网站建设步骤做暖暖视频免费观看免费网站
  • 石家庄智能网站建设网站建设的推进方案
  • 开奖网站开发万网的域名怎么交易
  • 手机看黄山网站河南网站建设公司
  • 合肥建设网站制作公司ui设计是学什么的
  • 有哪些学做衣服的网站有哪些网站的积分系统怎么做的
  • 做国外单的网站叫什么名字网站建设方案书封面
  • 网站备案最快网络系统管理比赛内容
  • 网站绑定两个域名怎么做跳转Wordpress 点击跟踪