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

学习记录——day30 网络编程 端口号port 套接字socket TCP实现网络通信

目录

一、端口号 port

二、套接字 socket

1、原理

2、socket函数介绍

三、TCP实现网络通信

1、原理

2、TCP通信原理图

3、TCP相关函数

1)bind 绑定

2)listen  监听

 3)accept 接收连接请求

 4)recv 接收

5)send 发送

 6)connect 连接请求

4、TCP服务器端代码实现

 5、TCP客服端代码实现

四、UDP实现网络通信

1、UDP网络通信模型

 2、UDP相关函数 recvfrom sendto

3、UDP服务器端代码实现

4、UDP客服端端代码实现

五、TCP和UDP基础通信模型注意事项


一、端口号 port

1、为了区分同一主机上的多个进程,使用端口号来进行处理

2、端口号是一个2字节的无符号整数存储,取值范围【0,65535】

3、网络通信中两个“地址”,主机的地址——IP,进程的地址——端口号;

4、特殊的端口号:0-1023     

        由系统默认应用程序占用,编程不可使用

TCP 21端口:FTP文件传输服务
TCP 23端口:TELNET终端仿真服务
TCP 25端口:SMTP简单邮件传输服务
TCP 110端口:POP3邮局协议版本3
TCP 80端口:HTTP超文本传输服务
TCP 443端口:HTTPS加密超文本传输服务
UDP 53端口:DNS域名解析服务
UDP 69端口:TFTP文件传输服务

特殊的端口函数,存储在linux中的 /etc/services文件中

5、编程可使用的:1024-49151   

        编程可使用的端口号

6、临时端口号:49152-65535

        客服端运行时动态选择的,编程时若未指定端口号,会分配临时端口号

二、套接字 socket

        相关帮助指令     man 2 socket     man 7 socket

1、原理

2、socket函数介绍

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int socket(int domain, int type, int protocol);功能:为通信创建一个端点,并返回该端点的文件描述符参数1:通信域Name                Purpose                          Man pageAF_UNIX, AF_LOCAL   本地通信,同一主机之间进程通信     详情请看man 7 unixAF_INET             IPv4 提供的网络通信               详情请看man 7 ipAF_INET6            IPv6 提供的网络通信               详情请看man 7 ipv6参数2:指定通信语义,可以由多个宏值使用位或连接SOCK_STREAM:表示提供TCP协议的传输方式SOCK_DGRAM:表示提供UDP协议的传输方式SOCK_NONBLOCK:套接字设置非阻塞属性参数3:如果参数2中仅仅指定一个协议,那么参数3可以填0,如果指定多个,则参数3需要指定特定的协议TCP协议名称:IPPROTO_TCPUDP协议名称:IPPROTO_UDP返回值:成功返回创建的套接字文件描述符,失败返回     -1并置位错误码                 

三、TCP实现网络通信

1、原理

服务器端:

                1)创建套接字1

                2)给套接字1绑定服务器端端口号、ip地址

                3)将套接字1的功能改为监听(套接字内部被改造,原本的收发缓冲区改为已连接、未连接队列),用于检测是否客服端连接(三次握手就发生在这一步)

                4)阻塞等待连接,连接成功,创建套接字2,用于消息的收发

                5)消息的发送与接收

                6)关闭通信,可以由服务器端、客服端其中之一执行

客服端:

                1)创建由于通信的套接字

                2)绑定客服端端口号、ip地址

                3)连接服务器端,连接成功进入未连接队列,马上从未连接队列向已连接队列转换,该过程非常迅速,但同时申请连接的数量过多(超过未连接队列大小)仍会阻塞

                4)消息的发送与接收

                5)关闭通信,可以由服务器端、客服端其中之一执行

2、TCP通信原理图

3、TCP相关函数

1)bind 绑定

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:位套接字分配名称参数1:通过socket函数创建出来的套接字文件描述符参数2:通用地址信息结构体,需要根据具体使用的地址族而定, struct sockaddr仅仅只是为了类型的强制转换,防止出现警告跨主机间通信:man 7 ipstruct sockaddr_in {sa_family_t    sin_family; /* 表示通信域 */in_port_t      sin_port;   /* 端口号的网络字节序 */struct in_addr sin_addr;   /* ip地址 */};/* Internet address. */struct in_addr {uint32_t       s_addr;     /* IP地址的网络字节序 */};同一主机间通信:man 7 uninxstruct sockaddr_un {sa_family_t sun_family;               /* 表示通信域:AF_UNIX */char        sun_path[108];            /* 套接字文件的地址 */};参数3:参数2的大小返回值:成功返回0,失败返回-1并置位错误码注意关于bind的两个错误:1、 Cannot assign requested address:表示IP地址填写错误,检查IP是否有问题2、Address already in use:表示地址信息正在占用,可以调用函数快速重用,也可以等一会

2)listen  监听

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int listen(int sockfd, int backlog);功能:将套接字设置成被动监听状态,已接受客户端的连接请求参数1:套接字文件描述符参数2:容纳连接的队列的最大长度,一般填128返回值:成功返回0,失败返回-1并置为错误码

 3)accept 接收连接请求

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能:用于阻塞接收客户端连接请求参数1:服务器套接字文件描述符参数2:用于接收对端地址信息结构体的指针参数3:接收对端地址信息的长度返回值:成功返回一个新的用于通信的套接字文件描述符,失败返回-1并置位错误码

 4)recv 接收

       #include <sys/types.h>#include <sys/socket.h>ssize_t recv(int sockfd, void *buf, size_t len, int flags);功能:从套接字中读取数据到buf中参数1:用于通信的套接字文件描述符参数2:接收数据后的容器地址参数3:接收的数据的大小参数4:是否阻塞接收0:表示阻塞接收消息MSG_DONTWAIT:表示非阻塞接收数据返回值:>0:表示成功读取的字符个数=0:表示通信对端已经下线=-1:表示出错,置位错误码                    

5)send 发送

       #include <sys/types.h>#include <sys/socket.h>ssize_t send(int sockfd, const void *buf, size_t len, int flags);功能:向通信套接字文件描述符中写入数据参数1:通信的套接字文件描述符参数2:要发送数据的起始地址参数3:要发送数据的大小参数4:是否阻塞接收0:表示阻塞接收消息MSG_DONTWAIT:表示非阻塞接收数据返回值:成功返回发送字符的个数,失败返回-1并置位错误码       

 6)connect 连接请求

       #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:将套接字文件描述符连接到addr指向的地址空间中参数1:客户端套接字文件描述符参数2:对端地址信息结构体参数3:参数2的大小返回值:成功返回0,失败返回-1并置位错误码

4、TCP服务器端代码实现

#include <myhead.h>
#define SER_PORT 6666
#define SER_IP "192.168.232.129"
int main(int argc, char const *argv[])
{// 1、创建套接字int sfd = socket(AF_INET, SOCK_STREAM, 0);// 参数1:ipv4的网络通信// 参数2:TCP通信方式// 参数3:默认使用一个协议if (sfd == -1){perror("socket error");return -1;}printf("socket success, sfd = %d\n", sfd); // 3// 2、为套接字绑定ip地址和端口号// 2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;                // 通信域sin.sin_port = htons(SER_PORT);          // 端口号sin.sin_addr.s_addr = inet_addr(SER_IP); // ip地址// 2.2 绑定if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");// 3、将套接字设置为被动监听状态,用于接收if (listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success\n");// 4、阻塞等待客户端的连接请求// 4.1 定义n变量用于e接收客服端的信息struct sockaddr_in cin;socklen_t addrlen = sizeof(cin);// 4.2 接收连接int newsfd = accept(sfd, (struct sockaddr *)&cin, &addrlen);if (newsfd == -1){perror("accept error");return -1;}printf("[%s:%d]:accept on\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));//5、数据收发char buf[128] = "";while (1){// 从客户端套接字中接收数据int res = recv(newsfd, buf, sizeof(buf),0);if (res == -1){perror("read error");return -1;}else if (res == 0){printf("客户端已下线\n");close(newsfd); // 关闭客户端套接字break;}// 接收数据printf("[%s:%d]:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);// 对接收到的数据进行处理strcat(buf, ":D");// 将消息返回到客户端if (send(newsfd, buf, strlen(buf),0) == -1){perror("发送失败\n");return -1;}printf("发送成功\n");bzero(buf,sizeof(buf));//清空容器}return 0;
}

 5、TCP客服端代码实现

#include <myhead.h>
#define SER_PORT 6666            // 与服务器保持一致
#define SER_IP "192.168.232.129" // 服务器ip地址
#define CLI_PORT 8888            // 客服端端口号
#define CLI_IP "192.168.232.129" // 客服端ip地址
int main(int argc, char const *argv[])
{//1、 创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if (cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd);//2、 绑定IP地址和端口号struct sockaddr_in cin;cin.sin_family = AF_INET;                // 通信域cin.sin_port = htons(CLI_PORT);          // 端口号cin.sin_addr.s_addr = inet_addr(CLI_IP); // ip地址//2.2、 绑定if (bind(cfd, (struct sockaddr *)&cin, sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind success\n");//3、 连接服务器//3.1、 填充服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET; //通信域sin.sin_port = htons(SER_PORT);sin.sin_addr.s_addr = inet_addr(SER_IP);//3.2、连接服务器if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");//4、数据收发char buf[128] = "";while (1){printf("输入:");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;//将数据发送到服务器send(cfd,buf,strlen(buf),0);printf("发送结束\n");//接收服务器发送的数据bzero(buf,sizeof(buf));//清空容器recv(cfd,buf,sizeof(buf),0);printf("收到服务器信息:%s\n",buf);}//5、关闭套接字close(cfd);return 0;
}

四、UDP实现网络通信

1、UDP网络通信模型

 2、UDP相关函数 recvfrom sendto

       ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);//功能:从套接字文件描述符中读取数据,并将对端地址信息结构体接收参数1:套接字文件描述符参数2:要接收数据的起始地址参数3:要接收的数据大小参数4:是否阻塞,0表示阻塞,MSG_NOWAIT表示非阻塞参数5:接收对端地址信息结构体参数6:参数5的大小返回值:成功返回读取的字节的大小,失败返回-1并置位错误码ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);//功能:向套接字文件描述符中读取数据,写给指定的对端接收参数1:套接字文件描述符参数2:要发送数据的起始地址参数3:要发送的数据大小参数4:是否阻塞,0表示阻塞,MSG_NOWAIT表示非阻塞参数5:接收对端地址信息结构体参数6:参数5的大小返回值:成功返回发送的字节的大小,失败返回-1并置位错误码

3、UDP服务器端代码实现

#include <myhead.h>
#define SER_PORT 9999            // 服务器端口号
#define SER_IP "192.168.232.129" // 服务器ip地址
int main(int argc, char const *argv[])
{// 1、创建用于通信的套接字i文件描述符int sfd = socket(AF_INET, SOCK_DGRAM, 0);if (sfd == -1){perror("scoket error");return -1;}printf("sfd = %d\n", sfd); // 3// 2、绑定ip地址和端口号//  2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;                // 通信域sin.sin_port = htons(SER_PORT);          // 端口号sin.sin_addr.s_addr = inet_addr(SER_IP); // ip地址// 2.2、 绑定if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");// 3、数据收发char buf[128] = "";struct sockaddr_in cin;          // 接收对端地址信息socklen_t addrlen = sizeof(cin); // 接收地址长度while (1){// 清空容器bzero(buf, sizeof(buf));// 从套接字中读取数据recvfrom(sfd, buf, sizeof(buf), 0,(struct sockaddr*)&cin,&addrlen);printf("收到信息:%s\n", buf);// 处理收到的信息strcat(buf, ":(");if (sendto(sfd, buf, sizeof(buf), 0,(struct sockaddr*)&cin,sizeof(cin)) == -1){perror("send error");return -1;}printf("发送成功\n");}// 4、关闭文件描述符close(sfd);return 0;
}

4、UDP客服端端代码实现

#include <myhead.h>
#define SER_PORT 9999            // 与服务器保持一致
#define SER_IP "192.168.232.129" // 服务器ip地址
#define CLI_PORT 5555            // 客服端端口号
#define CLI_IP "192.168.232.129" // 客服端ip地址
int main(int argc, char const *argv[])
{// 1、 创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if (cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd);// 2、 绑定IP地址和端口号struct sockaddr_in cin;cin.sin_family = AF_INET;                // 通信域cin.sin_port = htons(CLI_PORT);          // 端口号cin.sin_addr.s_addr = inet_addr(CLI_IP); // ip地址// 2.2、 绑定if (bind(cfd, (struct sockaddr *)&cin, sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind success\n");// 3、数据收发char buf[128] = "";// 3.1 填充服务器地址信息结构体struct sockaddr_in sin;                  // 接收对端地址信息sin.sin_family = AF_INET;                // 服务器的通信域sin.sin_port = htons(SER_PORT);          // 服务器的端口号sin.sin_addr.s_addr = inet_addr(SER_IP); // 服务器的ip地址while (1){printf("输入:");fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = 0;sendto(cfd, buf, strlen(buf), 0, (struct sockaddr *)&sin, sizeof(sin));printf("发送成功\n");bzero(buf, sizeof(buf));recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);printf("收到服务器信息:%s\n", buf);}// 4、关闭套接字close(cfd);return 0;
}

五、TCP和UDP基础通信模型注意事项

1、无论时TCP还是UDP通信中,服务器必须绑定ip地址和端口号,以便于让客服端找到该服务器。对于客服端而言,ip地址和端口号可以不绑定,若不绑定,端口号由系统动态分配(49152-65535)

2、对于TCP通信而言,可以使用recv和send进行通信,也可以使用read、write进行通信,还可以使用sendto和recvfrom进行通信

3、对于UDP通信而言,如果当前端只是用于接收数据,不发送数据,可以使用recvfrom、recv、read进行接收;如果当前端接收数据后还要发送数据给对端,则需要使用recvfrom进行接收数据,以便接收对端地址信息结构体

4、UDP通信中,服务器端可以使用connect函数与指定的客服端建立一个唯一的通道,在解除这种连接前,其他客服端与服务器端间不能通信。可通过将与服务器端建立连接的那个客服端的地址消息结构体中的sin.family设置未 AF_UNSPEC, 后再次使用connect函数断开连接

        UDP中通信使用connect连接的好处:

                1)提高信息传输效率、完整度

                例如:A和B同时向服务器发送消息,但是A发送的消息较大,需要较长的时间,发送过程中可能会出现时间片用完,服务器转而接收B的消息的情况,这会导致消息混乱。这时就可以先单独跟A建立连接,等所有数据传输结束后,再跟B通信

                2)传输性能高

        一般的UDP通信:获取对端地址信息 -->将信息加载到内核 -->数据收发--->获取对端地址信息 -->将信息加载到内核 --->数据收发 --->获取对端地址信息 -->将信息加载到内核 -->数据收发 -->......

        会经历多次用户空间到内核空间的转换,该过程对于cpu而言是一个漫长的过程

        UDP建立连接后:获取对端地址信息 ->将信息加载到内核 ->数据收发 ->数据收发 >数据收发 >数据收发完成>进行其他对端的信息处理.....

        会有效的减少用户空间到内核空间的转换次数

相关文章:

学习记录——day30 网络编程 端口号port 套接字socket TCP实现网络通信

目录 一、端口号 port 二、套接字 socket 1、原理 2、socket函数介绍 三、TCP实现网络通信 1、原理 2、TCP通信原理图 3、TCP相关函数 1&#xff09;bind 绑定 2&#xff09;listen 监听 3&#xff09;accept 接收连接请求 4&#xff09;recv 接收 5&#xff09;sen…...

【DataKit系列】数据迁移-实例搭建步骤(二)

说明&#xff1a;此文档仅包含使用DataKit进行数据迁移时&#xff0c;搭建迁移任务相关教程&#xff0c;不包含一些必须的前置配置步骤&#xff0c;和环境要求等&#xff0c;请优先学习“【DataKit系列】数据迁移-使用说明&#xff08;一&#xff09;”文档。 数据迁移实例搭建…...

发送jsonp请求(前后端如何实现)

发送jsonp请求(前后端如何实现) 前端 $.ajax({url: /api/jsonp,type: get,data: { id: 123 }, // 参数dataType: jsonp,jsonp: cb, // 回调函数的参数名jsonpCallback: successfn,// 回调函数contentType: "application/json; charsetutf-8",success: function(resp…...

Leetcode—1239. 串联字符串的最大长度【中等】(unordered_set)

2024每日刷题&#xff08;155&#xff09; Leetcode—1239. 串联字符串的最大长度 实现代码 class Solution { public:bool charSet(string & s) {unordered_set<char> charSet(s.begin(), s.end());// true表示有重复// false表示唯一return s.size() ! charSet.s…...

Spring Boot 3.x Rest API统一异常处理最佳实践

上一篇&#xff1a;Spring Boot 3.x Rest API最佳实践之统一响应结构 下一篇&#xff1a;Spring Boot 3.x Web单元测试最佳实践 参考著作&#xff1a;Error Handling for REST with Spring 在Spring MVC应用中&#xff0c;要对web表示层所抛出的异常进行捕获处理有多种方式&…...

线程的进阶学习

线程结束方式: 1.pthread_exit //pthread_join 2.从线程执行函数中return //此时效果等价于pthread_exit 3.pthread_cancel //线程可以被取消 4.任何一个线程调用了exit 或者 主线程 (main函数) return都会造成 进程结束 线程资源回收 ---pthread_join int pthread_ca…...

13.1 Python 正则表达式基础

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。 ⭐…...

贪心算法介绍(Greedy Algorithm)

贪心算法介绍&#xff08;Greedy Algorithm&#xff09; 1. 贪心算法概念简介 ​ 贪心算法Greedy Algorithm是一种在每一步选择中都采取当前状态下最优&#xff08;或最有利&#xff09;决策的算法策略&#xff0c;以期望通过这样的局部最优决策达到全局最优解。它适用于那些…...

谷粒商城实战笔记-175~177-商城业务-检索服务-检索查询接口开发

文章目录 一&#xff0c;175-商城业务-检索服务-检索查询参数模型分析抽取二&#xff0c;176-商城业务-检索服务-检索返回结果模型分析抽取三&#xff0c;177-商城业务-检索服务-检索DSL测试-查询部分四&#xff0c;178-商城业务-检索服务-检索DSL测试-聚合部分问题记录解决方案…...

爬虫 Web Js 逆向:RPC 远程调用获取加密参数(1)WebSocket 协议介绍

RPC (Remote Procedure Call) 是远程调用的意思。 在 Js 逆向时&#xff0c;本地可以和浏览器以服务端和客户端的形式通过 WebSocket 协议进行 RPC 通信&#xff0c;这样可以直接调用浏览器中的一些函数方法&#xff0c;不必去在意函数具体的执行逻辑&#xff0c;可以省去大量…...

【安卓】WebView的用法与HTTP访问网络

文章目录 WebView的用法使用http访问网络使用HttpURLConnection使用OkHttp 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 WebView的用法 新建一个WebViewTest项目&#xff0c;然后修…...

Mysql中文存入乱码???

问题描述 提示&#xff1a;用的mysql5.x版本&#xff1a; 例如&#xff1a;在新增数据的时候&#xff0c;数据库本应该保存中文的字段出现了乱码&#xff1f;&#xff1f;&#xff1f;&#xff1a; 原因分析&#xff1a; 提示&#xff1a;首先想到的是mysql的字符集设置&…...

安美数字酒店宽带运营系统 weather.php 任意文件读取漏洞复现

0x01 产品简介 HiBOS酒店宽带运营系统是由安美世纪(北京)科技有限公司开发的一套专为酒店设计的宽带管理系统。该系统旨在提升酒店宽带服务的运营效率和安全性&#xff0c;为酒店客人提供稳定、高速、便捷的上网体验。 0x02 漏洞概述 安美数字酒店宽带运营系统 weather.php …...

BGP的反射器(四)

解决IBGP全互联问题带来的问题&#xff1a; 路由器需维护大量的TCP和BGP连接&#xff0c;尤其在路由器数量较多时AS内BGP网络的可扩展性较差 角色 RR&#xff1a;路由反射器Client&#xff1a;RR的客户端Non-Client&#xff1a;非客户机 关系 Client只与RR之间建立IBGP会话…...

proxy负载均衡

endpoint &#xff1a; 终点、终端 看service服务器的ip kubectl get ep backend -> real server &#xff1a;真正提供web服务的服务器 负载均衡器 load balancer --》LB USER -->LB --->BACKEND(real server) nginx SERVICE --->很多的endpoint--》po…...

两个若依系统,不能同时登录问题解决方案

原因&#xff1a; 问题根源在于两个独立的系统&#xff08;A系统与B系统&#xff09;共享了同一cookie键名来存储各自用户的认证令牌&#xff08;token&#xff09;。这种设计导致了以下情形&#xff1a; 当用户在A系统登录后&#xff0c;一个token被存储在cookie中&#xff0…...

Unity Render Streaming项目实践经验

UnityRenderStreaming项目 项目github地址见上,我使用项目的3.1.0-exp.7版本、Unity 2023.1.0版本、windows11运行。 1下载项目包 2在Unity Hub中打开RenderStreaming~文件夹 3在package manager中导入com.unity.renderstreaming package 因为已经下载过了就选择install pa…...

Rvt/dgn格式的模型如何提取外轮廓,用于压平倾斜模型或者地形,进行BIM+GIS融合

0序 很多设计院、施工单位都需要做BIMGIS的融合&#xff0c;把设计成果或者施工方案和现状实景做叠加。 BIM作为设计模型和现状的实景是不吻合的&#xff0c;多数都需要在现状的基础上进行改造&#xff0c;穿过村落的桥梁&#xff0c;已有立交的跨域等。为了更好的展示设计方案…...

sqli-labs-master靶场通关

目录 一、sqli-labs第一关 1.判断是否存在sql注入 &#xff08;1&#xff09;提示输入数字值的ID作为参数&#xff0c;输入?id1 &#xff08;2&#xff09;通过数字值不同返回的内容也不同&#xff0c;所以我们输入的内容是带入到数据库里面查询了 &#xff08;3&#xff0…...

hive sql 处理多层 json 数组

1. 背景 json 字符串值数据示例&#xff1a; {"score": 1,"submitTime": 1712491933,"answerFlag": 1,"groupId": 1755547960,"answers": [{"value": "[1, 2, 3]","ids": [4,5,6],"is…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...