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

[嵌入式系统-24]:RT-Thread -11- 内核组件编程接口 - 网络组件 - TCP/UDP Socket编程

目录

一、RT-Thread网络组件

1.1 概述

1.2 RT-Thread支持的网络协议栈

1.3 RT-Thread如何选择不同的网络协议栈

二、Socket编程

2.1 概述

2.2 UDP socket编程

2.3 TCP socket编程

2.4 TCP socket收发数据


一、RT-Thread网络组件

1.1 概述

RT-Thread 是一个开源的嵌入式实时操作系统(RTOS),它提供了丰富的网络组件用于网络通信。

RT-Thread 的网络组件包括以下几个方面:

  1. TCP/IP 协议栈:RT-Thread 提供了完整的 TCP/IP 协议栈,包括 IP 协议、TCP 协议和 UDP 协议等。它支持 IPV4 和 IPV6,并提供了常用的网络协议(如 DHCP、DNS)的实现。

  2. Socket API:RT-Thread 提供了类似于 POSIX socket API 的接口,使开发者可以使用常见的网络编程模型(如 TCP 或 UDP)在 RT-Thread 上进行网络通信。

  3. LWIP:RT-Thread 基于 LWIP(Lightweight IP)实现了 TCP/IP 协议栈。LWIP 是一个轻量级的 TCP/IP 协议栈,具有较小的内存占用和代码体积,适合嵌入式系统。

  4. PPP:RT-Thread 提供了 PPP(Point-to-Point Protocol)的实现,支持通过串口或以太网设备建立拨号连接,并通过拨号方式实现网络通信。

  5. 协议支持:除了 TCP/IP 协议栈外,RT-Thread 还支持其他网络协议,如 MQTT、CoAP、WebSocket 等,使开发者可以方便地实现各种应用场景的网络通信功能。

总的来说,RT-Thread 的网络组件提供了完整的网络通信功能,并提供了开发者常用的网络编程接口和协议支持,使嵌入式设备可以便捷地实现各种网络应用。

1.2 RT-Thread支持的网络协议栈

RT-Thread 支持多种网络协议栈,常见的有如下几种:

  1. LwIP(Lightweight IP)LwIP 是一个轻量级的网络协议栈,专为嵌入式系统设计,具有小巧、高效的特点。RT-Thread 使用 LwIP 作为默认的网络协议栈,支持 IPv4、IPv6、TCP、UDP、ICMP 等协议。

  2. uIP:uIP 也是一个轻量级的网络协议栈,适用于资源受限的嵌入式系统。RT-Thread 也提供了对 uIP 的支持,使得开发者可以根据实际需求选择合适的网络协议栈。

  3. Salstack:RT-Thread 也提供了 Salstack(Simple Abstract Layer for Stack)协议栈,相对于 LwIP 和 uIP 更轻量级。Salstack 的设计目标是提供简单易用的网络功能,支持 TCP、UDP、ICMP、ARP 等常用协议。

  4. MiCO TCP/IP:MiCO 是一种基于 LwIP 的 TCP/IP 协议栈,适用于连接性和通信性能要求较高的应用场景。RT-Thread 也支持 MiCO TCP/IP 协议栈。

这些网络协议栈在 RT-Thread 中提供了丰富的网络功能,开发者可以根据项目需求选择合适的协议栈。同时,RT-Thread 也支持用户自定义网络协议栈,使得定制化网络功能变得更加灵活。在使用网络功能时,你可以根据具体情况选择合适的网络协议栈,并结合相应的文档和示例进行开发。

1.3 RT-Thread如何选择不同的网络协议栈

在 RT-Thread 中选择不同的网络协议栈通常需要根据具体的项目需求和硬件平台来进行配置和选择。下面是一般的步骤:

  1. 配置网络协议栈

    • 进入 RT-Thread 的 BSP 配置目录,在 rtconfig.h 或 menuconfig 工具中找到网络协议栈的配置选项。
    • 根据需要选择要使用的网络协议栈,比如 LwIP、uIP、Salstack 或其他协议栈。
    • 根据选择的网络协议栈,进行相应的配置,比如 IP 地址、子网掩码、网关等。
  2. 初始化网络协议栈

    • 在应用程序中调用相应的网络协议栈初始化函数,以初始化选择的协议栈。具体的初始化函数根据选择的协议栈而定,一般在启动代码或应用程序初始化阶段执行。
  3. 编写网络通信代码

    • 根据选择的网络协议栈,编写相应的网络通信代码,比如创建套接字、发送数据、接收数据等操作。
    • 根据选定的协议栈提供的 API,实现对网络功能的调用和控制。
  4. 调试和测试

    • 在选择和配置完成后,进行调试和测试,确保网络协议栈正常工作,网络连接稳定可靠。
    • 可以使用网络调试工具或者监视网络数据流量等方法来验证网络功能是否符合预期。

通过以上步骤,你可以在 RT-Thread 中灵活选择并配置不同的网络协议栈,以满足项目的需求。在选择和配置的过程中,建议参考 RT-Thread 的官方文档和示例代码,以便更好地理解和使用不同的网络协议栈功能。

二、Socket编程

2.1 概述

在 RT-Thread 中进行 socket 编程是一种常见的网络编程方式,可以通过套接字(socket)接口实现网络通信。以下是关于 RT-Thread 中 socket 编程的概述:

  1. 套接字(Socket)

    • 在 RT-Thread 中,套接字是一种抽象的通信端点,通过套接字可以进行网络通信。开发者可以通过套接字接口进行数据的发送和接收,实现网络应用程序的通信功能。
  2. Socket 接口

    • RT-Thread 提供了类似于 POSIX 标准的 socket 接口,开发者可以直接调用这些接口实现网络通信,如创建套接字、绑定地址、监听连接、发送数据、接收数据等操作。
  3. 常用函数

    • 在 RT-Thread 中,常用的 socket 函数包括 socket()bind()listen()accept()connect()send()recv() 等,这些函数可以实现套接字的创建、绑定、监听、连接以及数据的发送和接收。
  4. 网络通信模式

    • RT-Thread 中的 socket 编程支持常见的网络通信模式,包括 TCP 和 UDP。开发者可以根据需要选择合适的协议来实现可靠的数据传输(TCP)或者快速的数据传输(UDP)。
  5. 多线程环境

    • RT-Thread 是一个支持多线程的实时操作系统,因此在进行 socket 编程时,需要考虑多线程环境下的并发和同步。开发者可以使用 RT-Thread 提供的线程同步机制来保护共享资源,确保多线程间的数据安全性。
  6. 错误处理

    • 在 socket 编程中,需要及时处理异常情况和错误,比如网络连接失败、数据传输超时等。通过对错误码进行检查和处理,可以提高程序的健壮性和稳定性。

通过使用 socket 接口,开发者可以在 RT-Thread 中实现各种网络应用程序,如客户端和服务器程序、网络数据采集和处理等。在进行 socket 编程时,建议结合 RT-Thread 提供的文档和示例代码,加深对网络通信的理解,并根据具体需求灵活应用各种 socket 函数。

2.2 UDP socket编程

在 RT-Thread 中进行 UDP(用户数据报协议) socket 编程是一种常见的网络编程方式,可以实现基于 UDP 协议的数据通信。以下是在 RT-Thread 中进行 UDP socket 编程的基本步骤:

  1. 创建 UDP 套接字

    • 使用 socket() 函数创建一个 UDP 套接字。在创建套接字时,需要指定协议族为 AF_INET(IPv4 地址族)或 AF_INET6(IPv6 地址族),类型为 SOCK_DGRAM(数据报套接字),协议为 IPPROTO_UDP(UDP 协议)。
  2. 绑定地址

    • 使用 bind() 函数将 UDP 套接字绑定到本地 IP 地址和端口上。通过绑定地址,UDP 套接字可以监听指定的本地地址和端口,以接收发送到该地址的数据包。
  3. 发送数据

    • 使用 sendto() 函数向目标地址发送 UDP 数据包。需要指定目标 IP 地址(目标主机地址)和端口号,以及待发送的数据内容和长度。
  4. 接收数据

    • 使用 recvfrom() 函数从 UDP 套接字接收数据包。可以指定一个缓冲区来存储接收到的数据,同时获取发送方的 IP 地址和端口号。
  5. 关闭套接字

    • 使用 closesocket() 函数关闭 UDP 套接字,释放资源并停止网络通信。

下面是一个简单的示例代码,演示了如何在 RT-Thread 中使用 UDP 套接字发送和接收数据:

#include <rtthread.h>
#include <sys/socket.h>void udp_socket_demo(void)
{int sockfd;struct sockaddr_in addr;char buffer[128];// 创建 UDP 套接字sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);// 绑定本地地址和端口addr.sin_family = AF_INET;addr.sin_port = htons(12345);addr.sin_addr.s_addr = inet_addr("192.168.1.100");bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));// 发送数据sendto(sockfd, "Hello UDP", 9, 0, (struct sockaddr *)&addr, sizeof(addr));// 接收数据recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, 0);// 关闭套接字closesocket(sockfd);
}

在实际应用中,开发者可以根据具体需求和场景,进行更加复杂和完善的 UDP socket 编程,实现各种基于 UDP 协议的网络通信功能。同时,建议结合 RT-Thread 的网络编程文档和示例,加深对 UDP socket 编程的理解,并进行必要的调试和测试工作。

2.3 TCP socket编程

在 RT-Thread 中进行 TCP socket 编程时,可以同时实现客户端和服务器端的功能。

首先,我们先介绍服务器端的示例代码:

#include <rtthread.h>
#include <netdb.h>
#include <sys/socket.h>#define PORT 8080int main(void)
{int sockfd, newsockfd;struct sockaddr_in server_addr, client_addr;socklen_t client_len;// 创建 TCP socketsockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){rt_kprintf("Failed to create TCP socket\n");return -1;}// 设置服务器地址server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(PORT);// 绑定服务器地址if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){rt_kprintf("Failed to bind address\n");return -1;}// 开始监听if (listen(sockfd, 5) < 0){rt_kprintf("Failed to listen on socket\n");return -1;}rt_kprintf("Server listening on port %d\n", PORT);while (1){// 接受客户端连接client_len = sizeof(client_addr);newsockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);if (newsockfd < 0){rt_kprintf("Failed to accept client connection\n");return -1;}rt_kprintf("Accepted new client connection\n");// 在这里可以进行与客户端通信的处理// 处理完client的通信,关闭连接close(newsockfd);}return 0;
}

上述代码中,服务器端首先创建一个 TCP socket,并绑定到指定的 IP 地址和端口号。然后通过 listen 函数开始监听客户端的连接请求。在接收到客户端的连接请求后,使用 accept 函数接受连接,创建一个新的 socket 来与客户端进行通信。在这个循环中,服务器端可以与多个客户端进行通信。

接下来是客户端的示例代码:

#include <rtthread.h>
#include <netdb.h>
#include <sys/socket.h>#define SERVER_IP "192.168.0.100"
#define SERVER_PORT 8080int main(void)
{int sockfd;struct sockaddr_in server_addr;// 创建 TCP socketsockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){rt_kprintf("Failed to create TCP socket\n");return -1;}// 设置服务器地址server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);// 连接服务器if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){rt_kprintf("Failed to connect to server\n");return -1;}// 在这里可以进行与服务器通信的处理// 关闭连接close(sockfd);return 0;
}

上述代码中,客户端创建一个 TCP socket,并使用 connect 函数连接到指定的服务器地址和端口号。在连接建立后,客户端可以进行与服务器通信的处理。

请注意,上述示例代码中的 IP 地址和端口号需要根据实际情况进行修改。在实际开发中,你可能需要处理更多的错误和异常情况,并且在通信过程中进行数据的发送和接收操作。

另外,还可以通过 RT-Thread 提供的套接字封装库 lwip_socket.h 来简化 TCP socket 编程。可以参考 RT-Thread 官方文档和示例代码获取更详细的信息和使用方法。

2.4 TCP socket收发数据

在 RT-Thread 上进行 TCP socket 编程,你可以使用 RT-Thread 提供的 Socket API 来创建和管理 TCP socket。

对于客户端,你可以按照以下步骤进行编程:

  1. 使用 socket 函数创建一个套接字,指定协议族为 AF_INET,类型为 SOCK_STREAM,以及协议为 IPPROTO_TCP。
  2. 使用 connect 函数将套接字连接到服务器的 IP 地址和端口号。
  3. 使用 send 函数来发送数据到服务器。
  4. 使用 recv 函数来接收服务器发送的数据。
  5. 使用 close 函数关闭套接字。

下面是一个简单的客户端代码示例:

#include <rtthread.h>
#include <netdb.h>
#include <sys/socket.h>#define SERVER_IP       "192.168.1.100"   // 服务器 IP 地址
#define SERVER_PORT     5000              // 服务器端口号void client_thread_entry(void* parameter)
{int sockfd;struct sockaddr_in server_addr;char buffer[1024];// 创建套接字if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){rt_kprintf("Socket creation failed\n");return;}// 设置服务器地址信息rt_memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);// 连接到服务器if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){rt_kprintf("Connection failed\n");close(sockfd);return;}// 发送数据到服务器const char* data = "Hello, server!";if (send(sockfd, data, strlen(data), 0) < 0){rt_kprintf("Sending data failed\n");close(sockfd);return;}// 接收服务器发送的数据int recv_len;if ((recv_len = recv(sockfd, buffer, sizeof(buffer), 0)) > 0){buffer[recv_len] = '\0';rt_kprintf("Received data from server: %s\n", buffer);}else{rt_kprintf("Receiving data failed\n");}// 关闭套接字close(sockfd);
}// 启动客户端线程
int start_client(void)
{rt_thread_t thread;thread = rt_thread_create("client", client_thread_entry, RT_NULL, 2048, 25, 10);if (thread != RT_NULL){rt_thread_startup(thread);return 0;}return -1;
}

对于服务器端,你可以按照以下步骤进行编程:

  1. 使用 socket 函数创建一个套接字,指定协议族为 AF_INET,类型为 SOCK_STREAM,以及协议为 IPPROTO_TCP。
  2. 使用 bind 函数将套接字绑定到服务器的 IP 地址和端口号。
  3. 使用 listen 函数开始监听客户端连接请求。
  4. 使用 accept 函数接受客户端的连接请求,并返回一个新的套接字,通过这个套接字与客户端进行通信。
  5. 使用 send 函数发送数据给客户端。
  6. 使用 recv 函数接收客户端发送的数据。
  7. 使用 close 函数关闭套接字。

下面是一个简单的服务器端代码示例:

#include <rtthread.h>
#include <netdb.h>
#include <sys/socket.h>#define SERVER_PORT     5000              // 服务器端口号// 服务器线程的主函数
void server_thread_entry(void* parameter)
{int sockfd, new_sockfd;struct sockaddr_in server_addr, client_addr;socklen_t addr_len = sizeof(client_addr);char buffer[1024];// 创建套接字if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){rt_kprintf("Socket creation failed\n");return;}// 设置服务器地址信息rt_memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);// 绑定套接字到服务器地址if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0){rt_kprintf("Binding failed\n");close(sockfd);return;}// 开始监听连接请求if (listen(sockfd, 5) < 0){rt_kprintf("Listening failed\n");close(sockfd);return;}rt_kprintf("Waiting for client connection...\n");// 接受客户端的连接请求if ((new_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &addr_len)) < 0){rt_kprintf("Accepting failed\n");close(sockfd);return;}rt_kprintf("Client connected\n");// 接收客户端发送的数据int recv_len;if ((recv_len = recv(new_sockfd, buffer, sizeof(buffer), 0)) > 0){buffer[recv_len] = '\0';rt_kprintf("Received data from client: %s\n", buffer);// 发送数据给客户端const char* data = "Hello, client!";if (send(new_sockfd, data, strlen(data), 0) < 0){rt_kprintf("Sending data failed\n");}}else{rt_kprintf("Receiving data failed\n");}// 关闭套接字close(new_sockfd);close(sockfd);
}// 创建并且启动服务器线程
int start_server(void)
{rt_thread_t thread;thread = rt_thread_create("server", server_thread_entry, RT_NULL, 2048, 25, 10);if (thread != RT_NULL){rt_thread_startup(thread);return 0;}return -1;
}

你可以根据需要将这两段代码添加到你的 RT-Thread 项目中,并根据实际情况修改服务器的 IP 地址和端口号。代码中的注释可以帮助你理解每个步骤的功能。

相关文章:

[嵌入式系统-24]:RT-Thread -11- 内核组件编程接口 - 网络组件 - TCP/UDP Socket编程

目录 一、RT-Thread网络组件 1.1 概述 1.2 RT-Thread支持的网络协议栈 1.3 RT-Thread如何选择不同的网络协议栈 二、Socket编程 2.1 概述 2.2 UDP socket编程 2.3 TCP socket编程 2.4 TCP socket收发数据 一、RT-Thread网络组件 1.1 概述 RT-Thread 是一个开源的嵌入…...

【ansible】认识ansible,了解常用的模块

目录 一、ansible是什么&#xff1f; 二、ansible的特点&#xff1f; 三、ansible与其他运维工具的对比 四、ansible的环境部署 第一步&#xff1a;配置主机清单 第二步&#xff1a;完成密钥对免密登录 五、ansible基于命令行完成常用的模块学习 模块1&#xff1a;comma…...

【LeetCode】升级打怪之路 Day 01:二分法

今日题目&#xff1a; 704. 二分查找35. 搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位置 目录 今日总结Problem 1: 二分法LeetCode 704. 二分查找 【easy】LeetCode 35. 搜索插入位置 ⭐⭐⭐⭐⭐LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 【medi…...

单片机stm32智能鱼缸

随着我国经济的快速发展而给人们带来了富足的生活&#xff0c;也有越来越多的人们开始养鱼&#xff0c;通过养各种鱼类来美化居住环境和缓解压力。但是在鱼类饲养过程中&#xff0c;常常由于鱼类对水质、水位及光照强度有着很高的要求&#xff0c;而人们也由于工作的方面而无法…...

面试经典150题——生命游戏

​"Push yourself, because no one else is going to do it for you." - Unknown 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 之所以先暴力求解&#xff0c;是因为我开始也没什么更好的思路&#xff0c;所以就先写一种解决方案&#xff0c;没准写着写…...

【C++】C++11下线程库

C11下线程库 1. thread类的简单介绍2.线程函数参数3.原子性操作库(atomic)4.mutex的种类5. RAII风格加锁解锁5.1Lock_guard5.2unique_lock 6.condition_variable 1. thread类的简单介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如wi…...

面试经典150题——矩阵置零

​"Dream it. Wish it. Do it." - Unknown 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 思路一很简单&#xff0c;就是尝试遍历矩阵的所有元素&#xff0c;如果发现值等于0&#xff0c;就把当前行与当前列的值分别置为0。同时我们需要注意&#xff0c;…...

多端开发围炉夜话

文章目录 一、多端开发 一、多端开发 uni-app 官网 UNI-APP中的UI框架&#xff1a;介绍常用的UI框架及其特点 uView UIVant WeappColor UIMint UI uniapp嵌入android原生开发的功能 uniapp使用安卓原生sdk uni-app中的uni.requireNativePlugin...

分治算法总结(Java)

目录 分治算法概述 快速排序 练习1&#xff1a;排序数组 练习2&#xff1a;数组中的第K个最大元素 练习3&#xff1a;最小k个数 归并排序 练习4&#xff1a;排序数组 练习5&#xff1a;交易逆序对的总数 练习6&#xff1a;计算右侧小于当前元素的个数 练习7&#xff1…...

【云原生系列之kubernetes】--Ingress使用

service的缺点&#xff1a; 不支持基于URL等机制对HTTP/HTTPS协议进行高级路由、超时、重试、基于流量的灰度等高级流量治理机制难以将多个service流量统一管理 1.1ingress的概念 ingress是k8s中的一个对象&#xff0c;作用是如何将请求转发到service的规则ingress controlle…...

练习:鼠标类设计之2_类和接口

前言 续鼠标类设计之1&#xff0c;前面解决了鼠标信号问题&#xff0c;这里解决显示问题 引入 鼠标伴随操作系统而生&#xff0c;考虑在屏幕上怎样显示 思路 1>鼠标显示是一个动态效果&#xff0c;所以需要一个“动态效果类”对象&#xff0c;添加进鼠标类的属性里。 在面…...

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson 15 At the Department Store 在百货商店

《美语从头学初级入门篇》 注意&#xff1a;被 删除线 划掉的不一定不正确&#xff0c;只是不是标准答案。 文章目录 Lesson 15 At the Department Store 在百货商店会话A会话B笔记 Lesson 15 At the Department Store 在百货商店 会话A A: Can you help me, please? B: Sur…...

linux 安装、删除 JTAG驱动

安装 安装驱动需要sudo访问权限&#xff0c;所以得手动安装。 在petalinux安装目录下&#xff1a; 文件的路径。 cd tools/xsct/data/xicom/cable_drivers/lin64/install_script/install_drivers 然后执行文件 install_drivers。 sudo ./install_drivers安装成功。 删除 …...

CSS的伪类选择器:nth-child()

CSS的伪类选择器:nth-child() CSS的伪类选择器 :nth-child() 是一个非常强大的工具&#xff0c;它允许你根据元素在其父元素中的位置&#xff08;序数&#xff09;来选择特定的子元素。这个选择器可以应用于任何元素&#xff0c;并且可以与类型选择器、类选择器或ID选择器结合…...

python celery使用队列

在celery的配置方法中有个参数叫task_routes&#xff0c;是用来设置不同的任务 消费不同的队列&#xff08;也就是路由&#xff09;。 格式如下&#xff1a; { ‘task name’: { ‘queue’: ‘queue name’ }}直接上代码&#xff0c;简单明了&#xff0c;目录格式如下&#x…...

四非保研之旅

大家好&#xff0c;我是工藤学编程&#xff0c;虽有万分感概&#xff0c;但是话不多说&#xff0c;先直接进入正题&#xff0c;抒情环节最后再说&#xff0c;哈哈哈 写在开头 我的分享是来给大家涨信心的&#xff0c;网上的大佬们都太强了&#xff0c;大家拿我涨涨信心&#…...

基于Java+SpringBoot的旅游路线规划系统(源码+论文)

文章目录 目录 文章目录 前言 一、功能设计 二、功能实现 1.1 前端首页模块的实现 1.2 景点新闻 1.3 景点在线预订 1.4 酒店在线预订 1.5 管理员景点管理 1.6 管理员旅游线路管理 1.7 酒店信息管理 三、库表设计 前言 随着我国的经济的不断发展&#xff0c;现在的一些热门的景…...

AI与测试自动化:未来已来

AI与测试自动化注定融合。软件开发的速度和准确性要求已经远远超出了预期。测试自动化通过重复、详细和数据密集型测试来解决这个问题&#xff0c;确保敏捷和持续交付环境中的软件质量。AI的学习、适应和预测能力以完美的效率和准确性增强了测试自动化。复杂的算法现在充当质量…...

深度学习基础之《TensorFlow框架(6)—张量》

一、张量 1、什么是张量 张量Tensor和ndarray是有联系的&#xff0c;当我们print()打印值的时候&#xff0c;它返回的就是ndarray对象 TensorFlow的张量就是一个n维数组&#xff0c;类型为tf.Tensor。Tensor具有以下两个重要的属性&#xff1a; &#xff08;1&#xff09;typ…...

第三百六十六回

文章目录 1. 概念介绍2. 使用方法2.1 List2.2 Map2.3 Set 3. 示例代码4. 内容总结 我们在上一章回中介绍了"convert包"相关的内容&#xff0c;本章回中将介绍collection.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的内容是col…...

Fiddler工具 — 18.Fiddler抓包HTTPS请求(一)

1、Fiddler抓取HTTPS过程 第一步&#xff1a;Fiddler截获客户端发送给服务器的HTTPS请求&#xff0c;Fiddler伪装成客户端向服务器发送请求进行握手 。 第二步&#xff1a;服务器发回相应&#xff0c;Fiddler获取到服务器的CA证书&#xff0c; 用根证书&#xff08;这里的根证…...

多租户数据库的缓冲区共享和预分配方案设计

多租户数据库的缓冲区共享和预分配方案设计 文章目录 多租户数据库的缓冲区共享和预分配方案设计简介初始化输入交互输出输入部分的输出交互部分的输出 评分注意点语言要求需要使用的模块系统框架图方案设计初始化阶段交互阶段 修改进度规划最终代码 简介 云计算技术使企业能够…...

C++:C++入门基础

创作不易&#xff0c;感谢三连 &#xff01;&#xff01; 一、什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff…...

利用System.Web.HttpRuntime.Cache制作缓存工具类

用到的依赖介绍 当谈到 ASP.NET 中的缓存管理时&#xff0c;常涉及到以下三个类&#xff1a;CacheDependency、HttpRuntime.Cache 和 System.Web.Caching。 CacheDependency&#xff08;缓存依赖项&#xff09;&#xff1a; CacheDependency 类用于指定一个或多个文件或目录作…...

266.【华为OD机试真题】抢7游戏(深度优先搜索DFS-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-抢7游戏二.解题思路三.题解代码Python题解代码…...

工具分享:在线键盘测试工具

在数字化时代&#xff0c;键盘作为我们与计算机交互的重要媒介之一&#xff0c;其性能和稳定性直接影响到我们的工作效率和使用体验。为了确保键盘的每个按键都能正常工作&#xff0c;并帮助用户检测潜在的延迟、连点等问题&#xff0c;一款优质的在线键盘测试工具显得尤为重要…...

Arcmap excel转shp

使用excel表格转shp的时候&#xff0c;如果你的excel里面有很多字段&#xff0c;直接转很大概率会出现转换结果错误的情况&#xff0c;那么就需要精简一下字段的个数。将原来的表格文件另存一份&#xff0c;在另存为的文件中只保留关键的经度、纬度、和用于匹配的字段即可&…...

14. rk3588自带的RKNNLite检测yolo模型(python)

首先将文件夹~/rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/下的文件librknnrt.so复制到文件夹/usr/lib/下&#xff08;该文件夹下原有的文件librknnrt.so是用来测试resnet50模型的&#xff0c;所以要替换成yolo模型的librknnrt.so&#xff09;&#xff0c;如下图所示&am…...

心理辅导|高校心理教育辅导系统|基于Springboot的高校心理教育辅导系统设计与实现(源码+数据库+文档)

高校心理教育辅导系统目录 目录 基于Springboot的高校心理教育辅导系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、学生功能模块的实现 &#xff08;1&#xff09;学生登录界面 &#xff08;2&#xff09;留言反馈界面 &#xff08;3&#xff09;试卷列表界…...

字符串方法挑战

题目 编写一个程序&#xff0c;接收一个使用下划线命名法&#xff08;underscore_case&#xff09;编写的变量名列表&#xff0c;并将它们转换为驼峰命名法&#xff08;camelCase&#xff09;。 输入将来自插入到DOM中的文本区域&#xff08;请参见下面的代码&#xff09;&…...