Java网络通信

前言

1. 基本知识

在这里插入图片描述

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

通俗一点就是CS就是要下载应用来访问的,BS是在浏览器上面访问的,不用下载

1.1 IP

在这里插入图片描述
IP地址就是你电脑的主机号,一台设备都有唯一的IP,端口就是程序的唯一标识
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这上面就是我们的ip地址了,有IPv4和IPv6两种
因为IPv4不够用了,所以才用IPv6的

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

IP域名和IP就是一个东西
在这里插入图片描述
在这里插入图片描述
只要有网还有IP地址存在,那么ping就会成功,
127.0.0.1就是我们这个电脑的IP地址,默认是
每个电脑的127.0.0.1都是自己的IP
在这里插入图片描述
在这里插入图片描述

        //1.获取本机IP地址对象InetAddress ip1=InetAddress.getLocalHost();System.out.println(ip1.getHostName());//获取本机IP地址对象的名字System.out.println(ip1.getHostAddress());//获取本机IP地址对象的IP

在这里插入图片描述
在这里插入图片描述
我这个就叫hahaha

        //2.获取指定IP或者域名的IP地址对象InetAddress ip2=InetAddress.getByName("www.baidu.com");System.out.println(ip2.getHostName());System.out.println(ip2.getHostAddress());

在这里插入图片描述
然后我直接在网址输入这个IP
在这里插入图片描述
在这里插入图片描述
就真的变成百度了

        System.out.println(ip2.isReachable(6000));

在这里插入图片描述
这个就是看6秒内,我们本机能否和百度IP建立联系,当然有网就可以了

1.2 端口与通信协议

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为视频语音的话,少了几个包最多只是声音变小,卡了一下而已
在这里插入图片描述
在这里插入图片描述
三次握手的意思就是,第一次确认了客户端可以发消息,第二次确认了服务器端可以收消息,和发消息,第三次就是确认客户端可以接受消息,这样两边都可以收发消息了,就没有问题了

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

2. UDP通信

2.1 一发一收

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

public class Server {public static void main(String[] args) throws Exception {//创建一个服务器对象(创建一个接菜的人),注册端口DatagramSocket socket=new DatagramSocket(6666);//这个对象也就是这个进程的端口是6666,可以指定端口的,不然就是随机的//2.创建一个数据包对象,用于接收数据,就是创建一个盘子byte[] buffer=new byte[1024*64];//因为一个数据包最大发送的内容就是这么大DatagramPacket packet=new DatagramPacket(buffer,buffer.length);//3.开始正式使用数据包来接收客户端发来的数据socket.receive(packet);//只管接收就可以了,只要把IP和端口告诉客户端,只管输入就可以了,这边只管接收//接收到的内容在buffer中,然后就是接收到了多少就倒出多少,不可能倒64kb吧int len=packet.getLength();String rs=new String(buffer,0,len);System.out.println(rs);}
}

这个是服务端

public class Client {public static void main(String[] args) throws Exception {//1.创建客户端对象(发菜的人)DatagramSocket socket=new DatagramSocket();//包装数据包对象分装要发出去的数据(创建盘子)byte[] bytes="我是快乐的客户端,我爱你abc".getBytes();
//    public DatagramPacket(byte buf[], int length,
//        InetAddress address, int port) {
//            this(buf, 0, length, address, port);
//        }//参数一:分装要发出去的数据,参数二:发送出去的数据大小(字节个数),参数三:服务端的IP地址,参数四:服务端程序的端口DatagramPacket packet=new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),6666);//包装菜和盘子socket.send(packet);//发出去System.out.println("发送完毕");socket.close();}
}

这个是客户端

应该先启动服务端,因为如果先启动客户端的话,直接就发送了,也不会管你发送成功了没有,还没等服务端接受就没了

在这里插入图片描述
在这里插入图片描述
只要服务端启动了,那么就会停在那个receive那里,等待接受

然后就是服务端接受到了的话,也可以得到客户端的IP和端口,还有就是资源不要忘了关闭,关闭客户端,服务端就可以了

System.out.println(packet.getAddress().getHostAddress());System.out.println(packet.getPort());socket.close();

在这里插入图片描述
然后就是其实客户端可以创建一个指定端口的对象

        //1.创建客户端对象(发菜的人)DatagramSocket socket=new DatagramSocket(7777);

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

2.2 多发多收

下面我们来实现多个客户端发送的场景

用个while循环就可以了

public class Client {public static void main(String[] args) throws Exception {DatagramSocket socket=new DatagramSocket(7777);Scanner sc=new Scanner(System.in);while (true) {System.out.println("请说");String msg=sc.nextLine();if("exit".equals(msg)){System.out.println("退出成功");socket.close();break;}byte[] bytes=msg.getBytes();DatagramPacket packet=new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),6666);//包装菜和盘子socket.send(packet);//发出去}}
}

这样就可以了,那么服务端也要循环来接收

public class Server {public static void main(String[] args) throws Exception {//创建一个服务器对象(创建一个接菜的人),注册端口DatagramSocket socket=new DatagramSocket(6666);byte[] buffer=new byte[1024*64];DatagramPacket packet=new DatagramPacket(buffer,buffer.length);while (true) {socket.receive(packet);int len=packet.getLength();String rs=new String(buffer,0,len);System.out.println(rs);System.out.println("--------------------");}}
}

因为服务端一般是不会关闭的,所以不用close
现在我们就可以客户端一直输入,服务端一直接受了

在这里插入图片描述
但是如何启动多个客户端呢,我们的编译器默认的是只能启动一个,但是可以改

在这里插入图片描述
点编辑配置
在这里插入图片描述
点允许多个实例

在这里插入图片描述
但是还是会报错,为什么呢,因为我们的客户端的端口指定了为7777
,不可能两个程序用一个端口吧,所以我们还是让系统随机分配端口吧

        DatagramSocket socket=new DatagramSocket();

在这里插入图片描述
这样就可以了

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

3. TCP通信

3.1 一发一收

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

public class Client {public static void main(String[] args) throws Exception {//创建socket对象,并请求与服务端连接Socket socket=new Socket("127.0.0.1",8888);//连接的就是IP为127.0.0.1,端口为8888的服务端//2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序OutputStream os=socket.getOutputStream();//3.把这个低级的字节输出流包装成数据输出流DataOutputStream dos=new DataOutputStream(os);//4.写数据出去dos.writeUTF("在一起毫秒");dos.close();socket.close();//要释放两个资源,一个网络的,一个IO流的}
}

在这里插入图片描述

在这里插入图片描述

public class Server {public static void main(String[] args) throws Exception {//创建一个ServerSocket的对象,同时为服务端注册端口ServerSocket serverSocket=new ServerSocket(8888);//使用serverSocket对象调用一个accept方法,等待客户端的连接请求,返回一个socket,与客户端对应,在服务端但是Socket socket=serverSocket.accept();//从socket通信管道中得到一个字节输入流InputStream is=socket.getInputStream();//包装成高级的IO流DataInputStream dis=new DataInputStream(is);//使用数据输入流读取客户端发送过来的消息String rs=dis.readUTF();System.out.println(rs);//打印客户端的IPSystem.out.println(socket.getRemoteSocketAddress());dis.close();socket.close();}
}

在这里插入图片描述
这个服务端会先在accept那里等着连接客户端,成功后,就会在readUTF等待读

在这里插入图片描述

3.2 多发多收

public class Client {public static void main(String[] args) throws Exception {Socket socket=new Socket("127.0.0.1",8888);OutputStream os=socket.getOutputStream();DataOutputStream dos=new DataOutputStream(os);Scanner sc=new Scanner(System.in);while(true){System.out.println("请说:");String msg=sc.nextLine();if("exit".equals(msg)){System.out.println("退出");dos.close();socket.close();break;}dos.writeUTF(msg);dos.flush();//刷新过去,防止在缓冲区中}}
}
public class Server {public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8888);Socket socket=serverSocket.accept();InputStream is=socket.getInputStream();DataInputStream dis=new DataInputStream(is);while(true){String rs=dis.readUTF();System.out.println(rs);}}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是在我们客户端推出的时候,服务端就会异常了,因为一端断开了,read不了了,但是还在等,就会出错,所以要捕获

public class Server {public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8888);Socket socket=serverSocket.accept();InputStream is=socket.getInputStream();DataInputStream dis=new DataInputStream(is);while(true){try {String rs=dis.readUTF();System.out.println(rs);} catch (Exception e) {System.out.println(socket.getRemoteSocketAddress()+"离线了");dis.close();socket.close();break;}}}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是我们这个不能实现服务端与多个用户通信,因为socket始终只有一个,而且又不确定用户端有多少个
所以我们就要用多线程的处理思想了

3.3 与多个用户通信

在这里插入图片描述
我们可以这样,用主线程来接收客户端的连接,连接了一个的话,就把这个socket交给一个子线程来处理

public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket=socket;}@Overridepublic void run() {}
}

先自定义一个线程,因为要把socket交给线程,所以线程的定义要有socket

public class Server {public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8888);while(true){Socket socket=serverSocket.accept();new ServerReaderThread(socket).start();//交给一个新的线程来处理}}
}
public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket=socket;}@Overridepublic void run() {try {InputStream is=socket.getInputStream();DataInputStream dis=new DataInputStream(is);while (true) {try {String rs = dis.readUTF();System.out.println(rs);} catch (IOException e) {System.out.println(socket.getRemoteSocketAddress()+"离线了");//结束这个线程dis.close();socket.close();break;}}} catch (Exception e) {e.printStackTrace();}}
}

这样的话,主线程就会在accept那里等着,子线程的话,就会在read那里等着

这样我们就可以开启多个客户端了
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.4 用户与用户之间通信

其实实现逻辑就是客户端发给服务端,服务端发给其他客户端
在这里插入图片描述
就是一个客户端发送消息,其他客户端都能看到
在这里插入图片描述
socket用集合存着,这个集合只有一个

public class Server {public static List<Socket> onLineSockets=new ArrayList<>();public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8888);while(true){Socket socket=serverSocket.accept();onLineSockets.add(socket);System.out.println("有人上线了"+socket.getRemoteSocketAddress());new ServerReaderThread(socket).start();}}
}

接收到一个,就增加一个

对应还有删除,

                    System.out.println(socket.getRemoteSocketAddress()+"离线了");//结束这个线程Server.onLineSockets.remove(socket);//

还要把这个socket发给其他用户
分发给全部客户端就可以了

                    String rs = dis.readUTF();System.out.println(rs);sendRsToAll(rs);
    private void sendRsToAll(String rs) throws Exception {for (Socket onLineSocket : Server.onLineSockets) {OutputStream os=onLineSocket.getOutputStream();DataOutputStream dos=new DataOutputStream(os);dos.writeUTF(rs);dos.flush();}}

然后对应每个客户端都要接受来自对应服务端的数据
因为socket是对应的,所以一定会对应回去的

每个客户端都要一直读,所以这也是一个死循环,而且还要一直死循环写,所以又是多线程的逻辑

又要建立一个新的线程
这个的逻辑和服务端的读的线程逻辑是差不多的

public class ClientReaderThread extends Thread{Socket socket;public ClientReaderThread(Socket socket){this.socket=socket;}@Overridepublic void run() {try {InputStream is=socket.getInputStream();DataInputStream dis=new DataInputStream(is);while (true) {try {String rs = dis.readUTF();System.out.println(socket.getRemoteSocketAddress()+"说"+rs);} catch (IOException e) {Server.onLineSockets.remove(socket);//dis.close();socket.close();break;}}} catch (Exception e) {e.printStackTrace();}}
}
public class Client {public static void main(String[] args) throws Exception {Socket socket=new Socket("127.0.0.1",8888);new ClientReaderThread(socket).start();//创建一个线程来专门接受读的OutputStream os=socket.getOutputStream();DataOutputStream dos=new DataOutputStream(os);Scanner sc=new Scanner(System.in);while(true){System.out.println("请说:");String msg=sc.nextLine();if("exit".equals(msg)){System.out.println("退出");dos.close();socket.close();break;}dos.writeUTF(msg);dos.flush();//刷新过去,防止在缓冲区中}}
}
public class Server {public static List<Socket> onLineSockets=new ArrayList<>();public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8888);while(true){Socket socket=serverSocket.accept();onLineSockets.add(socket);System.out.println("有人上线了"+socket.getRemoteSocketAddress());new ServerReaderThread(socket).start();}}
}
public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket=socket;}@Overridepublic void run() {try {InputStream is=socket.getInputStream();DataInputStream dis=new DataInputStream(is);while (true) {try {String rs = dis.readUTF();System.out.println(rs);sendRsToAll(rs);} catch (IOException e) {System.out.println(socket.getRemoteSocketAddress()+"离线了");//结束这个线程Server.onLineSockets.remove(socket);//dis.close();socket.close();break;}}} catch (Exception e) {e.printStackTrace();}}private void sendRsToAll(String rs) throws Exception {for (Socket onLineSocket : Server.onLineSockets) {OutputStream os=onLineSocket.getOutputStream();DataOutputStream dos=new DataOutputStream(os);dos.writeUTF(rs);dos.flush();}}
}

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

3.5 实现一个简易版的BS架构

在这里插入图片描述
在这里插入图片描述
我们的服务端只有一个,不同浏览器打开我们的服务端的时候,就会创建不同的子线程

public class Server {public static List<Socket> onLineSockets=new ArrayList<>();public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8888);while(true){Socket socket=serverSocket.accept();onLineSockets.add(socket);System.out.println("有人上线了"+socket.getRemoteSocketAddress());new ServerReaderThread(socket).start();}}
}
public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket=socket;}@Overridepublic void run() {//连接到了,就要返回一个‘黑马程序员给浏览器’try {OutputStream os=socket.getOutputStream();DataOutputStream dos=new DataOutputStream(os);dos.writeUTF("黑马程序员");dos.close();socket.close();} catch (Exception e) {e.printStackTrace();}}
}

在这里插入图片描述
然后我们就可以在浏览器上连接我们的服务端了

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

但是这样不行呢,为什么呢,因为服务器必须给浏览器响应http协议规定的数据格式,不然浏览器不识别返回的数据。
而且浏览器会疯狂去试探,所以有很多上线了,但是没有一个能认识那些数据,所以会出错

在这里插入图片描述
因为换行数据流不好操作,所以我们用打印流
我们返回的数据就要是上面的格式,不然浏览器无法识别,这个就是http协议

public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket=socket;}@Overridepublic void run() {//连接到了,就要返回一个‘黑马程序员给浏览器’try {OutputStream os=socket.getOutputStream();PrintStream ps=new PrintStream(os);ps.println("HTTP/1.1 200 OK");ps.println("Content-Type:text/html;charset=UTF-8");ps.println();//必须换行、、、..后面的就是我们要输入的内容ps.println("黑马程序员");socket.close();} catch (Exception e) {e.printStackTrace();}}
}

在这里插入图片描述
在这里插入图片描述
可以美化一下

            ps.println("<div style='color:red;font-size:120px;text-align:center'>黑马程序员");

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
换个浏览器也可以

在这里插入图片描述

拓展一下,我们可以使用线程池

在这里插入图片描述

        //创建一个线程池,,因为这个是IO型任务,所以核心线程数量=CPU核数*2ThreadPoolExecutor pool=new ThreadPoolExecutor(16*2,16*2,0, TimeUnit.SECONDS,new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());

因为为线程池,所以传入的也都是任务对象,就不能是线程对象了

public class ServerReaderRunnable implements Runnable{
public class Server {public static List<Socket> onLineSockets=new ArrayList<>();public static void main(String[] args) throws Exception {ServerSocket serverSocket=new ServerSocket(8888);//创建一个线程池,,因为这个是IO型任务,所以核心线程数量=CPU核数*2ThreadPoolExecutor pool=new ThreadPoolExecutor(16*2,16*2,0, TimeUnit.SECONDS,new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());while(true){Socket socket=serverSocket.accept();pool.execute(new ServerReaderRunnable(socket));}}
}
public class ServerReaderRunnable implements Runnable{private Socket socket;public ServerReaderRunnable(Socket socket){this.socket=socket;}@Overridepublic void run() {//连接到了,就要返回一个‘黑马程序员给浏览器’try {OutputStream os=socket.getOutputStream();PrintStream ps=new PrintStream(os);ps.println("HTTP/1.1 200 OK");ps.println("Content-Type:text/html;charset=UTF-8");ps.println();//必须换行、、、..后面的就是我们要输入的内容ps.println("<div style='color:red;font-size:120px;text-align:center'>黑马程序员");ps.close();socket.close();} catch (Exception e) {e.printStackTrace();}}
}

这样就可以了
在这里插入图片描述

总结

后面还是接着讲Java

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

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

相关文章

iptables面试题

1、详述iptales工作流程以及规则过滤顺序&#xff1f; iptables过滤的规则顺序是由上至下&#xff0c;若出现相同的匹配规则则遵循由上至下的顺序 2、iptables的几个表以及每个表对应链的作用&#xff1f; Iptables有四表五链 Filter表 : Filter表是iptables中使用的默认表…

【论文笔记】Attention Prompting on Image for Large Vision-Language Models

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Attention Prompting on I…

【spring】Cookie和Session的设置与获取(@CookieValue()和@SessionAttribute())

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;程序猿的春天 获取Cookie 使用 Servlet 获取Cookie&#xff1a; Spring MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;也是在 Servlet 的基础上实现的 RestController RequestMapping…

Android启动流程_Init阶段

前言 本文将会介绍 Android 启动流程&#xff0c;将基于 Android 10 代码逻辑介绍原生启动过程。 bootloader 上电 -> 加载 recovery 镜像或者 boot 镜像 -> linux kernel 启动 -> 加载 init 进程 -> 加载 zygote 进程 -> systemserver 进程 -> 系统启动 …

MySQL数据库之存储过程的创建与应用

存储过程 procedure 一.存储过程 作用&#xff1a;将经常使用的功能写成存储过程&#xff0c;方便后续重复使用。 二.创建存储过程 三.调用存储过程 call在计算机中是调用的意思 案例1&#xff1a;查看MySQL用户数 如上图所示&#xff0c;这是查看MySQL数据库中的user个数…

7.使用Redis进行秒杀优化

目录 1. 优化思路 总结之前实现的秒杀过程 下单流程 2. 使用Redis完成秒杀资格判断和库存 0. Redis中数据类型的选用 1.将优惠券信息保存到Redis中 2.基于Lua脚本&#xff0c;判断秒杀库存、一人一单&#xff0c;决定用户是否抢购成功 3. 开启新协程&#xff0c;处理数…

终于把DETR搞懂了!Detection Transformer架构详解及使用方法说明

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Calling short variants with GATK4

计算生物学实验5: Calling short variants with GATK4 1. 实验目的 本实验目的是利用 GATK4 工具准确高效地检测出基因组中的短变异。通过该工具对样本基因组进行分析&#xff0c;旨在发现单核苷酸变异&#xff08;SNV&#xff09;和小的插入缺失&#xff08;Indel&#xff0…

S32K324 DTCM/DTCM Backdoor使用及测试

文章目录 前言S32K324的Memory mapDTCM的原理DTCM的使用DTCM/DTCM backdoor测试总结 前言 S32K324的Ram在选型手册上给的是512K&#xff0c;但实际上sram只有320k,项目中对ram的需求更大&#xff0c;所以需要拓展一下ram的使用。本文分析DTCM的使用方案及测试结果 S32K324的M…

Pytorch猴痘病识别

Pytorch猴痘病识别 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 电脑系统&#xff1a;Windows11 显卡型号&#xff1a;NVIDIA Quadro P620 语言环境&#xff1a;python 3.9.7 编译器&#xff1a;jupyte…

网络安全渗透实际案例

目录 案例场景案例目标和工具 案例操作步骤Step 1&#xff1a;信息收集与识别**结果分析** Step 2&#xff1a;漏洞扫描**预期结果** Step 3&#xff1a;漏洞利用与权限验证Step 4&#xff1a;后渗透测试Step 5&#xff1a;报告生成和修复建议**修复建议** 案例总结 下面是一个…

快消零售行业的培训创新:构建在线培训知识库

在快速消费品&#xff08;FMCG&#xff09;行业中&#xff0c;员工的培训和发展对于保持竞争力至关重要。随着电子商务的兴起和消费者行为的变化&#xff0c;快消零售行业需要不断适应新的市场趋势。在线培训知识库作为一种有效的培训工具&#xff0c;可以帮助企业提升员工技能…

软考(中级-软件设计师)计算机网络篇(1101)

第五章&#xff1a;计算机网络基础 **考纲要求**根据开始大纲中相应的考核要求&#xff0c;要求考生掌握一下方面的内容&#xff1a; 1、计算机网络基础知识 网络体系结构传输介质、传输技术、传输方法、传输控制常用网络设备和各类通信设备的特点Client-Server结构、Browser…

【毫米波雷达(四)】车载毫米波雷达下线EOL标定流程

汽车控制器下线EOL标定流程 一、概述二、标定的目的三、雷达标定的要求1、车辆的要求2、标定环境要求四、以软件的角度分析前雷达的EOL标定 一、概述 由于雷达的安装误差会影响雷达对目标位置的检测&#xff0c;导致报警及功能性能下降。因此雷达进行预安装后必须进行角度标定…

免费插件集-illustrator插件-Ai插件-闭合开放路径

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现图形编辑中闭合开放路径。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/8789…

LDA 线性分类

线性判别分析是一种经典的线性分类方法&#xff0c;将高维空间投射到低维空间&#xff0c;如下图。 LDA 的目标就是简单累内距离变小&#xff0c;把类间的距离变大&#xff0c;这样就可以把相似的数据聚集在一起。 u1 和 u2 类间距离&#xff0c;S1、S2 为类内数据点之间的距…

面试必会50题

基础篇 01 和 equals 的区别是什么 : 可以比较基本数据类型也可以比较引用数据类型 , 比较基本数据类型是比较值是否相等, 比较引用数据类型是比较引用地址是否相等 (基本数 据类型 比较的是值&#xff0c;引用数据类型 比较的是内存地址) equals() : 一般用于对象的比较…

Python 工具库每日推荐 【Sphinx】

文章目录 引言文档工具的重要性今日推荐:Sphinx 文档生成工具主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:为 Python 项目生成 API 文档案例分析高级特性自定义主题国际化支持扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript …

Pinctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析 input子系统专栏&#xff1a; 专栏地址&#xff1a;input子系统input角度&#xff1a;I2C触摸屏驱动分析…

第十五章 Vue工程化开发及Vue CLI脚手架

目录 一、引言 二、Vue CLI 基本介绍 三、安装Vue CLI 3.1. 安装npm和yarn 3.2. 安装Vue CLI 3.3. 查看 Vue 版本 四、创建启动工程 4.1. 创建项目架子 4.2. 启动工程 五、脚手架目录文件介绍 六、核心文件讲解 6.1. index.html 6.2. main.js 6.3. App.vue 一、…