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

嵌入式学习L6网络编程D4多进程并发

多线程

客户端


/*./client serv_ip serv_port */
#include "net.h"void usage (char *s)
{printf ("\n%s serv_ip serv_port", s);printf ("\n\t serv_ip: server ip address");printf ("\n\t serv_port: server port(>5000)\n\n");
}int main (int argc, char **argv)
{int fd = -1;int port = -1;struct sockaddr_in sin;if (argc != 3) {usage (argv[0]);exit (1);}/* 1. 创建socket fd */if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {perror ("socket");exit (1);}port = atoi (argv[2]);if (port < 5000) {usage (argv[0]);exit (1);}/*2.连接服务器 *//*2.1 填充struct sockaddr_in结构体变量 */bzero (&sin, sizeof (sin));sin.sin_family = AF_INET;sin.sin_port = htons (port);	//网络字节序的端口号
#if 0sin.sin_addr.s_addr = inet_addr (SERV_IP_ADDR);
#elseif (inet_pton (AF_INET, argv[1], (void *) &sin.sin_addr) != 1) {perror ("inet_pton");exit (1);}
#endifif (connect (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {perror ("connect");exit (1);}printf ("Client staring...OK!\n");/*3. 读写数据 */char buf[BUFSIZ];int ret = -1;while (1) {bzero (buf, BUFSIZ);if (fgets (buf, BUFSIZ - 1, stdin) == NULL) {continue;}do {ret = write (fd, buf, strlen (buf));} while (ret < 0 && EINTR == errno);if (!strncasecmp (buf, QUIT_STR, strlen (QUIT_STR))) {	//用户输入了quit字符printf ("Client is exiting!\n");break;}}/*4.关闭套接字 */close (fd);
}

在这里插入图片描述
在这里插入图片描述

atoi是转换成整数
在这里插入图片描述

服务器

#include <pthread.h>
#include "net.h"void cli_data_handle (void *arg);int main (void)
{int fd = -1;struct sockaddr_in sin;/* 1. 创建socket fd */if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {perror ("socket");exit (1);}/*优化4: 允许绑定地址快速重用 */int b_reuse = 1;setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof (int));/*2. 绑定 *//*2.1 填充struct sockaddr_in结构体变量 */bzero (&sin, sizeof (sin));sin.sin_family = AF_INET;sin.sin_port = htons (SERV_PORT);	//网络字节序的端口号/*优化1: 让服务器程序能绑定在任意的IP上 */
#if 1sin.sin_addr.s_addr = htonl (INADDR_ANY);
#elseif (inet_pton (AF_INET, SERV_IP_ADDR, (void *) &sin.sin_addr) != 1) {perror ("inet_pton");exit (1);}
#endif/*2.2 绑定 */if (bind (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {perror ("bind");exit (1);}/*3. 调用listen()把主动套接字变成被动套接字 */if (listen (fd, BACKLOG) < 0) {perror ("listen");exit (1);}printf ("Server starting....OK!\n");int newfd = -1;/*4. 阻塞等待客户端连接请求 *//* 优化: 用多进程/多线程处理已经建立号连接的客户端数据 */pthread_t tid;struct sockaddr_in cin;socklen_t addrlen = sizeof (cin);while (1) {if ((newfd = accept (fd, (struct sockaddr *) &cin, &addrlen)) < 0) {perror ("accept");exit (1);}char ipv4_addr[16];if (!inet_ntop (AF_INET, (void *) &cin.sin_addr, ipv4_addr, sizeof (cin))) {perror ("inet_ntop");exit (1);}printf ("Clinet(%s:%d) is connected!\n", ipv4_addr, htons (cin.sin_port));pthread_create (&tid, NULL, (void *) cli_data_handle, (void *) &newfd);}close (fd);return 0;
}void cli_data_handle (void *arg)
{int newfd = *(int *) arg;printf ("handler thread: newfd =%d\n", newfd);//..和newfd进行数据读写int ret = -1;char buf[BUFSIZ];while (1) {bzero (buf, BUFSIZ);do {ret = read (newfd, buf, BUFSIZ - 1);} while (ret < 0 && EINTR == errno);if (ret < 0) {perror ("read");exit (1);}if (!ret) {				//对方已经关闭break;}printf ("Receive data: %s\n", buf);if (!strncasecmp (buf, QUIT_STR, strlen (QUIT_STR))) {	//用户输入了quit字符printf ("Client(fd=%d) is exiting!\n", newfd);break;}}close (newfd);}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面是多进程代码

多进程


/*./client serv_ip serv_port */
#include "net.h"void usage (char *s)
{printf ("\n%s serv_ip serv_port", s);printf ("\n\t serv_ip: server ip address");printf ("\n\t serv_port: server port(>5000)\n\n");
}int main (int argc, char **argv)
{int fd = -1;int port = -1;struct sockaddr_in sin;if (argc != 3) {usage (argv[0]);exit (1);}/* 1. 创建socket fd */if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {perror ("socket");exit (1);}port = atoi (argv[2]);if (port < 5000) {usage (argv[0]);exit (1);}/*2.连接服务器 *//*2.1 填充struct sockaddr_in结构体变量 */bzero (&sin, sizeof (sin));sin.sin_family = AF_INET;sin.sin_port = htons (port);	//网络字节序的端口号
#if 0sin.sin_addr.s_addr = inet_addr (SERV_IP_ADDR);
#elseif (inet_pton (AF_INET, argv[1], (void *) &sin.sin_addr) != 1) {perror ("inet_pton");exit (1);}
#endifif (connect (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {perror ("connect");exit (1);}printf ("Client staring...OK!\n");/*3. 读写数据 */char buf[BUFSIZ];int ret = -1;while (1) {bzero (buf, BUFSIZ);if (fgets (buf, BUFSIZ - 1, stdin) == NULL) {continue;}do {ret = write (fd, buf, strlen (buf));} while (ret < 0 && EINTR == errno);if (!strncasecmp (buf, QUIT_STR, strlen (QUIT_STR))) {	//用户输入了quit字符printf ("Client is exiting!\n");break;}}/*4.关闭套接字 */close (fd);
}

客户端都一样就是服务器变了

server

#include <pthread.h>
#include <signal.h>
#include "net.h"void cli_data_handle (void *arg);void sig_child_handle(int signo)
{if(SIGCHLD == signo) {waitpid(-1, NULL,  WNOHANG);}
}
int main (void)
{int fd = -1;struct sockaddr_in sin;signal(SIGCHLD, sig_child_handle);	/* 1. 创建socket fd */if ((fd = socket (AF_INET, SOCK_STREAM, 0)) < 0) {perror ("socket");exit (1);}/*优化4: 允许绑定地址快速重用 */int b_reuse = 1;setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof (int));/*2. 绑定 *//*2.1 填充struct sockaddr_in结构体变量 */bzero (&sin, sizeof (sin));sin.sin_family = AF_INET;sin.sin_port = htons (SERV_PORT);	//网络字节序的端口号/*优化1: 让服务器程序能绑定在任意的IP上 */
#if 1sin.sin_addr.s_addr = htonl (INADDR_ANY);
#elseif (inet_pton (AF_INET, SERV_IP_ADDR, (void *) &sin.sin_addr) != 1) {perror ("inet_pton");exit (1);}
#endif/*2.2 绑定 */if (bind (fd, (struct sockaddr *) &sin, sizeof (sin)) < 0) {perror ("bind");exit (1);}/*3. 调用listen()把主动套接字变成被动套接字 */if (listen (fd, BACKLOG) < 0) {perror ("listen");exit (1);}printf ("Server starting....OK!\n");int newfd = -1;/*4. 阻塞等待客户端连接请求 */struct sockaddr_in cin;socklen_t addrlen = sizeof (cin);while(1) {pid_t pid = -1;if ((newfd = accept (fd, (struct sockaddr *) &cin, &addrlen)) < 0) {perror ("accept");break;}/*创建一个子进程用于处理已建立连接的客户的交互数据*/if((pid = fork()) < 0) {perror("fork");break;}if(0 == pid) {  //子进程中close(fd);char ipv4_addr[16];if (!inet_ntop (AF_INET, (void *) &cin.sin_addr, ipv4_addr, sizeof (cin))) {perror ("inet_ntop");exit (1);}printf ("Clinet(%s:%d) is connected!\n", ipv4_addr, ntohs(cin.sin_port));	cli_data_handle(&newfd);		return 0;	} else { //实际上此处 pid >0, 父进程中 close(newfd);}}		close (fd);return 0;
}void cli_data_handle (void *arg)
{int newfd = *(int *) arg;printf ("Child handling process: newfd =%d\n", newfd);//..和newfd进行数据读写int ret = -1;char buf[BUFSIZ];while (1) {bzero (buf, BUFSIZ);do {ret = read (newfd, buf, BUFSIZ - 1);} while (ret < 0 && EINTR == errno);if (ret < 0) {perror ("read");exit (1);}if (!ret) {				//对方已经关闭break;}printf ("Receive data: %s\n", buf);if (!strncasecmp (buf, QUIT_STR, strlen (QUIT_STR))) {	//用户输入了quit字符printf ("Client(fd=%d) is exiting!\n", newfd);break;}}close (newfd);}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里是读

连接到指定的服务器并发送用户输入的字符串

client

#include "tcpnet.h"int main(int argc, char *argv[])
{int fd = -1;struct sockaddr_in sin;char buf[BUFSIZ];/*1.创建IPV4的TCP套接字 */fd = socket(AF_INET, SOCK_STREAM, 0);if(fd < 0) {perror("socket error!");exit(1);}/*2. 连接到服务器*//*2.1 填充服务器的IP地址和端口号*/bzero(&sin, sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(SERV_PORT);sin.sin_addr.s_addr = inet_addr(SERV_IPADDR);/*2.2 链接服务器*/if(connect(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {perror("connect");exit(1);}/* 从键盘获取数据发送给服务器*/while(1) {printf("Pls input string:\n");bzero(buf, BUFSIZ);if(fgets(buf, BUFSIZ-1, stdin) == NULL) continue;/*把buf中的数据写到网络套接字中*/	write(fd, buf, strlen(buf));if(!strncasecmp(buf, QUIT_STR, strlen(QUIT_STR))) { //用户输入了quit字符break;}}close(fd);return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

serve

#include <errno.h>#include "tcpnet.h"void *cli_data_handle(void *arg);
int main(void)
{int fd = -1, newfd;
//	int ret = -1;struct sockaddr_in sin;
//	char buf[BUFSIZ];/*1.创建IPV4的TCP套接字 */	fd = socket(AF_INET, SOCK_STREAM, 0);if(fd < 0) {perror("socket error!");exit(1);	}/* 允许本地的地址和端口快速重用 */int b_reuse = 1;setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof(int));/* 2.绑定在服务器的IP地址和端口号上*//* 2.1 填充struct sockaddr_in结构体*/bzero(&sin, sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(SERV_PORT);/*优化1:  接收从本机任意IP地址过来的发给TCP,SERV_PORT的数据*/sin.sin_addr.s_addr = htonl(INADDR_ANY);/* 2.2 绑定*/if(bind(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {perror("bind");exit(1);	}	/*3.把主动套接字变为被动套接字 */listen(fd, 5);printf("Server starting.....OK!\n");pthread_t tid; while(1) {struct cli_info *pcinfo= NULL;struct sockaddr_in cin;socklen_t clen = sizeof(cin);/*等待客户端连接*/do {newfd = accept(fd, (struct sockaddr *)&cin, &clen);}while(newfd < 0 && EINTR ==errno);if(newfd < 0) {perror("accept");exit(1);}/* 填充客户端信息*/pcinfo= (struct cli_info *)malloc(sizeof(struct cli_info));bzero(pcinfo, sizeof(struct cli_info));//填充内核链表//....FIXME!!!!pcinfo->cli_fd = newfd;memcpy(&pcinfo->cin, &cin, sizeof(cin));	//...填充其他数据//....FIXME!!!//把cinfo加入到user_info内核链表//...FIXME!!pthread_create(&tid, NULL, cli_data_handle, (void *)pcinfo);pthread_detach(tid);		}close(fd);return 0;
}void *cli_data_handle(void *arg)
{struct cli_info *pcinfo = (struct cli_info *)arg;char buf[BUFSIZ];char ipaddr[16];int ret = -1;/*设置线程的分离属性*/
//	pthread_detach(pthread_self());int newfd = pcinfo->cli_fd;struct sockaddr_in cin;memcpy(&cin ,&pcinfo->cin, sizeof(cin));bzero(ipaddr, 16);if(!inet_ntop(AF_INET, (void *)&cin.sin_addr, ipaddr, sizeof(cin))) {perror("inet_ntop");exit(1);}printf("Client(%s:%d) is conneted!\n", ipaddr,ntohs(cin.sin_port));/*5.和客户端进行信息的交互(读写) */while(1) {bzero(buf, BUFSIZ);do {ret =read(newfd, buf,BUFSIZ-1);}while(ret < 0 && EINTR == errno);if(ret < 0) {continue;}/* 处理数据*///....printf("Receive data: %s\n",buf);if(!ret || !strncasecmp(buf, QUIT_STR, strlen(QUIT_STR))) { //客户端发送了quit字符//...FIXME!!, 删除cli_info的所占内存break;}}close(newfd);return NULL;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后也是读
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
清空然后读

相关文章:

嵌入式学习L6网络编程D4多进程并发

多线程 客户端 /*./client serv_ip serv_port */ #include "net.h"void usage (char *s) {printf ("\n%s serv_ip serv_port", s);printf ("\n\t serv_ip: server ip address");printf ("\n\t serv_port: server port(>5000)\n\n"…...

四层协议攻防手册:从SYN Flood到UDP反射的深度防御

一、四层协议攻击类型与特征 攻击类型协议层特征SYN FloodTCP大量半开连接&#xff0c;SYN_RECV状态堆积UDP反射放大UDP小请求包触发大响应&#xff08;如NTP、DNS响应&#xff09;TCP分片攻击TCP发送异常分片耗尽重组资源连接耗尽攻击TCP建立大量空闲连接占用端口资源 二、TC…...

hive开窗函数

进入hive [root@hadoop01 conf]# hive ... hive (default)> show databases; OK database_name default Time taken: 0.528 seconds, Fetched: 1 row(s)创建数据库 hive (default)> create database test; hive (default)> use test;创建表 字段名字段字段类型学号S…...

【技术白皮书】内功心法 | 第二部分 | Telnet远程登录的工作原理

远程登录的工作原理 背景介绍远程登录远程登录的服务模式远程登录服务的实现基础远程登录服务的运行模式Telnet服务为什么不被操作系统管理 Telnet协议的原理网络虚终端&#xff08;NVT&#xff09;结束标示NVT的原理NVT屏蔽差异 背景介绍 绝大多数计算机都是运行多用户操作系…...

AnyPlace助力Franka突破物体形状与配置多样性挑战

物体几何形状与放置配置多样性的挑战 在机器人操作领域&#xff0c;物体放置一直是一个复杂且富有挑战性的任务。由于物体的几何形状和放置配置的多样性&#xff0c;实现稳健且可推广的物体放置变得尤为困难。 传统的机器人放置方法往往依赖于大量的特定任务演示&#xff0c;…...

【工控】线扫相机小结 第五篇

背景介绍 线扫相机通过光栅尺的脉冲触发&#xff0c; 我在调试线扫过程中&#xff0c;发现图像被拉伸&#xff0c;预设调节分配器。图像正常后&#xff0c;我提高的相机的扫描速度&#xff08;Y轴动的更快了&#xff09;。 动的更快的发现&#xff0c;图像变短了&#xff08;以…...

【Prometheus】层层解析prometheus如何监控k8s核心组件

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

泄露测试仪CTS的Sentinel I28使用

前言:本文档主要讨论CTS Sentinel I28的使用方法,设备图片如下: 具体文档可从下面链接下载: https://download.csdn.net/download/qq_34047402/90471262 泄露测试仪CTS的SentinelI28使用资源-CSDN文库 [注意] 调压方式,若选择机械式调压,那么测试的压力值只能有1个,…...

Python字典,集合

一.字典 在 Python 中&#xff0c;字典&#xff08;dict&#xff09;是一种非常重要且常用的数据结构&#xff0c;它用于存储键值对. 如下为字典的创建,打印键,打印值,和清空的操作 二.集合 在 Python 中&#xff0c;集合&#xff08;set&#xff09;是一种无序且唯一的数据…...

【数据分析大屏】基于Django+Vue汽车销售数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅

目录 一、项目背景 二、项目创新点 三、项目功能 四、开发技术介绍 五、项目功能展示 六、权威视频链接 一、项目背景 汽车行业数字化转型加速&#xff0c;销售数据多维分析需求激增。本项目针对传统报表系统交互性弱、实时性差等痛点&#xff0c;基于DjangoVue架构构建…...

Ubuntu用户安装cpolar内网穿透

前言 Cpolar作为一款体积小巧却功能强大的内网穿透软件&#xff0c;不仅能够在多种环境和应用场景中发挥巨大作用&#xff0c;还能适应多种操作系统&#xff0c;应用最为广泛的Windows、Mac OS系统自不必多说&#xff0c;稍显小众的Linux、树莓派、群辉等也在起支持之列&#…...

关于sqlalchemy的ORM的使用

关于sqlalchemy的ORM的使用 二、创建表三、使用数据表、查询记录 二、创建表 使用Mapped来映射字段 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker,Mapped,mapped_columnBase declarative_base() engine create_engin…...

C 语言分支与循环:构建程序逻辑的基石

在 C 语言的世界里&#xff0c;分支和循环结构是编程的核心内容&#xff0c;它们赋予了程序根据不同条件执行不同操作以及重复执行特定代码段的能力&#xff0c;让程序变得更加智能和高效。今天&#xff0c;我们就深入探讨 C 语言分支和循环的相关知识&#xff0c;助力大家夯实…...

J-LangChain - Agent - 编排一个 ReAct + Function Call 反应链

系列文章索引 J-LangChain 入门 介绍 j‑langchain 是一款基于 Java 的 AIGC 编排框架&#xff0c;致力于集成多种大模型&#xff08;LLM&#xff09;调用及 RAG 工具。自 1.0.8 版本起&#xff0c;我们引入了工具函数&#xff08;Function Call&#xff09;调用能力&#xf…...

Rust 之一 基本环境搭建、各组件工具的文档、源码、配置

概述 Rust 是一种强调性能、类型安全和并发性的通用编程语言。它强制执行内存安全&#xff0c;使用其特有的所有权机制&#xff0c;而无需传统的垃圾收集器。Rust 不强制执行编程范式&#xff0c;但受到函数式编程思想的影响。 最初是由 Mozilla 员工 Graydon Hoare 在 2006 年…...

详细介绍 Jupyter nbconvert 工具及其用法:如何将 Notebook 转换为 Python 脚本

nbconvert 是 Jupyter 提供的一个非常强大的工具&#xff0c;允许用户将 Jupyter Notebook 文件&#xff08;.ipynb&#xff09;转换成多种格式&#xff0c;包括 Python 脚本&#xff08;.py&#xff09;、HTML、PDF、LaTeX 等。你可以通过命令行来运行 nbconvert&#xff0c;也…...

C语言之预处理

预处理 一.头文件的包含1.1头文件的作用1.2包含头文件的方式- 包含标准库头文件- 包含用户自定义头文件 1.3嵌套文件包含 二.条件编译2.1条件编译的作用2.2条件编译的指令 三.预定义符号四.define4.1define定义常量4.2#define定义宏4.2.1定义宏时常见错误 4.3宏替换的规则4.4带…...

AcWing--869.试除法求约数

题目&#xff1a; 给定 n 个正整数 ai&#xff0c;对于每个整数 ai&#xff0c;请你按照从小到大的顺序输出它的所有约数。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数 ai。 输出格式 输出共 n 行&#xff0c;其中第 i 行输出第 i 个整数 ai 的所有…...

【HeadFirst系列之HeadFirstJava】第16天之深入解析 Java 集合与泛型:高效管理数据的终极指南!(含代码实战)

Java 集合与泛型全解析&#xff1a;数据结构的奥秘&#xff08;基于 Head First Java 第 16 章&#xff09; 在 Java 开发中&#xff0c;我们经常需要存储和操作大量数据。如何高效地存储、检索和操作数据&#xff1f;如何避免数组的局限性&#xff1f;Java 集合框架&#xff…...

【从零开始学习计算机科学】操作系统(七)文件管理

【从零开始学习计算机科学】操作系统(七)文件管理 文件管理文件的逻辑结构文件的读写方式文件的物理结构与组织文件目录空闲块管理文件的共享文件的权限控制与保护文件系统的其他功能文件管理 文件管理主要涉及文件的逻辑组织和物理组织,目录的结构和管理。所谓文件管理,就…...

Stable Diffusion F.1模型全面解析

一、引言&#xff1a;生成式AI的变革与SD模型的演进 生成式AI的崛起 扩散模型&#xff08;Diffusion Model&#xff09;成为图像生成领域的主流范式&#xff0c;其通过逐步去噪过程实现高保真图像合成。Stable Diffusion&#xff08;SD&#xff09;作为开源社区标杆&#xff0c…...

基于SpringBoot的手机销售网站设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

上海利氪科技-再次续订MappingSpace

2024年6月&#xff0c;智能底盘系统方案商利氪科技完成C轮融资&#xff0c;本轮融资规模超10亿元人民币。 成立于2021年&#xff0c;利氪科技短短三年时间就已获得近20亿元融资。 利氪科技是领先的智能线控底盘系统方案商。公司聚焦新能源汽车和自动驾驶核心领域&#xff0c;依…...

go注册rpc接口

1.定义proto文件&#xff1a; syntax "proto3";package pb;service Service { rpc RPC (Request) returns (Reply) {} }message Request {string Action 1;int64 TraceID 2;string Payload 3; }message Reply {int32 Code 1;int64 TraceID 2;string Pa…...

如何在Spring Boot中校验用户上传的图片文件的两种方法

在现代应用中&#xff0c;用户上传图片是一个常见的需求。无论是社交平台、电子商务网站还是任何需要用户交互的应用&#xff0c;图片上传功能都显得尤为重要。但合理地校验用户上传的图片文件是必不可少的步骤&#xff0c;避免不合规的文件影响系统的稳定性和安全性。本文将介…...

如何将一个项目推送到gitlab

1. 初始化本地项目为 Git 仓库 若本地项目还不是 Git 仓库&#xff0c;要先将其初始化为 Git 仓库。在项目根目录下打开终端&#xff0c;执行如下命令&#xff1a; git init 2. 添加文件到暂存区 使用 git add 命令把项目中的文件添加到暂存区。若要添加所有文件&#xff0…...

【JavaWeb学习Day24】

Web前端实战 Vue工程化 Vue是一款用于构建用户界面的渐进式的JavaScript框架。&#xff08;官方&#xff1a;https://cn.vuejs.org&#xff09; Vue项目工程化&#xff1a;在企业级的前端项目开发中&#xff0c;把前端开发所需求的工具、技术、流程、经验等进行规范、标准化。…...

Scratch034豌豆发射(下)

知识回顾 1、克隆体点击角色的判断 2、使用克隆体时“停止该角色其他脚本”积木的作用范围。 效果演示 提示:这里可以添加本文要记录的大概内容每隔一段时间,舞台右侧就会出现多个除草机向左移动 点击不同位置的豌豆射手,可以发射豌豆攻击对应位置的除草机 除草机被豌豆击中…...

nacos下载及安装

下载官方最新稳定版 github下载较慢&#xff0c;推荐下面的下载链接 Nacos Server 下载 | Nacos 官网 点击下载和试用下载最新稳定版 Nacos Server 下载 | Nacos 官网 配置检查&#xff08;可选&#xff09; 默认情况下&#xff0c;Nacos 使用内置的 Derby 数据库&#x…...

javase集合框架Map篇

一、常见的Map的实现 有HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap。 二、HashMap和Hashtable 的区别 HashMap&#xff1a;底层是基于数组链表&#xff0c;非线程安全的&#xff0c;默认容量是16、允许有空的健和值。 Hashtable&#xff1a;基于哈希表…...

【RAGFlow】windows本地pycharm运行

原因 由于官方只提供了docker部署&#xff0c;基于开源代码需要实现自己内部得逻辑&#xff0c;所以需要本地pycharm能访问&#xff0c;且docker运行依赖得其余组件&#xff0c;均需要使用开发服务器得配置。 修改过程 安装python 项目依赖于Python 版本&#xff1a;>3.1…...

STM32初始安装

前言 很多人刚买来STM32就迫不及待地想要用它来写程序&#xff0c;看见STM32开发版和ST-Link上有几个插口就直接连接&#xff0c;结果就像我一样一不小心就导致ST -Link烧坏了&#x1f602; 所以本篇博客将做最基础的但是对于小白来说最重要的教学&#xff0c;STM32的线路连接…...

数据库系统概论(二)数据模型

数据库系统概论&#xff08;二&#xff09;数据模型 数据库系统概论&#xff08;二&#xff09;数据模型前言一、数据建模二、概念模型三、数据模型的三要素四、层次模型五、网状模型六、关系模型 总结&#xff08;核心概念速记&#xff09;&#xff1a; 数据库系统概论&#x…...

深入理解C语言链表:数据结构的基石

在C语言的编程宇宙中&#xff0c;链表就像是一座稳固的基石&#xff0c;支撑着众多复杂程序的构建。它以独特的魅力和强大的功能&#xff0c;在解决各类编程难题时发挥着至关重要的作用。今天&#xff0c;就让我们一同深入探索链表的奥秘。 目录 一、链表初相识 二、链表的结…...

微信小程序文件存储和获取的详细方案

在微信小程序中&#xff0c;要根据索引&#xff08;如自定义标识符&#xff09;检查是否存在对应的文件&#xff0c;可以通过以下方案实现。这里假设你已通过某种方式将文件路径与索引关联存储&#xff08;例如使用本地缓存 Storage&#xff09;&#xff0c;以下是完整流程&…...

java BCC异或校验例子

需求 对一个十六进制的字符串进行BCC校验 方法 private static String XORCheck(String rawMsg) {// 16进制字符串需要转成10进制数组进行校验&#xff0c;然后再返回16进制字符串用于与原来的字符匹配byte[] bytes HexDumpMsgFormat.hexStr2DesBytes(rawMsg);return BytesUt…...

[machine learning] DP(Data Parallel) vs DDP(Distributed Data Parallel)

DP和DDP是并行训练的两种方法&#xff0c;本文简单介绍它们两者的区别。 一、DP (Data Parallel) DP是单进程&#xff0c;多线程的&#xff0c;每个线程负责一个GPU&#xff0c;它只适用于一台机器。DP训练的流程如下图所示(图片转载自&#xff1a;https://medium.com/mlshar…...

今日头条文章爬虫教程

今日头条文章爬虫教程 随着互联网的发展&#xff0c;新闻资讯类平台如今日头条积累了海量的数据。对于数据分析师、研究人员等群体来说&#xff0c;获取这些数据进行分析和研究具有重要的价值。本文将介绍如何使用Python编写爬虫&#xff0c;爬取今日头条的文章数据。 一、准…...

鸿蒙应用开发—数据持久化之SQLite

文章目录 SQLite简介创建数据库添加数据查询数据更新数据删除数据升级数据库使用事务参考 SQLite简介 SQLite是一个轻量级关系数据库&#xff0c;占用资源很少&#xff0c;只有几百KB的大小&#xff0c;无需服务器支撑&#xff0c;是一个零配置、事务性的SQL数据库引擎。 相对…...

Docker Compose 部署 steamcmd 安装奈斯服务端

由于打算在云端服务器部署奈斯启示录服务端跟朋友们一起玩&#xff0c; 所以在云端搭建服务器&#xff0c; 顺便写下本文章记录搭建的过程。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 要使用 Docker Compose 部署 steamcmd&#xff08;Steam 命令行…...

K8s 1.27.1 实战系列(八)Service

一、Service介绍 1、Service 的作用与核心功能 Service 是 Kubernetes 中用于抽象一组 Pod 并提供稳定访问入口的资源。它解决了以下问题: ​Pod IP 不固定:Pod 可能因故障、扩缩容或更新导致 IP 变化,Service 通过 ClusterIP(虚拟 IP)提供固定访问地址。​负载均衡:自动…...

Scala编程_实现Rational的基本操作

在Scala中实现一个简单的有理数&#xff08;Rational&#xff09;类&#xff0c;并对其进行加法、比较等基本操作. 有理数的定义 有理数是可以表示为两个整数的比值的数&#xff0c;通常形式为 n / d&#xff0c;其中 n 是分子&#xff0c;d 是分母。为了确保我们的有理数始终…...

Android15 Camera框架中的StatusTracker

StatusTracker介绍 StatusTracker是Android15 Camera框架中用来协调Camera3各组件之间状态转换的类。 StatusTracker线程名&#xff1a;std::string("C3Dev-") mId "-Status" Camera3 StatusTracker工作原理 StatusTracker实现批处理&#xff08;状态…...

Manus 演示案例:谷歌公司运营模拟器游戏体验

一、项目背景与愿景 在科技行业蓬勃发展的当下&#xff0c;谷歌作为行业巨头&#xff0c;其成长历程充满了无数值得深入探究的决策智慧。这些决策不仅塑造了谷歌的辉煌&#xff0c;也为全球企业的发展提供了宝贵的借鉴。本项目旨在打造一款以谷歌公司发展为蓝本的运营模拟器游戏…...

【大模型基础_毛玉仁】2.1 大数据+大模型→新智能

【大模型基础_毛玉仁】2.1 大数据大模型→新智能 2.大语言模型架构2.1 大数据大模型→新智能2.1.1 大数据大模型→能力增强1&#xff09;Kaplan-McCandlish 扩展法则2&#xff09;Chinchilla 扩展法则 2.1.2 大数据大模型→能力扩展 2.大语言模型架构 大语言模型&#xff08;L…...

20天 - TCP 和 UDP 有什么区别?说说 TCP 的三次握手?TCP 是用来解决什么问题?

TCP 和 UDP 有什么区别&#xff1f; TCP&#xff08;传输控制协议&#xff09;和 UDP&#xff08;用户数据报协议&#xff09;都是传输层的网络协议&#xff0c;它们的主要区别如下&#xff1a; 连接方式 TCP&#xff1a;面向连接的协议&#xff0c;类似于打电话&#xff0c…...

【设计模式】掌握建造者模式:如何优雅地解决复杂对象创建难题?

概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。 由于实现了构建和装配的解耦。…...

【网络安全工程】任务11:路由器配置与静态路由配置

目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用&#xff1a;通过路由表进行数据的转发。 2、交换机的作用&#xff1a;通过学习和识别 MAC 地址&#xff0c;依据 M…...

10 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar头像组件开发教程(一)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 目录 第一篇&#xff1a;Avatar 组件基础概念与设计1. 组件概述2. 接口设计2.1 形状类型定义2.2 尺寸类型定义2.3 组件属性接口 3. 设计原则4. 使用…...

蓝桥杯备赛-差分-重新排序

问题描述 给定一个数组 AA 和一些查询 Li,RiLi​,Ri​, 求数组中第 LiLi​ 至第 RiRi​ 个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得最终每个查 询结果的和尽可能地大。小蓝想知道相比原数组, 所有查询结果的总和最多可 以增加多少? 输入格式 输…...