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

项目篇:基于TCP通信模型的外卖软件实现

一、基本成员及功能实现

本项目主要由服务器,消费者,商家,外卖员组成。基本的功能如下。

对所有人:

1、可以注册登录

2、可以修改个人信息

3、可以销户

商家:

1、注册时需要填写售卖商品信息

2、可以修改商品信息对自己的商品增删改查

消费者:

1:可以查看商家列表并进入商家列表选购商品

2:可以查看购物车自己已经选购的商品

3:确认完购物车后将商品放入订单列表等待外卖员接单

4:10分钟还未接单将发消息给消费者让其重新下单

5:选购完商品后将选购信息发送给商家

外卖员:

1:可以查看订单列表

2:可以接单并派送

3:将外卖送给消费者后自动结单

服务器:

1:支持所有身份的登录注册功能,分类储存当前用户(商家、消费者、外卖员)

2:对外卖员:储存当前订单列表、需要时打印订单至终端

3:对消费者:支持多个用户同时在线选购以及购物车系统

4:对消费者:支持计时功能到达十分钟后无人接单自动取消订单并提示消费者重新下单

5:会记录所有订单的订单编号和结单时间

6:支持商家和消费者之间的订单传输功能

二、功能展示

参考视频:效果演示-CSDN直播

三、原理实现

1、数据库结构

        本项目使用sqlite数据库,在服务器端需要有一套比较完备的数据库结构。本次项目主要创建了四个不同的数据库,分别是:商家、其他人(消费者和外卖员)、购物车、订单记录。

        对于商家数据库来说,他必须有一个merchant表单用于记录商家用户的用户名和密码。商家的用户名就是商家店铺的名称。将用户名设为主键,不允许重复。每当一个商家注册时,需要填写自己出售的商品,数据库中会自动再创建一个名为该商家的表单用于存储出售的商品信息(商品名称及商品价格)。

        对于其他人来说,要有一个username表单用于记录外卖员和消费者的用户名,防止用户名重复。再创建消费者和外卖员两个表单分别存储用户名和密码。

        对于购物车,只需要当消费者添加商品进购物车时创建,再消费者确认购物车后删除。是一个比较动态的。

        对于记录来说,他会记录订单编号、确认订单时间、结束时间、消费者用户名和外卖员用户名。在确认订单后存入除了结束时间的其他内容,并将订单编号发给外卖员客户端。当外卖员结束订单后将结束时间填入。

2、超时机制

        在消费者确认订单后,会将订单存放在服务器的链表中,链表中有消费者用户名,商家用户名,下单时间、消费者客户端的信息结构体和套接字接口。在存入链表中会设置一个闹钟alarm。在设定时间到了之后向进程发送SIGALRM信号,然后使用signal函数捕捉这种信号后去遍历订单链表,给订单的消费者发信息并将超时的订单删掉。如果订单被外卖员接走,那么也会删除该订单。这样在遍历的时候也找不到要删除的订单,以实现超时机制。

3、信息交互

        本项目的信息交互非常多,这对信息的种类分类有着很高的要求。我是用的是类似tftp协议的信息传输方式,将信息的种类封装进一个字符数组中,然后在服务器端进行解码,并实现相应功能。

最后附上本次项目的主函数源码

int main(int argc, const char *argv[])
{if(signal(SIGALRM,handle)==SIG_ERR){perror("signal error:");return -1;}//打开所有的数据库sqlite3 *shangjialist=NULL;if(sqlite3_open("./shangjialist.db",&shangjialist)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(shangjialist));return -1;}sqlite3 *otherlist=NULL;if(sqlite3_open("./otherlist.db",&otherlist)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(otherlist));return -1;}sqlite3 *gouwuche=NULL;if(sqlite3_open("./gouwuche.db",&gouwuche)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(otherlist));return -1;}sqlite3 *recorder=NULL;if(sqlite3_open("./record.db",&recorder)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(otherlist));return -1;}//初始化所有的数据库init_sqlite(shangjialist,otherlist,recorder);int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error:");return -1;}int reuse = 1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockaddr error:");return -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);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error:");return -1;}if(listen(sfd,128)==-1){perror("listen error:");return -1;}struct sockaddr_in cin;socklen_t socklen=sizeof(cin);int n=2;struct pollfd pfd[1024];pfd[0].fd=0;pfd[0].events=POLLIN;pfd[1].fd=sfd;pfd[1].events=POLLIN;while(1){int res=poll(pfd,n,-1);if(res==0){printf("manba out\n");return -1;}else if(res==-1&&errno!=4){perror("poll error:");return -1;}if(pfd[1].revents==POLLIN){int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);pfd[n].fd=newfd;pfd[n].events=POLLIN;n++;printf("[%s:%d:%d]已连接\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);}if(pfd[0].revents==POLLIN){}for(int i=2;i<n;i++){if(pfd[i].revents==POLLIN){char buf[111]="";recvfrom(pfd[i].fd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&socklen);short *type_point=(short*)buf;switch(ntohs(*type_point)){case 1001://消费者注册信息{char *name_point=buf+2;char *psd_point=buf+strlen(name_point)+3;char sbuf[111]="";if(new_member_other(otherlist,name_point,psd_point,"xiaofeizhe")!=0)//注册失败,用户名重复{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}strcpy(sbuf,"success");send(pfd[i].fd,sbuf,sizeof(sbuf),0);printf("%s注册成功\n",name_point);break;}case 1002://消费者登陆成功后发来的信息,提示服务器将所有商家名称传给消费者{get_merchant(pfd[i].fd,shangjialist);break;}case 1003://消费者请求查看商家的所有商品{char *name_point=buf+2;get_table(pfd[i].fd,shangjialist,name_point);break;}case 1004:{char *name_point=buf+2;//用户名char *good_name_point=buf+strlen(name_point)+3;//商品名称char *mer_name_point=buf+strlen(name_point)+strlen(good_name_point)+4;//商家名称add_gouwuche(pfd[i].fd,shangjialist,gouwuche,name_point,good_name_point,mer_name_point);break;}case 1005://将购物车的信息发送给消费者等待确认信息{char *name_point=buf+2;get_table(pfd[i].fd,gouwuche,name_point);break;}case 1006://消费者发来确认信息{char *name_point=buf+2;char *mer_name_point=buf+strlen(name_point)+3;head=add_dingdan(head,name_point,mer_name_point,cin,pfd[i].fd);send_msg_to_mer(gouwuche,name_point,mer_name_point);del_gouwuche(gouwuche,name_point);break;}case 1007://修改密码信息{short *ide_point=(short *)(buf+2);char *name_point=buf+4;char *psd_point=buf+strlen(name_point)+5;short identity=ntohs(*ide_point);char sbuf[111]="";if(identity==0){if(update_info(otherlist,"xiaofeizhe",name_point,psd_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}}else if(identity==1){if(update_info(otherlist,"waimaiyuan",name_point,psd_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}}else if(identity==2){if(update_info(shangjialist,"merchant",name_point,psd_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}}else{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 1008://销户{char sbuf[111]="";short *ide_point=(short *)(buf+2);short identity=ntohs(*ide_point);char *name_point=buf+4;if(del_user(shangjialist,otherlist,identity,name_point,pfd[i].fd)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 2001://商家注册信息{char sbuf[111]="";char *name_point=buf+2;char *psd_point=buf+strlen(name_point)+3;if(new_member_shangjia(shangjialist,name_point,psd_point)!=0){strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}strcpy(sbuf,"success");send(pfd[i].fd,sbuf,sizeof(sbuf),0);printf("%s注册成功\n",name_point);break;}case 2002://商家添加商品信息{char sbuf[111]="";char *name_point=buf+2;short *count_point=(short *)(buf+strlen(name_point)+3);char *good_name_point=buf+strlen(name_point)+5;short *price_point=(short *)(good_name_point+strlen(good_name_point)+1);if(new_good(shangjialist,name_point,count_point,good_name_point,price_point)!=0){strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}strcpy(sbuf,"success");send(pfd[i].fd,sbuf,sizeof(sbuf),0);printf("%s添加商品\n",name_point);break;}case 2003://商家修改商品前获取商品列表{char *name_point=buf+2;get_table(pfd[i].fd,shangjialist,name_point);break;}case 2004://商家增加商品{char sbuf[111]="";char *good_name_point=buf+2;char *price_point=buf+strlen(good_name_point)+3;char *name_point=buf+strlen(good_name_point)+strlen(price_point)+4;if(add_good(pfd[i].fd,shangjialist,good_name_point,price_point,name_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 2005://商家删除商品{char sbuf[111]="";char *name_point=buf+2;char *good_name_point=buf+strlen(name_point)+3;if(del_good(pfd[i].fd,shangjialist,name_point,good_name_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 2006://商家修改商品名称{char sbuf[111]="";char *name_point=buf+2;char *good_name_point=buf+strlen(name_point)+3;char *new_good_name_point=buf+strlen(name_point)+strlen(good_name_point)+4;if(update_good_name(shangjialist,name_point,good_name_point,new_good_name_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 2007://商家修改商品价格{char sbuf[111]="";char *name_point=buf+2;char *good_name_point=buf+strlen(name_point)+3;char *new_price_point=buf+strlen(name_point)+strlen(good_name_point)+4;if(update_good_price(shangjialist,name_point,good_name_point,new_price_point)==0){strcpy(sbuf,"success");}else{strcpy(sbuf,"fail");}send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}case 2008://商家登录后将商家的信息存入链表{char *name_point=buf+2;add_sj(pfd[i].fd,cin,name_point);break;}case 3001://外卖员注册信息{char *name_point=buf+2;char *psd_point=buf+strlen(name_point)+3;char sbuf[111]="";if(new_member_other(otherlist,name_point,psd_point,"waimaiyuan")!=0)//注册失败,用户名重复{strcpy(sbuf,"fail");send(pfd[i].fd,sbuf,sizeof(sbuf),0);break;}strcpy(sbuf,"success");send(pfd[i].fd,sbuf,sizeof(sbuf),0);printf("%s注册成功\n",name_point);break;}case 3002://外卖员获取当前订单{get_dingdan(pfd[i].fd);break;}case 3003://确认订单后将大部分订单记录存入数据库{char *name_point=buf+2;char *ddname_point=buf+strlen(name_point)+3;save(recorder,name_point,ddname_point,pfd[i].fd);break;}case 3004://当结束订单后修改订单结束时间{char *ddnumb_point=buf+2;save2(recorder,ddnumb_point);break;}case 4001://登录信息{char *name_point=buf+2;char *psd_point=buf+strlen(name_point)+3;login(pfd[i].fd,shangjialist,otherlist,name_point,psd_point);break;}case 4002://退出消息{pfd[i].fd=-1;	printf("[%s:%d]已下线\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));break;}}}}}return 0;
}

       

int main(int argc, const char *argv[])
{int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error:");return -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);if(connect(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error:");return -1;}pid_t pid=fork();if(pid==0){//子进程,用于接受消息char buf[111]="";while(1){sleep(1);bzero(buf,sizeof(buf));recv(sfd,buf,sizeof(buf),0);if(strcmp(buf,"quit")==0){break;}printf("%s\n",buf);}exit(EXIT_SUCCESS);}else if(pid>0){while(1){printf("====================欢迎使用====================\n");printf("1登录\t2注册\t0退出\n");printf("请输入命令\n");int cmd;scanf("%d",&cmd);getchar();switch(cmd){case 1:{login(sfd);break;}case 2:{registe(sfd);break;}case 0:{kill(pid,SIGKILL);char buf[111]="";short *type_point=(short *)buf;*type_point=htons(4002);send(sfd,buf,sizeof(buf),0);close(sfd);wait(NULL);return 0;}default:{printf("输入有误\n");}}printf("请输入任意键清屏\n");while(getchar()!='\n');//system("clear");}}return 0;
}

相关文章:

项目篇:基于TCP通信模型的外卖软件实现

一、基本成员及功能实现 本项目主要由服务器&#xff0c;消费者&#xff0c;商家&#xff0c;外卖员组成。基本的功能如下。 对所有人&#xff1a; 1、可以注册登录 2、可以修改个人信息 3、可以销户 商家&#xff1a; 1、注册时需要填写售卖商品信息 2、可以修改商品信…...

深入浅出 diffusion(2):pytorch 实现 diffusion 加噪过程

我在上篇博客深入浅出 diffusion&#xff08;1&#xff09;&#xff1a;白话 diffusion 原理&#xff08;无公式&#xff09;中介绍了 diffusion 的一些基本原理&#xff0c;其中谈到了 diffusion 的加噪过程&#xff0c;本文用pytorch 实现下到底是怎么加噪的。 import torch…...

【软件测试】学习笔记-构建并执行 JMeter 脚本的正确姿势

有些团队在组建之初往往并没有配置性能测试人员&#xff0c;后来随着公司业务体量的上升&#xff0c;开始有了性能测试的需求&#xff0c;很多公司为了节约成本会在业务测试团队里选一些技术能力不错的同学进行性能测试&#xff0c;但这些同学也是摸着石头过河。他们会去网上寻…...

iOS 面试 Swift基础题

一、Swift 存储属性和计算属性比较&#xff1a; 存储型属性:用于存储一个常量或者变量 计算型属性: 计算性属性不直接存储值,而是用 get / set 来取值 和 赋值,可以操作其他属性的变化. 计算属性可以用于类、结构体和枚举&#xff0c;存储属性只能用于类和结构体。存储属性可…...

(七)for循环控制

文章目录 用法while的用法for的用法两者之间的联系可以相互等价用for改写while示例for和while的死循环怎么写for循环见怪不怪表达式1省略第一.三个表达式省略&#xff08;for 改 while&#xff09;全省略即死循环&#xff08;上面已介绍&#xff09; 用法 类比学习while语句 …...

ASP .NET Core Api 使用过滤器

过滤器说明 过滤器与中间件很相似&#xff0c;过滤器&#xff08;Filters&#xff09;可在管道&#xff08;pipeline&#xff09;特定阶段&#xff08;particular stage&#xff09;前后执行操作。可以将过滤器视为拦截器&#xff08;interceptors&#xff09;。 过滤器级别范围…...

CodeGPT--(Visual )

GitCode - 开发者的代码家园 gitcode.com/ inscode.csdn.net/liujiaping/java_1706242128563/edit?openFileMain.java&editTypelite marketplace.visualstudio.com/items?itemNameCSDN.csdn-codegpt&spm1018.2226.3001.9836&extra%5Butm_source%5Dvip_chatgpt_c…...

1.Mybatis入门

目录 前言 1入门 1.1 入门程序实现 1.2 数据准备 ​编辑 1.3 配置Mybatis 1.4 编写SQL语句 1.5 单元测试 1.6 解决SQL警告与提示 2. JDBC介绍(了解) 2.1 介绍 2.2 代码 2.3 问题分析 2.4 技术对比 3. 数据库连接池 3.1 介绍 3.2 产品 4. lombok 4.1 介绍 4.…...

android camera系列(Camera1、Camera2、CameraX)的使用以及输出的图像格式

一、Camera 1.1、结合SurfaceView实现预览 1.1.1、布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-au…...

live555搭建流式rtsp服务器

源代码已上传gitee 一、需求 live555源代码中的liveMediaServer是将本地文件作为源文件搭建rtsp服务器&#xff0c;我想用live555封装一个第三方库&#xff0c;接收流数据搭建Rtsp服务器&#xff1b;预想接口如下&#xff1a; class LiveRtspServer { public:/***brief构造一…...

Apache孵化器领路人与导师的职责

对于捐赠到 ASF 孵化器的项目来说&#xff0c; ASF 孵化器项目管理委员会&#xff08;IPMC&#xff09;的成员会扮演两个角色&#xff0c;一个 孵化器领路人&#xff08;Champion&#xff09;&#xff0c;另外一个是孵化器导师&#xff08;Mentor&#xff09;。 本文源自 ALC …...

【C++中STL】set/multiset容器

set/multiset容器 Set基本概念set构造和赋值set的大小和交换set的插入和删除set查找和统计 set和multiset的区别pair对组两种创建方式 set容器排序 Set基本概念 所有元素都会在插入时自动被排序。 set/multist容器属于关联式容器&#xff0c;底层结构属于二叉树。 set不允许容…...

使用 create-react-app 创建 react 应用

一、创建项目并启动 第一步&#xff1a;全局安装&#xff1a;npm install -g create-react-app 第二步&#xff1a;切换到想创建项目的目录&#xff0c;使用命令create-react-app hello-react 第三步&#xff1a;进入项目目录&#xff0c;cd hello-react 第四步&#xff1a;启…...

obs-studio 源码学习 obs.h

obs.h 引用头文件介绍 c99defs.h&#xff1a;这个头文件提供了一些 C99 标准的定义和声明&#xff0c;包括一些常用的宏定义和类型定义&#xff0c;用于提高代码的可移植性和兼容性。 bmem.h&#xff1a;这个头文件提供了对内存分配和管理的功能&#xff0c;包括一些内存分配…...

C语言-指针的基本知识(上)

一、关于内存 存储器&#xff1a;存储数据器件 外存 外存又叫外部存储器&#xff0c;长期存放数据&#xff0c;掉电不丢失数据 常见的外存设备&#xff1a;硬盘、flash、rom、u盘、光盘、磁带 内存 内存又叫内部存储器&#xff0c;暂时存放数据&#xff0c;掉电数据…...

4核16G幻兽帕鲁服务器优惠价格表,阿里云和腾讯云报价

幻兽帕鲁服务器价格多少钱&#xff1f;4核16G服务器Palworld官方推荐配置&#xff0c;阿里云4核16G服务器32元1个月、96元3个月&#xff0c;腾讯云幻兽帕鲁服务器服务器4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64…...

GitHub 上传文件夹到远程仓库、再次上传修改文件、如何使用lfs上传大文件、github报错一些问题

按照大家的做法&#xff0c;把自己遇到的问题及解决方案写出来&#xff08;注意&#xff1a;Error里面有些方法有时候我用可以成功&#xff0c;有时候我用也不能成功&#xff0c;写出来仅供参考&#xff0c;实在不行重头再clone&#xff0c;add&#xff0c;commit&#xff0c;p…...

一些es的基本操作

目录 给索引增加字段&#xff1a;给索引删除字段[^1]&#xff1a;创建索引&#xff1a;插入document删除document(应该是按ID) : 给索引增加字段&#xff1a; 用postMan: 给名为population_portrait_hash_seven的索引增加了一个text类型的字段。 用chrome插件Elasticvue 的Re…...

酒鬼酒2024年展望:稳发展动能,迈入恢复性增长轨道

文 | 琥珀酒研社 作者 | 渡过 最近几个月来&#xff0c;白酒估值回落到近十年来低位&#xff0c;反映出了整个白酒行业的市场低迷和虚弱现状。不管是头部企业五粮液、泸州老窖&#xff0c;还是区域酒企口子窖、金种子酒等&#xff0c;最近都通过“回购”或“增持”&#xff0…...

1002. HarmonyOS 开发问题:鸿蒙 OS 技术特性是什么?

1002. HarmonyOS 开发问题&#xff1a;鸿蒙 OS 技术特性是什么? 硬件互助&#xff0c;资源共享 分布式软总线 分布式软总线是多种终端设备的统一基座&#xff0c;为设备之间的互联互通提供了统一的分布式通信能力&#xff0c;能够快速发现并连接设备&#xff0c;高效地分发…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...