网络通信协议

WebSocket通信

  1. WebSocket是一种基于TCP的网络通信协议,提供了浏览器和服务器之间的全双工通信(full-duplex)能力。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。这使得数据可以更快地从服务器传到浏览器,而且减少了数据传输的数据量,因为头信息比较小。在WebSocket API中,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
  2. HTTP协议和WebSocket协议的主要区别如下:
    1. 连接方式:HTTP协议是无短连接的。每次请求都需要建立新的连接,请求结束后连接就断开。而WebSocket协议是长连接的,客户端和服务器建立连接后,直到其中一方主动断开,连接才会断开。
    2. 数据传输:HTTP协议只能由客户端向服务器发起请求,服务器返回响应数据。而WebSocket协议是全双工通信,服务器和客户端都可以主动发送数据。
    3. 性能开销:由于HTTP协议每次请求都需要建立新的连接,所以开销较大。而WebSocket协议建立连接后,可以进行多次数据传输,开销较小。
    4. 数据格式:HTTP协议传输的数据格式比较复杂,包含了请求行、请求头、消息体等。而WebSocket协议传输的数据通过帧来传输,数据格式比较简单。
    5. 实时性:HTTP协议的实时性不强,需要客户端定时轮询服务器获取新的数据。而WebSocket协议可以实现服务器主动推送数据,实时性较强。
  3. WebSocket主要适用于以下几种场景:
    1. 实时应用:聊天应用、多人协作应用、在线游戏、实时购物等。
    2. 实时数据推送:股票、新闻、天气、设备状态等实时信息的推送。
    3. IOT物联网:实时获取设备状态,实时控制设备等。
    4. 实时分析:实时数据分析、实时监控系统等。

WebSocket入门案例

  1. 客户端:

    1. 创建WebSocket对象:在JavaScript中,我们可以创建一个WebSocket对象,指定要连接的服务器地址。
    var ws = new WebSocket("ws://localhost:8080/websocket");
    
    1. 监听事件:WebSocket对象提供了四个事件:onopen、onmessage、onerror、onclose,我们可以通过监听这些事件来处理WebSocket的各种情况。
    ws.onopen = function(event) {console.log("Connection open ..."); 
    };ws.onmessage = function(event) {console.log("Received Message: " + event.data);
    };ws.onclose = function(event) {console.log("Connection closed ..."); 
    };ws.onerror = function(event) {console.log("Error: " + event.data);
    };
    
    1. 发送数据:WebSocket对象提供了一个send方法,我们可以通过这个方法向服务器发送数据。
    ws.send("Hello Server!");
    
    1. 关闭连接:当我们不再需要WebSocket连接时,可以调用WebSocket对象的close方法来关闭连接。
    ws.close();
    

    可以直接使用js写个小页面

    <!DOCTYPE HTML>
    <html>
    <head><meta charset="UTF-8"><title>WebSocket Demo</title>
    </head>
    <body><input id="text" type="text" /><button onclick="send()">Send Message</button><button onclick="closeWebSocket()">Close</button><div id="message"></div>
    </body>
    <script type="text/javascript">var websocket = null;var clientId = Math.random().toString(36).substr(2);//判断当前浏览器是否支持WebSocketif('WebSocket' in window){//连接WebSocket节点websocket = new WebSocket("ws://localhost:8080/ws/"+clientId);}else{alert('Not support websocket')}//连接发生错误的回调方法websocket.onerror = function(){setMessageInnerHTML("error");};//连接成功建立的回调方法websocket.onopen = function(){setMessageInnerHTML("连接成功");}//接收到消息的回调方法websocket.onmessage = function(event){setMessageInnerHTML(event.data);}//连接关闭的回调方法websocket.onclose = function(){setMessageInnerHTML("close");}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。window.onbeforeunload = function(){websocket.close();}//将消息显示在网页上function setMessageInnerHTML(innerHTML){document.getElementById('message').innerHTML += innerHTML + '<br/>';}//发送消息function send(){var message = document.getElementById('text').value;websocket.send(message);}//关闭连接function closeWebSocket() {websocket.close();}
    </script>
    </html>
  2. 服务端:

    1. 导入WebSocket的maven坐标

      <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
      </dependency>
      
    2. 导入WebSocket服务端组件WebSocketServer,用于与客户端通信

      package com.sky.websocket;import com.sky.handler.TurnoverReportVOEncoder;
      import org.springframework.stereotype.Component;
      import javax.websocket.OnClose;
      import javax.websocket.OnMessage;
      import javax.websocket.OnOpen;
      import javax.websocket.Session;
      import javax.websocket.server.PathParam;
      import javax.websocket.server.ServerEndpoint;
      import java.util.Collection;
      import java.util.HashMap;
      import java.util.Map;/*** WebSocket服务*/
      @Component
      @ServerEndpoint(value = "/ws/{sid}",encoders = {TurnoverReportVOEncoder.class}) // 为对象指定编码器(目前是转成json发送给客户端)
      public class WebSocketServer {//存放会话对象private static Map<String, Session> sessionMap = new HashMap();/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session, @PathParam("sid") String sid) {System.out.println("客户端:" + sid + "建立连接");sessionMap.put(sid, session);}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, @PathParam("sid") String sid) {System.out.println("收到来自客户端:" + sid + "的信息:" + message);}/*** 连接关闭调用的方法** @param sid*/@OnClosepublic void onClose(@PathParam("sid") String sid) {System.out.println("连接断开:" + sid);sessionMap.remove(sid);}/*** 群发** @param message*/public void sendToAllClient(String message) {Collection<Session> sessions = sessionMap.values();for (Session session : sessions) {try {//服务器向客户端发送消息session.getBasicRemote().sendText(message);} catch (Exception e) {e.printStackTrace();}}}public void sendObjToAllClient(Object object) {Collection<Session> sessions = sessionMap.values();for (Session session : sessions) {try {//服务器向客户端发送对象--注意第4步骤,需要为该对象指定一个编码器session.getBasicRemote().sendObject(object);} catch (Exception e) {e.printStackTrace();}}}}
    3. 导入配置类WebSocketConfiguration,注册WebSocket的服务端组件ServerEndpointExporter

      package com.sky.config;import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** WebSocket配置类,用于注册WebSocket的Bean*/
      @Configuration
      public class WebSocketConfiguration {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
      }
      
    4. 如果想向客户端推送封装好的对象,在WebSocket中,需要提供一个编码器来将这个对象转换为可以通过网络传输的格式,通常是字符串或者二进制数据。

      package com.sky.handler;import com.fasterxml.jackson.databind.ObjectMapper;
      import com.sky.vo.TurnoverReportVO;import javax.websocket.EncodeException;
      import javax.websocket.Encoder;
      import javax.websocket.EndpointConfig;/*** @projectName: sky-take-out* @package: com.sky.handler* @className: TurnoverReportVOEncoder* @author: fangjiayueyuan* @description: TODO* @date: 2023/12/24 16:16* @version: 1.0*/
      public class TurnoverReportVOEncoder implements Encoder.Text<TurnoverReportVO>{private static ObjectMapper objectMapper = new ObjectMapper();@Overridepublic String encode(TurnoverReportVO turnoverReportVO) throws EncodeException {try {// 使用Jackson库将对象转换为JSON字符串return objectMapper.writeValueAsString(turnoverReportVO);} catch (Exception e) {throw new EncodeException(turnoverReportVO, "对象转换为JSON字符串时发生错误", e);}}@Overridepublic void init(EndpointConfig endpointConfig) {// 这里可以进行编码器的初始化操作,但在这个例子中我们不需要进行任何操作}@Overridepublic void destroy() {// 这里可以进行编码器的清理操作,但在这个例子中我们不需要进行任何操作}
      }
    5. 导入定时任务类WebSocketTask,定时向客户端推送数据

      package com.sky.task;import com.sky.service.ReportService;
      import com.sky.vo.TurnoverReportVO;
      import com.sky.websocket.WebSocketServer;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.scheduling.annotation.Scheduled;
      import org.springframework.stereotype.Component;import java.time.LocalDate;
      import java.time.LocalDateTime;
      import java.time.format.DateTimeFormatter;@Component
      public class WebSocketTask {@Autowiredprivate WebSocketServer webSocketServer;@Autowiredprivate ReportService reportService;/*** 通过WebSocket每隔5秒向客户端发送消息*/@Scheduled(cron = "0/5 * * * * ?")public void sendMessageToClient() {webSocketServer.sendToAllClient("这是来自服务端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));}/*** 通过WebSocket每隔5秒向客户端发送消息*/@Scheduled(cron = "0/5 * * * * ?")public void sendObjMessageToClient() {TurnoverReportVO turnoverStatistics = reportService.getTurnoverStatistics(LocalDate.parse("2023-01-01"), LocalDate.now());webSocketServer.sendToAllClient("传个对象过去");webSocketServer.sendObjToAllClient(turnoverStatistics);}
      }

RPC通信

**RPC(Remote Procedure Call)**是一种通信协议,它允许运行在一台计算机上的程序调用另一台计算机上的程序中的函数或方法,就像调用本地函数一样,无需程序员显式处理底层的网络细节。

RPC的主要特征包括:

  1. 透明性:对于调用者来说,远程过程调用和本地过程调用是透明的,调用者无需关心过程调用的是本地过程还是远程过程。

  2. 语言无关性:RPC通常支持多种编程语言,只要两个通信的程序遵循同一RPC协议,它们就可以进行通信,无论它们是用什么编程语言编写的。

  3. 同步性:RPC通常是同步的,也就是说,当一个RPC调用发出后,调用者会停止执行,直到得到结果。然而,也有一些RPC系统支持异步调用。

为什么使用RPC

  1. 简化分布式系统的开发:RPC隐藏了底层的网络通信和数据传输的复杂性,使得开发分布式应用更加简单。

  2. 提高代码的可重用性:通过RPC,可以将一些通用的功能实现为服务,然后在多个应用中重用这些服务。

  3. 提高系统的可扩展性:通过RPC,可以将一个大的系统分解为多个可以独立开发和部署的小的服务。

RPC的替代方案

  1. RESTful API:RESTful API是一种基于HTTP协议的通信方式,它使用HTTP的方法(如GET、POST、PUT、DELETE等)来操作资源。RESTful API比RPC更简单,更易于使用,但它不如RPC灵活,因为它只能使用HTTP协议,而RPC可以使用任何传输协议。
  2. 消息队列:消息队列是一种异步的通信方式,它允许程序通过发送和接收消息来进行通信。消息队列可以解耦发送者和接收者,使得它们可以独立地扩展和失败。然而,消息队列的使用比RPC更复杂,因为它需要处理消息的发送、接收、存储和确认。

RPC入门案例

以Thrift为例:

  1. 定义数据类型和服务接口:使用Thrift的IDL(接口定义语言)定义数据类型和服务接口,然后通过Thrift的编译器生成对应语言的代码。

    namespace java com.sankuai.mdp.thriftstruct User{1:i32 id2:string name3:i32 age=0
    }service UserService{User getById(1:i32 id)bool isExist(1:string name)
    }
    
  2. 通过Thrift编译器生成Java代码:会生成两个对象:User、UserService

    thrift --gen java HelloWorld.thrift
    
  3. 服务端代码,实现UserService.Iface接口;启动服务端.

    package com.sankuai.mdp.thriftserversnapshot.service.impl;import com.sankuai.mdp.thriftapisnapshot.entity.User;
    import com.sankuai.mdp.thriftapisnapshot.entity.UserService;
    import org.apache.thrift.TException;/*** @projectName: thrift-api-snapshot* @package: com.sankuai.mdp.thriftserversnapshot.service.impl* @className: UserServiceImpl* @author: fangjiayueyuan* @description: TODO* @date: 2023/12/17 21:33* @version: 1.0*/
    public class UserServiceImpl implements UserService.Iface{@Overridepublic User getById(int id) throws TException {System.out.println("-----调用getById-----");User user = new User();user.setId(id);user.setName("dog");user.setAge(18);return user;}@Overridepublic boolean isExist(String name) throws TException {return false;}
    }
    package com.sankuai.mdp.thriftserversnapshot.service.impl;import com.sankuai.mdp.thriftapisnapshot.entity.UserService;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.server.TServer;
    import org.apache.thrift.server.TSimpleServer;
    import org.apache.thrift.transport.TServerSocket;
    import org.apache.thrift.transport.TServerTransport;
    import org.apache.thrift.transport.TTransportException;/*** @projectName: thrift-api-snapshot* @package: com.sankuai.mdp.thriftserversnapshot.service.impl* @className: SimpleService* @author: fangjiayueyuan* @description: TODO* @date: 2023/12/17 21:59* @version: 1.0*/
    public class SimpleService {public static void main(String[] args) {try{TServerTransport serverTransport = new TServerSocket(9090);UserService.Processor processor = new UserService.Processor(new UserServiceImpl());TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();TSimpleServer.Args targs = new TSimpleServer.Args(serverTransport);targs.processor(processor);targs.protocolFactory(protocolFactory);TServer server = new TSimpleServer(targs);server.serve();} catch (TTransportException e) {throw new RuntimeException(e);}}
    }
    
  4. 客户端代码,调用服务端的方法,就像调用本地方法一样

    package com.sankuai.mdp.thriftclientsnapshot.service.impl;import com.sankuai.mdp.thriftapisnapshot.entity.User;
    import com.sankuai.mdp.thriftapisnapshot.entity.UserService;
    import org.apache.thrift.TException;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.transport.TSocket;
    import org.apache.thrift.transport.TTransport;
    import org.apache.thrift.transport.TTransportException;/*** @projectName: thrift-api-snapshot* @package: com.sankuai.mdp.thriftclientsnapshot.service.impl* @className: SimpleClient* @author: fangjiayueyuan* @description: TODO* @date: 2023/12/17 21:58* @version: 1.0*/
    public class SimpleClient {public static void main(String[] args) {TTransport transport = null;try {transport = new TSocket("localhost", 9090);TBinaryProtocol protocol = new TBinaryProtocol(transport);UserService.Client client = new UserService.Client(protocol);transport.open();User result = client.getById(1);System.out.println("Result:" + result);} catch (TTransportException e) {e.printStackTrace();} catch (TException e) {throw new RuntimeException(e);} finally {if (transport != null) {transport.close();}}}
    }
  5. 先后启动运行服务端SimpleService.java、客户端代码SimpleClient.java
    在这里插入图片描述
    在这里插入图片描述
    Git

Http通信

http通信也可以实现微服务远程调用,但是是短连接的通信方式

  1. 短连接:短连接是指建立连接后,客户端与服务器进行一次请求和响应后,立即断开连接。短连接的优点是管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段。但缺点是每次请求都需要重新建立连接,会增加额外的开销。

  2. 长连接:长连接是指建立连接后,客户端与服务器可以进行多次请求和响应,直到其中一方主动断开连接。长连接的优点是可以省去频繁建立连接的开销,提高数据传输的效率。但缺点是需要额外的控制手段来管理和维护连接,如果连接数过多,可能会消耗较多的系统资源。

常用的Http微服务调用有使用RestTemplate类,RestTemplate和Thrift是两种不同的远程调用方式,它们的主要区别如下:

  1. 协议不同:RestTemplate是基于HTTP/HTTPS协议的,数据格式通常为JSON,适用于Web服务。而Thrift是Facebook开发的一种高效的、支持多种编程语言的远程服务调用框架,它使用了自定义的二进制协议,效率更高。
  2. 数据格式不同:RestTemplate通常使用JSON格式传输数据,而Thrift使用的是二进制格式,因此在网络传输效率上,Thrift会更高。
  3. 使用场景不同:RestTemplate更适合构建微服务架构,因为它基于HTTP/HTTPS协议,更符合互联网的开放、无状态、可连接性特性。而Thrift则更适合在内网中使用,因为它的二进制协议可以提供更高的性能。
  4. 跨语言支持:RestTemplate基于HTTP协议,可以被任何支持HTTP的语言调用。而Thrift提供了多种语言的库,可以方便的在不同语言之间进行调用。
  5. 服务发现:RestTemplate需要自己管理服务的URL,而Thrift则可以配合使用服务注册与发现的工具,如Zookeeper,进行服务的自动发现和负载均衡。

Http通信入门案例

Git:RestTemplate实现微服务间远程调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/225207.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UDP信号多个电脑的信息传输测试、配置指南

最近要做一个东西&#xff0c;关于一个软件上得到的信号&#xff0c;如何通过连接的局域网&#xff0c;将数据传输出去。我没做过相关的东西&#xff0c;但是我想应该和软件连接数据库的过程大致是差不多的&#xff0c;就一个ip和一个端口号啥的。 一.问题思路 多个设备同时连…

万界星空科技生产管理MES系统中的工时管理

工时管理的重大意义 1.提高生产效率 通过工时管理&#xff0c;企业可以更加精确地掌握研发人员的工时情况&#xff0c;及时调整项目进度和人力安排&#xff0c;提高生产效率。 2.降低人力成本 通过工时管理&#xff0c;企业可以更加精确地核算研发人员的工时费用&#xff0c…

【面试】Java中的多种设计模式(十种主要设计模式)

Java中的多种设计模式&#xff08;十种主要设计模式&#xff09; 文章概述 设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。它是软件工程中常见问题的解决方案的一种描述或模板。设计模式可以提供一种通用的、可重用的解决方案&#xff0c;帮助开发…

你好!Apache Seata

北京时间 2023 年 10 月 29 日&#xff0c;分布式事务开源项目 Seata 正式通过 Apache 基金会的投票决议&#xff0c;以全票通过的优秀表现正式成为 Apache 孵化器项目&#xff01; 根据 Apache 基金会邮件列表显示&#xff0c;在包含 13 个约束性投票 (binding votes) 和 6 个…

生存分析序章2——生存分析之Python篇:lifelines库入门

目录 写在开头1. 介绍 lifelines 库1.1 lifelines库简介1.2 安装与环境配置 2. 数据准备2.1 数据格式与结构2.2 处理缺失数据2.3 对异常值的处理 3. Kaplan-Meier 曲线3.1 使用 lifelines 绘制生存曲线3.2 曲线解读3.3 额外补充 4. Cox 比例风险模型4.1 lifelines 中的 Cox 模型…

使用python netmiko模块批量配置Cisco、华为、H3C路由器交换机(支持 telnet 和 ssh 方式)

0. 当前环境 外网电脑Python版本&#xff1a;3.8.5&#xff08;安装后不要删除安装包&#xff0c;以后卸载的时候用这个&#xff09;外网电脑安装netmiko第三方库&#xff1a;cmd中输入pip install netmiko内网电脑环境&#xff1a;无法搭建python环境&#xff0c;需外网电脑完…

Yolov5水果分类识别+pyqt交互式界面

Yolov5 Fruits Detector Yolov5 是一种先进的目标检测算法&#xff0c;可以应用于水果分类识别任务。结合 PyQT 框架&#xff0c;可以创建一个交互式界面&#xff0c;使用户能够方便地上传图片并获取水果分类结果。以下将详细阐述 Yolov5 水果分类识别和 PyQT 交互式界面的实现…

C/C++常见面试题(四)

C/C面试题集合四 目录 1、什么是C中的类&#xff1f;如何定义和实例化一个类&#xff1f; 2、请解释C中的继承和多态性。 3、什么是虚函数&#xff1f;为什么在基类中使用虚函数&#xff1f; 4、解释封装、继承和多态的概念&#xff0c;并提供相应的代码示例 5、如何处理内…

【Azure 架构师学习笔记】- Power Platform(1) - 简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Power Platform】系列。 Power Platform 它是一个SaaS平台&#xff0c;支持和延伸M365&#xff0c; Dynamics 365和Azure甚至其他第三方服务。主要提供低代码&#xff0c;自动化&#xff0c;数据驱动和定制化业务逻辑的服务…

【开源】基于Vue+SpringBoot的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

65内网安全-域环境工作组局域网探针

这篇分为三个部分&#xff0c;基本认知&#xff0c;信息收集&#xff0c;后续探针&#xff0c; 基本认知 分为&#xff0c;名词&#xff0c;域&#xff0c;认知&#xff1b; 完整架构图 名词 dwz称之为军事区&#xff0c;两个防火墙之间的区域称之为dwz&#xff0c;但安全性…

STM32逆变器方案

输入电压&#xff1a; 额定输入电压&#xff1a;DC110V 输入电压范围&#xff1a;DC77-137.5V 额定输出参数 电压&#xff1a;200V5%&#xff08;200VAC~240VAC 可调&#xff09; 频率&#xff1a; 42Hz0.5Hz&#xff08;35-50 可调&#xff09; 额定输出容量&#xff1a;1…

mvtec3d

以bagel为例&#xff0c;其中有calibration、 bagel # 百吉圈(硬面包)calibrationcamera_parameters.jsontestcombinedgt # 缺陷部位的分割剪影pngrgb # 原图pngxyz # tiffcontamination # 污染物同上crack同上good同上 hole同上 traingoodrgbxyzvalidationgood同traincla…

【Gitlab】CICD流水线自动化部署教程

第一步&#xff0c;准备 GitLab 仓库 这个不用多说&#xff0c;得先保证你的项目已经托管在一个 GitLab 仓库中。 第二步&#xff0c;定义 .gitlab-ci.yml 文件 在你的项目根目录中创建一个 .gitlab-ci.yml 文件。这个文件将定义所有 CI/CD 的工作流程&#xff0c;包括构建、测…

QT 输入框输入限制 正则表达式限制 整理

在使用 输入数值时&#xff0c;经常遇到限制其范围的需要&#xff0c;比如角太阳高度角范围为[-90,90]&#xff0c;经度值范围[-180,180]&#xff0c;方位角范围[0,360]。Qt提供了QIntValidator和QDoubleValidator可以限定数值输入范围&#xff0c;如使用QIntValidator限制整数…

数模学习day01-层次分析法模型

已经一个多月没有更新过文章了&#xff0c;为了保住那绩点的意思微弱的优势&#xff0c;直接开摆&#xff0c;开始复习专业课和公共课考试了&#xff0c;结果虽然有遗憾但是还是算不错&#xff0c;至少没有掉到3.xx嘿嘿。 然后现在就要开始学习数学建模和算法同步了。接下来的文…

GPU性能实时监测的实用工具

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

python作业题百度网盘,python作业答案怎么查

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python作业题百度网盘&#xff0c;python作业答案怎么查&#xff0c;今天让我们一起来看看吧&#xff01; 1 以下代码的输出结果为&#xff1a; alist [1, 2, 3, 4] print(alist.reverse()) print(alist) A.[4, 3, 2, …

苏州科技大学计算机817程序设计(java) 学习笔记

之前备考苏州科技大学计算机&#xff08;专业课&#xff1a;817程序设计&#xff08;java&#xff09;&#xff09;。 学习Java和算法相关内容&#xff0c;现将笔记及资料统一整理归纳移至这里。 部分内容不太完善&#xff0c;欢迎提议。 目录 考情分析 考卷题型 刷题攻略…

7.2 uvm_resource_db in UVM

uvm_resource_db是一个类型参数化 type-parameterized的类&#xff0c;它是资源数据库顶部的一个方便层(convenience layer)。这个便利层简化了对低级数据库的访问&#xff0c;并且没有添加新功能。因此&#xff0c;uvm_resource_db不是从uvm_resource类派生的。以下uvm_resour…