tag 标签: linux

相关帖子
相关博文
  • 2025-1-3 11:37
    128 次阅读|
    0 个评论
    本文继续介绍Linux系统查看硬件配置及常用调试命令,方便开发者快速了解开发板硬件信息及进行相关调试。 触觉智能RK3562开发板 演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。 查看系统版本信息 查看操作系统版本信息 root @ido :/ # cat /etc/*release DISTRIB_ID =Ubuntu DISTRIB_RELEASE = 20.04 DISTRIB_CODENAME =focal DISTRIB_DESCRIPTION = "Ubuntu 20.04.3 LTS" NAME = "Ubuntu" VERSION = "20.04.3 LTS (Focal Fossa)" ID =ubuntu ID_LIKE =debian PRETTY_NAME = "Ubuntu 20.04.3 LTS" VERSION_ID = "20.04" HOME_URL = "https://www.ubuntu.com/" SUPPORT_URL = "https://help.ubuntu.com/" BUG_REPORT_URL = "https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL = "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME =focal UBUNTU_CODENAME =focal BUILD_INFO = "root@industio Sun Oct 9 05:54:12 UTC 2022" BUILD_INFO = "root@industio Thu Oct 20 02:17:12 UTC 2022" BUILD_INFO = "root@industio Thu Oct 20 02:19:41 UTC 2022" 查看linux内核版本信息 root @ido :/ # uname -a Linux ido 5.10.160#24 SMP Thu Jul 18 19:06:25 CST 2024 aarch64 aarch64 aarch64 GNU/Linux 查看内核信息 直接查看内核信息 root @ido :/ #dmesg Booting Linux on physical CPU 0x0000000000 Linux version 5.10 .160 (ronnie @dell-PowerEdge-R430 ) (aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3 - 2021.07 (arm- 10.29 )) 10.3 . 1 20210621 , GNU ld (GNU Toolchain for the A-profile Architecture 10.3 - 2021.07 (arm- 10.29 )) 2.36 . 1.20210621 ) #24 SMP Thu Jul 18 19 : 06 : 25 CST 2024 Machine model: Rockchip RK3562 IDO EVB3562 V1B Board ...... 筛选出关键字相关的内核信息 # "xxx" 替换成要搜索的关键字 dmesg | grep "xxx" #需要忽略大小写时可以用加上-i dmesg | grep -i "xxx" 关闭内核打印信息 将系统日志优先级调为 0 即可关闭内核打印信息 echo /proc/sys/kernel/printk #控制台的日志优先级简介 # define KERN_EMERG 0 致命级:紧急事件消息,系统崩溃之前提示,表示系统不可用 # define KERN_ALERT 1 警戒级:报告消息,表示必须采取措施 # define KERN_CRIT 2 临界级:临界条件,通常涉及严重的硬件或软件操作失败 # define KERN_ERR 3 错误级:错误条件,驱动程序常用KERN_ERR来报告硬件错误 # define KERN_WARNING 4 告警级:警告条件,对可能出现问题的情况进行警告 # define KERN_NOTICE 5 注意级:正常但又重要的条件,用于提醒 # define KERN_INFO 6 通知级:提示信息,如驱动程序启动时,打印硬件信息 # define KERN_DEBUG 7 调试级:调试级别的信息 查看进程 查看进程信息 PID表示唯一标识,CMD表示进程名,能有多个。 root @ido :~ #ps PIDTTY TIME CMD 465ttyFIQ0 00:00:00 login 769ttyFIQ0 00:00:00 bash 991ttyFIQ0 00:00:00 ps 杀死进程 #杀死某一个进程 root @ido :~ #kill-9PID #杀死某一类进程 root @ido :~ # killall -9 CMD 至此,Linux常用命令教程完成,希望能帮助到大家,2025一起加油。
  • 2024-12-27 11:19
    0 个评论
    近日,河北省科学技术厅公示了2024年度拟新建省重点实验室和省技术创新中心的名单,保定飞凌嵌入式技术有限公司(以下简称:飞凌嵌入式)作为“河北省嵌入式计算机控制系统技术创新中心”的依托单位成功上榜,成为新建的135家省技术创新中心之一。 成为“河北省嵌入式计算机控制系统技术创新中心”,是飞凌嵌入式在嵌入式计算机控制系统领域技术实力的体现。飞凌嵌入式将加强与高校、科研院所、行业协会等单位的合作,开展嵌入式计算机控制系统关键及先进技术的研发,结合人工智能、工业物联网、智慧交通、智慧医疗、电力与储能等具体行业的多元应用场景,推动科技成果转化,打造企业创新生态、提升企业技术创新主体地位。 同时,飞凌嵌入式还将注重嵌入式领域专业技术人才的培养和引进,为产业发展提供强有力的人才支撑。 获批成为“河北省嵌入式计算机控制系统技术创新中心”,对飞凌嵌入式而言是一个新的起点。今后,飞凌嵌入式将继续加大科技创新力度,深化产学研合作,推动嵌入式计算机控制系统技术的创新与应用,为嵌入式计算机控制系统产业发展贡献力量。
  • 热度 1
    2024-12-13 11:14
    88 次阅读|
    0 个评论
    通过桌面双击播放音频 ​通过桌面播放音频没有声音时,可以查看sound(声音)选项是否设置为speakers(扬声器)播放。 、 命令行播放音频 通过aplay -l查看声卡 系统默认配置的声卡是rockchipes8388,通过aplay -l命令确定是第几个声卡,如下所示: root@Industio:/$ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: rockchipdp0 , device 0: rockchip,dp0 spdif-hifi-0 Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: rockchiphdmi0 , device 0: rockchip-hdmi0 i2s-hifi-0 Subdevices: 1/1 Subdevice #0: subdevice #0 card 3: rockchipes8388 , device 0: dailink-multicodecs ES8323.5-0011-0 Subdevices: 1/1 Subdevice #0: subdevice #0 输入播放命令 aplay工具仅限于播放wav音频文件,命令如下: root@Industio:/$ aplay -Dhw:3,0 /usr/share/sounds/alsa/Front_Center.wav 命令释义 aplay:命令播放音频;-D:指定声卡;hw:表示硬件设备;3,0:表示设备编号;#使用配置中的第三个音频设备的第一个子设备来播放音频。 /usr/share/sounds/alsa/Front_Center.wav是音频存放地址,根据实际存放地址修改。 注:触觉智能SBC3588(RK3588行业主板)目前命令行暂时只支持立体声Stereo音频,不支持单声道的Mono音频。 触觉智能 RK3562 开发板 (型号EVB3562),基于瑞芯微新一代Soc RK3562/RK3562J设计,可用于轻量级人工智能应用。EVB3562开发板配备了PCIe2.1/USB3.0 OTG/千兆网口等各类型接口,支持4G/5G通信、多摄像头及多种视频接口,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示、工业控制等行业领域。 通过桌面双击播放音频 ​通过桌面播放音频没有声音时,可以查看sound(声音)选项是否设置为speakers(扬声器)播放。 命令行播放音频 通过aplay -l查看声卡 系统默认配置的声卡是rockchipes8388,通过aplay -l命令确定是第几个声卡,如下所示: root@Industio:/$ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: rockchipdp0 , device 0: rockchip,dp0 spdif-hifi-0 Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: rockchiphdmi0 , device 0: rockchip-hdmi0 i2s-hifi-0 Subdevices: 1/1 Subdevice #0: subdevice #0 card 3: rockchipes8388 , device 0: dailink-multicodecs ES8323.5-0011-0 Subdevices: 1/1 Subdevice #0: subdevice #0 输入播放命令 aplay工具仅限于播放wav音频文件,命令如下: root@Industio:/$ aplay -Dhw:3,0 /usr/share/sounds/alsa/Front_Center.wav 命令释义 aplay:命令播放音频;-D:指定声卡;hw:表示硬件设备;3,0:表示设备编号;#使用配置中的第三个音频设备的第一个子设备来播放音频。 /usr/share/sounds/alsa/Front_Center.wav是音频存放地址,根据实际存放地址修改。 注:触觉智能SBC3588(RK3588行业主板)目前命令行暂时只支持立体声Stereo音频,不支持单声道的Mono音频。 触觉智能 RK3562 开发板 (型号EVB3562),基于瑞芯微新一代Soc RK3562/RK3562J设计,可用于轻量级人工智能应用。EVB3562开发板配备了PCIe2.1/USB3.0 OTG/千兆网口等各类型接口,支持4G/5G通信、多摄像头及多种视频接口,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示、工业控制等行业领域。 搭载瑞芯微新一代RK3562/RK3562J芯片; 1TOPS算力NPU,支持INT8/INT16/FP16等数据类型运算; 支持4K@30FPS与1080P@60FPS视频解码; 13M ISP,支持HDR与多路摄像头视频采集; 单路MIPI-DSI,最高2048 x 1080@60fps ; 单通道LVDS,最高1366 x 768@60fps ; 三路独立的以太网口,其中两路千兆网口,一路百兆网口; 支持5G/4G/WiFi/蓝牙无线通信; 支持Android,Linux操作系统; 搭载瑞芯微新一代RK3562/RK3562J芯片; 1TOPS算力NPU,支持INT8/INT16/FP16等数据类型运算; 支持4K@30FPS与1080P@60FPS视频解码; 13M ISP,支持HDR与多路摄像头视频采集; 单路MIPI-DSI,最高2048 x 1080@60fps ; 单通道LVDS,最高1366 x 768@60fps ; 三路独立的以太网口,其中两路千兆网口,一路百兆网口; 支持5G/4G/WiFi/蓝牙无线通信; 支持Android,Linux操作系统;
  • 2024-12-10 10:47
    0 个评论
    新唐NuMicro® MA35D1系列微处理器以其高性能多核异构的设计、可靠的安全机制、丰富的通讯接口、出色的人机接口应用以及广泛的生态系统支持,成为了工程师在高端工业控制、边缘物联网网关以及HMI应用领域中的信赖之选。 现在, 飞凌嵌入式与新唐携手合作,基于MA35D1系列处理器推出FET-MA35-S2核心板 ,旨在为工程师用户们提供更高效、更便捷的开发体验! 话不多说,先看价格——飞凌嵌入式FET-MA35-S2核心板提供2个配置选择,512MB+8GB版含税仅需¥248,1GB+8GB版含税仅需¥328,价格具有很高的性价比。 产品详情
  • 2024-12-10 10:45
    0 个评论
    为了切实满足更多客户的基础应用及项目降本需求,飞凌嵌入式现推出FETMX8MPL-C核心板。相较于先前已成功推向市场的FETMX8MP-C核心板,FETMX8MPL-C核心板在硬件配置上进行了巧妙的精简。 众所周知,并非所有应用场景都需要用到高性能的硬件配置,如音视频处理单元(VPU)、神经网络处理单元(NPU)、图像信号处理单元(ISP)以及高性能数字信号处理器(HiFi-4 DSP)等。因此,为了切实满足更多客户的基础应用及项目降本需求,FETMX8MPL-C在保留核心处理能力以及主流功能接口的基础上,精简了这些芯片单元,从而实现了成本的有效控制。 同时,FETMX8MPL-C核心板与已经上市的FETMX8MP-C核心板软硬件兼容,不仅确保了FETMX8MPL-C核心板能够轻松融入客户的现有系统中,还大大提升了产品在使用过程中的稳定性和可靠性。不过需要注意的是,FETMX8MPL-C核心板目前仅支持Linux5.4.70系统。 飞凌嵌入式FETMX8MPL-C核心板2GB+16GB配置将于12月13日现货发售,1GB+8GB配置将于2025年1月15日发售,敬请期待。
相关资源
  • 所需E币: 0
    时间: 2023-12-25 10:31
    大小: 2.57KB
    上传者: 开心就很好了
    今天我将给大家讲解基于C++的Linux高性能事件驱动网络编程框架的设计方法及技巧,我在文中采取渐进迭代的方式,配合C++11新特性的使用,以及网络编程理论的深度讲解,并手把手带着大家落地实现,助力在网络编程领域有更大的技术提升!Linux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个web服务,经常出现网页无法打开、打开速度慢等现象,而遇到这些问题,就有人会抱怨Linux系统不好,其实这些都是表面现象。Linux提供三个「点分十进制字符串表示的IPv4地址和用网络字节序整数表示的IPv4地址之间转换」的接口 publicGraceJSONResultdoLogin(HttpServletRequestrequest,                  HttpServletResponseresponse,                  RegisterLoginBOregisterLoginBO,                  BindingResultresult){  //判断BindingResult是否保存错误的验证信息,如果有,则直接return  if(result.hasErrors()){    Map<String,String>errorMap=getErrors(result);    returnGraceJSONResult.errorMap(errorMap);  }  //获得前端传来的基本信息  StringsmsCode=registerLoginBO.getSmsCode();  Stringmobile=registerLoginBO.getMobile();  //0.校验验证码是否匹配  StringredisSMSCode=redis.get(MOBILE_SMSCODE+mobile);  if(StringUtils.isBlank(redisSMSCode)||!redisSMSCode.equalsIgnoreCase(smsCode)){    returnGraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);  }  returnGraceJSONResult.ok();}用户信息其实并不会经常发生变动,所以这块内容完全可以放入缓存,这么一来可以大大减少对数据库的压力。privateAppUsergetUser(StringuserId){  //1.查询redis中是否包含用户信息,如果包含则查询redis返回,如果不包含则查询数据库  StringuserJson=redis.get(REDIS_USER_INFO+":"+userId);  AppUseruser=null;  if(StringUtils.isNotBlank(userJson)){    user=JsonUtils.jsonToPojo(userJson,AppUser.class);  }else{    user=userService.getUser(userId);    //2.由于用户信息不怎么会变动,对于千万级别的网站,这类信息数据不会去查询数据库,完全可以把用户信息存入redis    //哪怕修改信息,也不会立马体现,这也是弱一致性,在这里有过期时间,比如1天以后,用户信息会更新到页面显示,或者缩短到1小时,都可以    //基本信息在新闻媒体类网站是属于数据一致性优先级比较低的,用户眼里看的主要以文章为主,至于文章是谁发的,一般来说不会过多关注    redis.set(REDIS_USER_INFO+":"+userId,JsonUtils.objectToJson(user),1);  }  returnuser;}虽然在表设计的时候把文章阅读数字段进行了设计,但是在大数据量下,文章阅读的累计并发是很高的,在这里我们也是采用redis的计数功能来进行实现。@OverridepublicGraceJSONResultlist(StringarticleId,Integerpage,IntegerpageSize){  if(page==null){    page=COMMON_START_PAGE;  }  if(pageSize==null){    pageSize=COMMON_PAGE_SIZE;  }  PagedGridResultgridResult=         commentPortalService.queryArticleComments(articleId,                           page,                           pageSize);  returnGraceJSONResult.ok(gridResult);}生成html的步骤分为以下几步:定义freemarker生成的html位置配置freemarker基本环境获得ftl模板获得动态数据融合ftl和动态数据,并输出到html@Value("${freemarker.html.target}")privateStringhtmlTarget;@GetMapping("/createHTML")@ResponseBodypublicStringcreateHTML(Modelmodel)throwsException{  //0.配置freemarker基本环境  Configurationcfg=newConfiguration(Configuration.getVersion());  //声明freemarker模板所需要加载的目录的位置  Stringclasspath=this.getClass().getResource("/").getPath();  cfg.setDirectoryForTemplateLoading(newFile(classpath+"templates"));//    System.out.println(htmlTarget);//    System.out.println(classpath+"templates");  //1.获得现有的模板ftl文件  Templatetemplate=cfg.getTemplate("stu.ftl","utf-8");  //2.获得动态数据  Stringstranger=;  model.addAttribute("there",stranger);  model=makeModel(model);  //3.融合动态数据和ftl,生成html  FiletempDic=newFile(htmlTarget);  if(!tempDic.exists()){    tempDic.mkdirs();  }  Writerout=newFileWriter(htmlTarget+File.separator+"10010"+".html");  template.process(model,out);  out.close();  return"ok";}
  • 所需E币: 0
    时间: 2023-12-25 11:06
    大小: 3.48KB
    LinuxSocket网络编程框架主要由3大模块组成:BSDSocketAPIsSocketAbstractionLayerVFSLayerTCP/IP协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源(视频、新闻、软件等)都被数据提供者所垄断,所以几乎所有的网络应用程序都很自然地用了客户端/服务器模型,即所有客户端都通过访问服务器来获取所需的资源。BS和CS服务器架构(1)CS架构介绍(clientserver,客户端服务器架构)(2)BS架构介绍(broswerserver,浏览器服务器架构)TCP协议(1)建立连接需要三次握手(2)建立连接的条件:服务器listen时客户端主动发起connect(3)关闭连接需要四次握手(4)服务器或者客户端都可以主动发起关闭packagecom.example.emos.wx.controller.form;importio.swagger.annotations.ApiModel;importlombok.Data;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.Pattern;@Data@ApiModelpublicclassRegisterForm{  @NotBlank(message="注册码不能为空")  @Pattern(regexp="^[0-9]{6}$",message="注册码必须是6位数字")  privateStringregisterCode;  @NotBlank(message="微信临时授权不能为空")  privateStringcode;  @NotBlank(message="昵称不能为空")  privateStringnickname;  @NotBlank(message="头像不能为空")  privateStringphoto;}在UserController.java中创建login()方法。@PostMapping("/login")@ApiOperation("登陆系统")publicRlogin(@Valid@RequestBodyLoginFormform){intid=userService.login(form.getCode());  Stringtoken=jwtUtil.createToken(id);  Set<String>permsSet=userService.searchUserPermissions(id);  saveCacheToken(token,id);  returnR.ok("登陆成功").put("token",token).put("permission",permsSet);}在CheckinServiceImpl类中,实现抽象方法……publicclassCheckinServiceImplimplementsCheckinService{……publicvoidcreateFaceModel(intuserId,Stringpath){    HttpRequestrequest=HttpUtil.createPost(createFaceModelUrl);    request.form("photo",FileUtil.file(path));    HttpResponseresponse=request.execute();    Stringbody=response.body();    if("无法识别出人脸".equals(body)||"照片中存在多张人脸".equals(body)){      thrownewEmosException(body);    }else{      TbFaceModelentity=newTbFaceModel();      entity.setUserId(userId);      entity.setFaceModel(body);      faceModelDao.insert(entity);    }  }}在CheckinServiceImpl.java类中,实现三个抽象方法。publicclassCheckinServiceImplimplementsCheckinService{……@Override  publicHashMapsearchTodayCheckin(intuserId){    HashMapmap=checkinDao.searchTodayCheckin(userId);    returnmap;  }  @Override  publiclongsearchCheckinDays(intuserId){    longdays=checkinDao.searchCheckinDays(userId);    returndays;  }  @Override  publicArrayList<HashMap>searchWeekCheckin(HashMapparam){    ArrayList<HashMap>checkinList=checkinDao.searchWeekCheckin(param);    ArrayList<String>holidaysList=holidaysDao.searchHolidaysInRange(param);    ArrayList<String>workdayList=workdayDao.searchWorkdayInRange(param);    DateTimestartDate=DateUtil.parseDate(param.get("startDate").toString());    DateTimeendDate=DateUtil.parseDate(param.get("endDate").toString());    DateRangerange=DateUtil.range(startDate,endDate,DateField.DAY_OF_MONTH);    ArrayListlist=newArrayList();    range.forEach(one->{      Stringdate=one.toString("yyyy-MM-dd");      //查看今天是不是假期或者工作日      Stringtype="工作日";      if(one.isWeekend()){        type="节假日";      }      if(holidaysList!=null&&holidaysList.contains(date)){        type="节假日";      }elseif(workdayList!=null&&workdayList.contains(date)){        type="工作日";      }      Stringstatus="";      if(type.equals("工作日")&&DateUtil.compare(one,DateUtil.date())<=0){        status="缺勤";booleanflag=false;        for(HashMap<String,String>map:checkinList){          if(map.containsValue(date)){            status=map.get("status");flag=true;            break;          }        }DateTimeendTime=DateUtil.parse(DateUtil.today()+""+constants.attendanceEndTime);Stringtoday=DateUtil.today();if(date.equals(today)&&DateUtil.date().isBefore(endTime)&&flag==false){          status="";        }      }      HashMapmap=newHashMap();      map.put("date",date);      map.put("status",status);      map.put("type",type);      map.put("day",one.dayOfWeekEnum().toChinese("周"));      list.add(map);    });    returnlist;  }}在EmosWxApiApplicationTests.java类中提供了contextLoads()测试用例方法,我们把生成大量系统消息记录的代码写在其中,程序运行的时候这些消息记录就会写入到MongoDB里面。@SpringBootTestclassEmosWxApiApplicationTests{  @Autowired  privateMessageServicemessageService;  @Test  voidcontextLoads(){    for(inti=1;i<=100;i++){      MessageEntitymessage=newMessageEntity();      message.setUuid(IdUtil.simpleUUID());      message.setSenderId(0);      message.setSenderName("系统消息");      message.setMsg("这是第"+i+"条测试消息");      message.setSendTime(newDate());      Stringid=messageService.insertMessage(message);      MessageRefEntityref=newMessageRefEntity();      ref.setMessageId(id);      ref.setReceiverId(11);//注意:这是接收人ID      ref.setLastFlag(true);      ref.setReadFlag(false);      messageService.insertRef(ref);    }  }}在该页面的模型层里面声明静态数据。list数组保存的是后端Java返回的成员数据,内容上按照部门进行分组。members数组保存的是页面上选择的成员id。#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<stdlib.h>#include<arpa/inet.h>#include<unistd.h>#include<string.h> #defineBACKLOG5 intmain(intargc,char*argv[]){  intfd;  structsockaddr_inaddr;  charbuf[BUFSIZ]={};   if(argc<3){    fprintf(stderr,"%s<addr><port>\n",argv[0]);    exit(0);  }   /*创建套接字*/  fd=socket(AF_INET,SOCK_STREAM,0);  if(fd<0){    perror("socket");    exit(0);  }   addr.sin_family=AF_INET;  addr.sin_port=htons(atoi(argv[2]));  if(inet_aton(argv[1],&addr.sin_addr)==0){    fprintf(stderr,"Invalidaddress\n");    exit(EXIT_FAILURE);  }   /*向服务端发起连接请求*/  if(connect(fd,(structsockaddr*)&addr,sizeof(addr))==-1){    perror("connect");    exit(0);  }  while(1){    printf("Input->");    fgets(buf,BUFSIZ,stdin);    write(fd,buf,strlen(buf));  }  close(fd);  return0;}
  • 所需E币: 0
    时间: 2023-12-19 21:14
    大小: 19.01MB
    上传者: xxxml
    Linux基础知识,非常全面
  • 所需E币: 3
    时间: 2023-12-15 09:34
    大小: 10.67MB
    上传者: 二月半
    Linux命令行与shell脚本编程大全(第4版)(RichardBlum、ChristineBresnahan) 
  • 所需E币: 0
    时间: 2023-12-6 15:17
    大小: 3.8KB
    网络编程概述管道(父子进程)、消息队列(内核经营消息队列)、共享内存(创建一个空间)、信号(通过pid号通信)、信号量(对临界资源,共享内存做P、V控制)。特点:依赖于Linux内核AB两个通信基于内核。缺陷:无法多机通信(不适用与两台不同的电脑)TCP和UDP对比:TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信TCP首部开销20字节;UDP的首部开销小,只有8个字节TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道传统的进程间通信借助内核提供的IPC机制进行,但是只能限于本机通信。若要跨机通信,就必须使用网络通信,这就需要用到内核提供给用户的socketAPI函数库。2.1网络字节序大端字节序:也叫高端字节序(网络字节序),是高端地址存放低位数据,低端地址存放高位数据小端字节序:也叫低端字节序,是低地址存放低位数据,高地址存放高位数据。在application.yml文件中,填入SaToken的配置信息,如下:sa-token: #HTTP请求头中哪个属性用来上传令牌 token-name:token #过期时间(秒),设置为30天 timeout:2592000 #临时有效期,设置为3天 activity-timeout:259200 #不允许相同账号同时在线,新登陆的账号会挤掉原来登陆的账号 allow-concurrent-login:false #在多人登陆相同账号的时候,是否使用相同的Token is-share:false token-style:uuid #是否读取Cookie中的令牌 isReadCookie:false #同端互斥 isConcurrent:false #SaToken缓存令牌用其他的逻辑库,避免业务数据和令牌数据共用相同的Redis逻辑库 alone-redis:  database:1  host:localhost  port:6379  password:abc123456  timeout:10s  lettuce:   pool:    #连接池最大连接数    max-active:200    #连接池最大阻塞等待时间(使用负值表示没有限制)    max-wait:10s    #连接池中的最大空闲连接    max-idle:16    #连接池中的最小空闲连接    min-idle:8Java语言允许我们自己封装异常类,我们可以自定义各种异常类,比如每种业务一个异常类,或者每个模块一个异常类。我这里不想做的那么复杂,不如我们创建一个通用的异常类,用来封装与业务有关的异常信息。在com.example.his.api.exception包中,创建HisException.java类。packagecom.example.his.api.exception;importlombok.Data;@DatapublicclassHisExceptionextendsRuntimeException{  privateStringmsg;  privateintcode=500;  publicHisException(Exceptione){    super(e);    this.msg="执行异常";  }  publicHisException(Stringmsg){    super(msg);    this.msg=msg;  }  publicHisException(Stringmsg,Throwablee){    super(msg,e);    this.msg=msg;  }  publicHisException(Stringmsg,intcode){    super(msg);    this.msg=msg;    this.code=code;  }  publicHisException(Stringmsg,intcode,Throwablee){    super(msg,e);    this.msg=msg;    this.code=code;  }}SpringBoot提供了全局处理异常的技术,只要我们给某个Java类用上@RestControllerAdvice注解,这个类就能捕获SpringBoot项目中所有的异常,然后统一处理(精简异常信息)再返回给前端项目。在com.example.his.api.config包中,创建ExceptionAdvice.java类。packagecom.example.his.api.config;importcn.dev33.satoken.exception.NotLoginException;importcn.felord.payment.PayException;importcn.hutool.json.JSONObject;importcom.example.his.api.exception.HisException;importlombok.extern.slf4j.Slf4j;importorg.springframework.validation.BindException;importorg.springframework.http.HttpStatus;importorg.springframework.http.converter.HttpMessageNotReadableException;importorg.springframework.web.HttpRequestMethodNotSupportedException;importorg.springframework.web.bind.MethodArgumentNotValidException;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseBody;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.bind.annotation.RestControllerAdvice;importorg.springframework.web.multipart.support.MissingServletRequestPartException;@Slf4j@RestControllerAdvicepublicclassExceptionAdvice{  /*   *捕获异常,并且返回500状态码   */  @ResponseBody  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  @ExceptionHandler(Exception.class)  publicStringexceptionHandler(Exceptione){    JSONObjectjson=newJSONObject();    if(einstanceofHttpMessageNotReadableException){      HttpMessageNotReadableExceptionexception=(HttpMessageNotReadableException)e;      log.error("error",exception);      json.set("error","请求未提交数据或者数据有误");    }     elseif(einstanceofMissingServletRequestPartException){      MissingServletRequestPartExceptionexception=(MissingServletRequestPartException)e;      log.error("error",exception);      json.set("error","请求提交数据错误");    }     elseif(einstanceofHttpRequestMethodNotSupportedException){      HttpRequestMethodNotSupportedExceptionexception=(HttpRequestMethodNotSupportedException)e;      log.error("error",exception);      json.set("error","HTTP请求方法类型错误");    }     //Web方法参数数据类型转换异常,比如String[]数组类型的参数,你上传的数据却是String类型    elseif(einstanceofBindException){      BindExceptionexception=(BindException)e;      StringdefaultMessage=exception.getFieldError().getDefaultMessage();      log.error(defaultMessage,exception);      json.set("error",defaultMessage);    }    //没有通过后端验证产生的异常    elseif(einstanceofMethodArgumentNotValidException){      MethodArgumentNotValidExceptionexception=(MethodArgumentNotValidException)e;      json.set("error",exception.getBindingResult().getFieldError().getDefaultMessage());    }    //处理业务异常    elseif(einstanceofHisException){      log.error("执行异常",e);      HisExceptionexception=(HisException)e;      json.set("error",exception.getMsg());    }     //微信支付异常    elseif(einstanceofPayException){      PayExceptionexception=(PayException)e;      log.error("微信支付异常",exception);      json.set("error","微信支付异常");    }    //处理其余的异常    else{      log.error("执行异常",e);      json.set("error","执行异常");    }    returnjson.toString();  }  /*   *捕获异常,并且返回401状态码   */  @ResponseBody  @ResponseStatus(HttpStatus.UNAUTHORIZED)  @ExceptionHandler(NotLoginException.class)  publicStringunLoginHandler(Exceptione){    JSONObjectjson=newJSONObject();    json.set("error",e.getMessage());    returnjson.toString();  }}因为Controller类用上@RestController注解之后,Web方法返回的对象会被自动转换成JSON对象,所以我们只需要声明一个封装类,让所有Web方法返回这个封装类的对象即可。除了公共属性之外,不同的Web方法要返回的业务数据也不尽相同,所以选择动态的结构才是最佳的方案,恰好HashMap允许我们随便添加数据,那就选择HashMap作为父类吧。在com.example.his.api.common包中,创建R.java类。packagecom.example.his.api.common;importorg.apache.http.HttpStatus;importjava.util.HashMap;importjava.util.Map;publicclassRextendsHashMap<String,Object>{  publicR(){    //默认创建的R对象中包含了公共的属性    put("code",HttpStatus.SC_OK);    put("msg","success");  }  /*   *覆盖继承的put函数,添加Key-Value数据   */  publicRput(Stringkey,Objectvalue){    super.put(key,value);    //把自己返回,用于链式调用    returnthis;  }  publicstaticRok(){    returnnewR();  }  publicstaticRok(Stringmsg){    Rr=newR();    r.put("msg",msg);    returnr;  }  publicstaticRok(Map<String,Object>map){    Rr=newR();    r.putAll(map);    returnr;  }  publicstaticRerror(intcode,Stringmsg){    Rr=newR();    r.put("code",code);    r.put("msg",msg);    returnr;  }  publicstaticRerror(Stringmsg){    returnerror(HttpStatus.SC_INTERNAL_SERVER_ERROR,msg);  }  publicstaticRerror(){    returnerror(HttpStatus.SC_INTERNAL_SERVER_ERROR,"未知异常,请联系管理员");  }}
  • 所需E币: 5
    时间: 2023-11-14 17:51
    大小: 21.11MB
    上传者: 浩瀚星蓝
    这是一本学习linux的经典书籍,详细介绍了shell的使用方法
  • 所需E币: 2
    时间: 2023-11-14 18:00
    大小: 85.65MB
    上传者: 浩瀚星蓝
    这本是是Linux典藏大系的其中一本,详细讲述了ARM嵌入式相关知识
  • 所需E币: 0
    时间: 2023-11-10 15:46
    大小: 1021KB
    上传者: Argent
    第11讲Linux内核顶层Makefile分析
  • 所需E币: 0
    时间: 2023-11-10 15:46
    大小: 1005.5KB
    上传者: Argent
    第10讲Linux内核源码目录分析
  • 所需E币: 0
    时间: 2023-11-10 15:46
    大小: 1006KB
    上传者: Argent
    第9讲正点原子官方Linux内核编译与体验
  • 所需E币: 0
    时间: 2023-11-10 15:47
    大小: 1014KB
    上传者: Argent
    第13讲Linux内核移植.ppt
  • 所需E币: 0
    时间: 2023-11-10 15:48
    大小: 1011KB
    上传者: Argent
    第17讲Linux内核移植(NAND版本)-补录
  • 所需E币: 0
    时间: 2023-11-10 15:47
    大小: 1MB
    上传者: Argent
    第12讲Linux内核启动流程简介
  • 所需E币: 0
    时间: 2023-11-10 16:41
    大小: 1011KB
    上传者: Argent
    第13讲Linux连接文件
  • 所需E币: 0
    时间: 2023-11-10 16:41
    大小: 1018.5KB
    上传者: Argent
    第15讲LinuxC编程
  • 所需E币: 1
    时间: 2023-11-10 11:50
    大小: 30.02KB
    上传者: Argent
    第34讲LinuxPWM驱动实验
  • 所需E币: 1
    时间: 2023-11-10 11:47
    大小: 28.75KB
    上传者: Argent
    第22讲LinuxIIC驱动实验_笔记
  • 所需E币: 1
    时间: 2023-11-10 11:48
    大小: 36.78KB
    上传者: Argent
    第23讲LinuxSPI驱动实验_笔记
  • 所需E币: 1
    时间: 2023-11-10 11:51
    大小: 27.83KB
    上传者: Argent
    第37讲LinuxADC驱动实验
  • 所需E币: 1
    时间: 2023-11-10 11:48
    大小: 29.9KB
    上传者: Argent
    第25讲Linux多点电容触摸屏实验_笔记