网络编程入门之UDP编程
欢迎各位帅哥美女来捧场,本文是介绍UDP网络编程。在这里,你会见到最详细的教程;细致到每一行代码,每一个api的由来和使用它的目的等。
目录
1.UDP相关API
1.1.两个类
1.2.两个类中的方法
2.UDP编程
2.1.大体框架
2.2.内容构造
2.3.方法总结
1.UDP相关API
想要实现UDP编程,肯定要掌握一些用来操作udp的api,主要两个类,多个方法。
1.1.两个类
这两个类包括:DatagramSocket和DatagramPacket,至于这两个类里面的方法,下一个小标题介绍。
(1)DatagramSocket类
这个类,是用来操作网卡的,也就是用来创造服务器/客户端。可以获取到操作网卡的一个流对象,用来发送数据、接收数据、关闭流对象
(2)DatagramPacket类
这个类用来表示udp数据报,也就是用来保存数据的。DatagramPacket对象可以保存请求、响应、ip/端口号等信息。
1.2.两个类中的方法
(1)DatagramSocket类
- 构造方法
方法签名 | 解释 |
---|---|
DatagramSocket() | 无参构造。创造一个UDP数据报套接字的Socket,绑定到本机任意一个端口(一般用于客户端,系统会分配一个空闲的端口号) |
DatagramSocket(int port) | 创造一个UDP数据报套接字的Socket,并且绑定到本机指定端口号上(一般用于服务器) |
(1)无参构造方法一般用在客户端,不需要指定端口号,这种就是由系统随机分配空闲的端口号。(2)带参的构造方法,一般用在服务器,给服务器指定一个端口号;服务器需要在启动时就有端口号,方便客户端寻找。
- 普通方法
方法签名 | 说明 |
---|---|
void receive(DatagramPacket p) | 从这个套接字接收数据报,存到p中(如果没接收到,会阻塞等待) |
void send(DatagramPacket p) | 从这个套接字发送数据报p(不会阻塞,都是直接发送) |
void close() | 关闭这个数据报套接字(类似关闭流) |
上面三个就是udp通信的三部曲:接收请求、(解析请求)、发送响应(服务器);发送请求、接收响应(客户端);最后都需要关闭流(一般socket流对象和客户端服务器的声明周期一样,就不需要我们去主动关闭)
(2)DatagramPacket类
这是一个描述数据报的类,用来保存数据报。
- 构造方法
方法签名 | 说明 |
---|---|
DatagramPacket(byte[] bf,int length) | 构造一个数据报,并且使用字节数组接收数据,接受指定的长度 |
DatagramPacket(byte[] bf,int offset,int length,SocketAddress address,(port)) | 用来发送数据报。发送的数据在字节数组中,从offset到length长度。address包含目的主机的IP和端口号 |
(1)第一个构造方法:一般用于接收信息,像服务器接收请求和客户端接收响应;构造一个空的udp数据报对象,参数是指定一块存放数据的空间,后面的长度表示这一块空间的可用部分。(2)第二个构造方法:一般用于发送信息,像服务器发送响应和客户端发送请求;构造一个带有信息的udp数据报。具体信息存在第一个参数(请求或者响应),第二、三个参数表示信息的有效长度范围,第四个参数里面存放的是ip地址(也可以同时包含端口号),第五个参数表示端口号(当前面一个参数没有包含端口号时)。
- 普通方法
方法名 | 解释 |
---|---|
InetAddress getAddress() | 从接收/发送的数据报中,获取发送端的主机IP或者接收端的主机IP |
int getPort() | 从接收的数据报中,获取发送端主机的端口号;或者获取发送端主机的端口号 |
byte[] getData() | 获取数据报中的数据 |
这些方法,就是用来获取udp数据报中的一些信息的,比如第一个获取ip地址,第二个获取端口号等,不过想要完成udp通信,掌握这几个方法还不够,但是现在先不介绍完,等到介绍完udp通信我们就一起介绍。
2.UDP编程
前置常识:接下来就是要编写一个关于udp的网络程序,就需要有服务器和客户端(两个不同的程序/进程),服务器是可以24*7h的处理请求的(我们写成死循环即可),客户端随意(我们也写成死循环,表示可以不断发送请求)。
而且我们这里的服务器暂时作为一个回响服务器,也就是不解析请求,发送什么再发送回去即可。接下来就开始编程我们的第一个简单网络程序吧。
2.1.大体框架
(1)服务器
//各种包,这里先不写
//回显服务器
public class UdpEchoService {private DatagramSocket socket = null;public UdpEchoService(int port) throws SocketException {socket = new DatagramSocket(port);//给服务器指定端口号}public void start() throws IOException {System.out.println("服务器启动!");while(true) {//写成死循环,用于不断处理客户端发来的请求//1.接收请求//2.解析请求//3.发送响应(解析好的请求) }}public String service(String request) {//这个方法用来解析请求return request;}public static void main(String[] args) throws IOException {UdpEchoService service = new UdpEchoService(1314);service.start();}
}
main方法用来启动服务器,会先调用构造方法,构造好一个服务器,然后里面会自动调用start方法,表示服务器真正的启动了(可以处理请求)
(2)客户端
//各种包,这里也暂时不写
public class UdpEchoClient {private DatagramSocket socket = null;private String Ip;private int port;public UdpEchoClient(String Ip,int port) throws SocketException {socket = new DatagramSocket();//系统随机分配端口号this.Ip = Ip;//记录服务器的ip地址this.port = port;//记录服务器的端口号}public void start() throws IOException {System.out.println("客户端启动!");Scanner in = new Scanner(System.in);while (true) {//1.输入请求//2.发送请求//3.接收响应(服务器处理好请求后返回)//4.打印响应 }}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1",1314);//绑定本主机的服务器client.start();}
}
这里的客户端同理,构造方法只是做好了准备工作,等到start方法后,才能真正的开始发送请求(客户端启动)
2.2.内容构造
(1)服务器
接下来,我们分别完善服务器的三步曲:接收请求、解析请求、返回响应。
- 接收请求
udp客户端发送过来的请求,是一个二进制/字节流数据,所以我们需要使用一个udp数据报对象来接收,也就是构造一个udp数据报对象
DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
udp数据报对象中的参数相当于是一个“空盘子”,用来接收客户端发送过来的请求(udp数据报对象中没有实现,就需要我们自己指定一块空间)
当udp数据报对象构造完成后,就可以开始接收请求了
socket.receive(requestPacket);//接收请求,存放在requestPacket中
此时,我们就已经拿到客户端的请求了,但是此时是二进制信息,为了我们方便解析请求,所以我们打算将其转换成一个字符串请求
String request = new String(requestPacket.getData(),0,requestPacket.getLength());
这里就是需要使用到一些DatagramPacket类的方法了。
(1)第一个参数:前面介绍过多的,用来获取udp中的数据;(2)第二、三个参数,就是表示要获取udp中信息的范围,表示从0到二进制信息结尾(getLength()求的是什么长度?)(3)最后,String有提供相关的构造方法,用于将二进制数据转化成字符串数据
完整的接收请求代码:
//1.接收请求
DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);String request = new String(requestPacket.getData(),0,requestPacket.getLength());
- 解析请求
这一步就比较简单了,因为是回显服务器,只需要发送什么就返回什么即可;但是还是要做做样子,假装经过方法解析,然后得到一个响应。
//2.计算响应
String response = service(request);
计算请求的方法:
public String service(String request) {return request;
}
这一步很简单
- 返回响应
我们现在拿到的响应是一个string,返回时需要的是一个udp,所以也需要转化一下才行,我们这里需要使用到上面的udp数据报构造方法
socket.send(responsePacket);
DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,requestPacket.getSocketAddress());
这里有四个参数,需要解释一下:
(1)第一个参数:获取到字符串response中的数据;(2)第二、三个参数就是表示需要转化成的udp数据范围;(3)第四个参数:从前面接收的请求中获取客户端的ip地址(用来服务器确定响应是发给谁的)
通过上述的操作,此时responsePacket中就包含了响应和信息,接下来就可以返回响应了。
socket.send(responsePacket);
服务器的响应代码:
public void start() throws IOException {System.out.println("服务器启动!");while(true) {//1.接收请求并解析DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);//构造udp数据报socket.receive(requestPacket);//接收客户端的请求String request = new String(requestPacket.getData(),0,requestPacket.getLength());//将二进制请求(udp数据报)转化成字符串(字符流)//2.计算响应String response = service(request);//3.返回响应DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);System.out.printf("[%s:%d] req=%s,resp=%s\n",requestPacket.getAddress(),requestPacket.getPort(),request,response);// 客户端请求 返回的响应 客户端ip 端口}}public String service(String request) {return request;}
最下面有一个打印客户端信息的代码:前面两个就是获取ip地址和端口号的方法
回响服务器完整代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;//回显服务器
public class UdpEchoService {private DatagramSocket socket = null;public UdpEchoService(int port) throws SocketException {socket = new DatagramSocket(port);//给服务器指定端口号}public void start() throws IOException {System.out.println("服务器启动!");while(true) {//1.接收请求并解析DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);//构造udp数据报socket.receive(requestPacket);//接收客户端的请求String request = new String(requestPacket.getData(),0,requestPacket.getLength());//将二进制请求(udp数据报)转化成字符串(字符流)//2.计算响应String response = service(request);//3.返回响应DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);System.out.printf("[%s:%d] req=%s,resp=%s\n",requestPacket.getAddress(),requestPacket.getPort(),request,response);// 客户端ip 客户端端口号 客户端请求 返回的响应}}public String service(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoService service = new UdpEchoService(1314);System.out.println("我是父类服务器");service.start();}
}
(2)客户端
现在只需要完成客户端的四部曲即可:输入请求、发送请求、接收响应、打印响应
- 输入请求
我们这里直接使用字符串来接收请求即可
System.out.print("请输入你的请求:");
//1.输入请求
String request = in.nextLine();
- 发送请求
因为我们输入的请求是一个字符串类型,而发送udp数据报是字节类型,也可以说是需要将字符串请求打包成一个udp数据报才能发送
打包请求:
DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),0,request.getBytes().length,InetAddress.getByName(Ip),port);
这里同理,打包成一个DatagramPacket数据报,里面需要包含:请求和服务器的ip和端口号;前面三个参数就不多介绍,第四个参数是一个新的方法:InetAddress.getByName(int port),用来……
发送请求:
socket.send(requestPacket);
发送请求完整代码:
//2.发送请求
DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),0,request.getBytes().length,InetAddress.getByName(Ip),port);
socket.send(requestPacket);
- 接收响应
当向服务器发送完请求后,就需要接收服务器返回回来的响应,类型是一个DatagramPacket数据报。
DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
socket.receive(responsePacket);
这里需要提前构造一个DatagramPacket数据报,然后再去接收。
- 打印响应
//4.打印请求
String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println("响应为:"+response);
客户端完整代码:
//客户端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;public class UdpEchoClient {private DatagramSocket socket = null;private String Ip;private int port;public UdpEchoClient(String Ip,int port) throws SocketException {socket = new DatagramSocket();this.Ip = Ip;this.port = port;}public void start() throws IOException {System.out.println("客户端启动!");Scanner in = new Scanner(System.in);while (true) {System.out.print("请输入你的请求:");//1.输入请求String request = in.nextLine();//2.发送请求DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),0,request.getBytes().length,InetAddress.getByName(Ip),port);socket.send(requestPacket);//3.接收响应DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);//4.打印请求String response = new String(responsePacket.getData(),0,responsePacket.getLength());//System.out.println("中文翻译为:"+response);System.out.println("响应为:"+response);}}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1",1314);//绑定本主机的服务器client.start();}
}
客户端服务器也就都写好了,接下来实验一下。
先启动服务器:
在启动客户端:
客户端发送请求:
服务器日志:
至此,UDP服务器-客户端编码完成。
执行流程图:
2.3.方法总结
在前面,我已经介绍过一次方法了,现在又准备介绍一次,是为了水字数吗?那当然不是,前面两个类中的一些方法,只是为了让你认识到这些类,和实例化了对象后该怎么去做。
接下来,我们再进一步结合代码来介绍方法,而且主要是和DatagramPacket有关的方法。
(1)获取ip地址和端口号
- 直接调用方法分别获得
方法 | 解释 |
InetAddress getAddress() | 获取ip地址 |
int getPort() | 获取端口号 |
在代码中的体现
(2)求数据长度
这里是什么意思呢?你一定看过这些代码
这些求数据长度的有什么区别?该怎么使用?为什么要这样写?就是我们接下来要介绍的
- 字符和字节的区别
首先,字符>字节,一个字符可能包含多个字节。一个字符串,如果都是数字或者英文字母,那么它的字符数和字节数大概率是一样的;但是如果一个字符串中包含汉字等重量字符,那么字符数>字节数。
- 求长度的区别
如果本身是一个字节类型的字符串数据,那么我们直接取长度就好;但是如果是一个String类型的字符串,要将它转化成udp数据报,就需要先转化成字节类型,再求其长度。
如果本身是字节类型,就不需要转换;如果是字符串类型,就需要。原因:只要转化成最小单位,就不会遗漏数据
(3)字符串ip地址转成点分十进制格式
在客户端程序里面,有这么一个方法:
所以通过InetAddress.getByName(String ip)方法就可以将String类型的ip转换成一个java可以识别的ip对象(也就是InetAddress对象)
InetAddress.getByName(String ip) | 将字符串类型的ip地址转成java可识别的 |
(4)同时获得ip地址和端口号
服务器中的一段代码
目的是:现在服务器需要将响应发回客户端,就需要知道客户端的ip地址和客户端。
getSocketAddress() | 获取ip和端口号 |
返回一个InetSocketAddress对象,里面就包含ip地址和端口号
(5)获取数据
- 获取udp数据报中的数据
byte[] getData() | 将udp中的数据存入一个字节数组中 |
代码体现:
- 获取字符串中的数据
byte[] getBytes() | 将字符串中的数据存入一个字节数组中 |
代码体现:
以上就是udp客户端-服务器编程中使用到的方法了。
相关文章:

网络编程入门之UDP编程
欢迎各位帅哥美女来捧场,本文是介绍UDP网络编程。在这里,你会见到最详细的教程;细致到每一行代码,每一个api的由来和使用它的目的等。 目录 1.UDP相关API 1.1.两个类 1.2.两个类中的方法 2.UDP编程 2.1.大体框架 2.2.内容构…...

【AI源码】音频和图片生成你的数字人口播
带表情、带头部运动。适合做一些名人短视频鸡汤口播 类似此前微软和阿里emo那个方案 1、介绍: 能够通过单张静态肖像和输入音频生成具有自然流动运动的谈话视频,它采用了一种普遍的运动表示方法,能够捕捉广泛的面部动态,包括细微的表情和头部运动。 2、框架概述 (1)该…...

JAVA_3
JAVA_3 一、JAVA类和对象二、JAVA内存如何运转三、JAVA-constructer 一、JAVA类和对象 类包含三个内容: 1.属性field,静态特征(数据) 2.方法method,负责动态行为操作数据 3.构造器constructer,负责初始化对象…...

java项目之汽车资讯网站源码(springboot+mysql+vue)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的汽车资讯网站。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 汽车资讯网站的主要使用者管…...

C语言中的静态库和动态库的制作和使用
什么是库文件 单一模型 将程序中所有功能全部实现于一个单一的源文件内部。 编译时间长,不易于维护和升级,不易于协作开发。 分离模型 将程序中的不同的功能模块划分到不同的源文件中。 缩短编译时间,易于维护和升级,易于协…...

【MySQL 数据宝典】【事务锁】- 002 事务控制的演进
一、事务处理思路 1.1 排队 排队处理是事务管理最简单的方法,就是完全顺序执行所有事务的数据库操作,不需要加锁,简单的说就是全局排队。序列化执行所有的事务单元,数据库某个时刻只处理一个事务操作,特点是强一致性…...

如何远程操作服务器中的Python编译器并将运行结果返回到Pycharm
文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…...

C++入门指南(上)
目录 编辑 一、祖师爷画像 二、什么是C 三、C发展史 四、C在工作领域的应用 1. 操作系统以及大型系统软件开发 2. 服务器端开发 3. 游戏开发 4. 嵌入式和物联网领域 5. 数字图像处理 6. 人工智能 7. 分布式应用 五、如何快速上手C 一、祖师爷画像 本贾尼斯特劳斯…...

Python 全栈系列244 nginx upstream 负载均衡 踩坑日记
说明 最初是因为租用算力机(Python 全栈系列242 踩坑记录:租用算力机完成任务),所以想着做一个负载均衡,然后多开一些服务,把配置写在nginx里面就好了。 一开始租用了一个3080起了一个服务,后来觉得速度不够快,再起了…...

数据链路层——计算机网络学习笔记三
使用点对点信道的数据链路层 前言: 1.数据链路层的重要性:网络中的主机、路由器都必须实现数据连输层; 2.数据链路层中使用的信道: 点对点信道:这种信道是一对一的通信方式; 广播信道:使用一对多…...

leetcode——反转链表
206. 反转链表 - 力扣(LeetCode) 思路:创建三个指针n1,n2,n3,遍历原链表,通过三者之间的关系将链表反转。下面给出图示: 下面给出题解代码: typedef struct ListNode ListNode; struct List…...

类加载机制(双亲委派机制)
文章目录 JVM的作用是什么双亲委派机制加载流程 JVM的作用是什么 我们运行Java程序时,要安装JDK,JDK包含JVM,不同环境的JDK都是不同的。 Java 代码在编译后会形成 class 的字节码文件,该字节码文件通过 JVM 解释器,生…...

nss刷题(2)
1、[NSSCTF 2022 Spring Recruit]ezgame 打开题目是一个游戏界面 发现是有分数的,猜测分数达到某个之后可以获得flag,查看源码看一下 看到末尾显示分数超过65后显示flag 在js中找到了一个score,将他的值改为大于65的数后随意玩一次就可以得到flag同时&a…...

2024 年“泰迪杯”A 题:生产线的故障自动识别与人员配置--第四题(用遗传算法解决生产线排班问题--matlab代码)
问题背景: 问题四:根据实际情况,现需要扩大生产规模,将生产线每天的运行时间从 8 小时增加 到 24 小时不间断生产,考虑生产线与操作人员的搭配,制定最佳的操作人员排班方案,要求满足以下条件&am…...

资产公物仓管理系统|实现国有资产智能化管理
1、项目背景 资产公物仓管理系统(智仓库DW-S201)是一套成熟系统,依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 项目设计原则 方案对公物仓资…...

实用的 Google Chrome 命令
以下是一些实用的 Google Chrome 命令: chrome://version - 显示 Chrome 浏览器的详细信息,包括版本号、用户代理和命令行参数等。 chrome://flags - 打开 Chrome 实验性功能页面,可以启用或禁用各种实验性功能。请注意,这些功能…...

动态规划算法:⼦数组、⼦串系列(数组中连续的⼀段)
例题一 解法(动态规划): 算法思路: 1. 状态表⽰: 对于线性 dp ,我们可以⽤「经验 题⽬要求」来定义状态表⽰: i. 以某个位置为结尾,巴拉巴拉; ii. 以某个位置…...

2010年认证杯SPSSPRO杯数学建模D题(第一阶段)服务网点的分布全过程文档及程序
2010年认证杯SPSSPRO杯数学建模 D题 服务网点的分布 原题再现: 服务网点、通讯基站的设置,都存在如何设置较少的站点,获得较大效益的问题。通讯基站的覆盖范围一般是圆形的,而消防、快餐、快递服务则受到道路情况和到达时间的限…...

docker-compose 安装ZLMediaKit,ffmpeg、VLC实现推流并播放
1、目录(创建conf文件夹,777权限) 二、docker-compose.yml version: "3.9"services:zlmediakit:image: zlmediakit/zlmediakit:mastercontainer_name: zlmediakitprivileged: true# 指定加载配置# command: /opt/media/bin/MediaS…...

|Python新手小白中级教程|第二十八章:面向对象编程(类定义语法私有属性类的继承与多态)(4)
文章目录 前言一、类定义语法二、私有方法和私有属性1.私有属性2.私有方法 三、类“继承”1.初识继承2.使用super函数调用父类中构造的东西 四、类“多态”1.多态基础2.子类不同形态3.使用isinstance函数与多态结合判断类型 总结 前言 大家好,我是BoBo仔吖…...

vue项目基于WebRTC实现一对一音视频通话
效果 前端代码 <template><div class"flex items-center flex-col text-center p-12 h-screen"><div class"relative h-full mb-4 fBox"><video id"localVideo"></video><video id"remoteVideo">…...

web 基础之 HTTP 请求
web 基础 网上冲浪 就是在互联网(internet)上获取各种信息,进行工作,或者娱乐,他的英文表示surfing the Internet,因 “surfing”d的意思是冲浪,即成为网上冲浪,这是一种形象说法, 也是一个非…...

嵌入式 - GPIO编程简介
An Introduction to GPIO Programming By Jeff Tranter Wednesday, June 12, 2019 编者按:本 2019 年博客系列是 ICS 最受欢迎的系列之一,现已更新(2022 年 12 月),以确保内容仍然准确、相关和有用。 本博客是 Integr…...

8种区块链开发者必须知道的顶级编程语言!
我来问你一个问题:请说出一种技术,它以去中心化、不可篡改和透明性等核心特征席卷了全球。 这个问题的答案是,当然是区块链,它在近些年进入大家的视野并颠覆了工商业,没有任何其他技术能够做到这一点。 预计从2020年…...

十三、Redis哨兵模式--Sentinel
上一篇介绍了Redis中的主从复制。我们知道Redis主从中一般只有主节点对外提供写操作,如果主节点发生故障,为了保证Redis的可用性,这时就要在可用的slave节点中,挑选一个作为主节点。这种切换操作如果是人为的操作,那么…...

[力扣题解]1005. K 次取反后最大化的数组和
题目:1005. K 次取反后最大化的数组和 思路 贪心法; 用绝对值大小排序,自己写一个比较函数, static bool compare(int a, int b) {return abs(a) > abs(b); }注意这样写出来是降序排列; 代码 class Solution {…...

Web UI自动化测试--PO模式
没有PO实现的测试用例的问题: 重用性低:登录功能重复可维护性差:数据和代码混合可读性差:元素定位方法杂乱(id、xpath、css混杂)可读性差:不易识别操作的含义(特别是css和xpath语法)可维护性差:如果某个元素的属性改了,你要更改多次PO(Page Object Model)页面对象模型…...

Python进阶之-反射机制详解
✨前言: 什么是反射? Python中的“反射”是一个编程术语,它指的是程序在运行时能够检查和操作其自身状态的能力,特别是通过名称(通常是字符串)来访问对象的属性、方法和其他组成部分。这种机制允许代码动态…...

day05-面向对象内存原理和数组
day05 面向对象内存原理和数组 我们在之前已经学习过创建对象了,那么在底层中他是如何运行的。 1.对象内存图 1.1 Java 内存分配 Java 程序在运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域…...

从头理解transformer,注意力机制(下)
交叉注意力 交叉注意力里面q和KV生成的数据不一样 自注意力机制就是闷头自学 解码器里面的每一层都会拿着编码器结果进行参考,然后比较相互之间的差异。每做一次注意力计算都需要校准一次 编码器和解码器是可以并行进行训练的 训练过程 好久不见输入到编码器&…...