网络编程、网络编程的三要素、TCP/UDP通信、三次握手和四次挥手


在这里插入图片描述

🐌个人主页: 🐌 叶落闲庭
💨我的专栏:💨
c语言
数据结构
javaweb

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


网络编程

  • 一、初始网络编程
    • 1.1什么是网络编程
    • 1.2BS/CS的优缺点
  • 二、网络编程三要素
    • 2.1IP
      • 2.1.1 InetAddress
    • 2.2端口
    • 2.3协议
  • 三、UDP通信程序
    • 3.1发送数据
    • 3.2接受数据
    • 3.3聊天室
    • 3.4UDP的三种通信方式(单播、组播、广播)
      • 3.4.1单播
      • 3.4.2组播
      • 3.4.3广播
  • 四、TCP通信程序
    • 4.1解决中文乱码问题
    • 4.2提高读取效率
    • 4.3三次握手和四次挥手
      • 4.3.1三次握手(确保连接建立)
  • 总结

一、初始网络编程

1.1什么是网络编程

  • 在网络通信协议下,不同的计算机上运行的程序,进行的数据传输,
  • 应用场景:即时通信、网游对战、金融证券、国际贸易、邮件等。
  • 不管是什么场景,都是计算机跟计算机之间通过网络进行数据传输
  • Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序。
  • 常见的软件架构:
    • C/S:Client/Server(客户端/服务器)
    • 在用户本地需要下载并安装客户端程序,在远程有一个服务端程序。
    • B/S:Browser/Server(浏览器/服务器)
    • 只需要一个浏览器,用户通过不同的网址,客户访问不同的服务器。

1.2BS/CS的优缺点

BSCS
不需要开发客户端画面可以做的非常精美,用户体验好
用户不需要下载,打开浏览器就能使用需要开发客户端,也需要开发服务端
如果应用过大,用户体验受到影响用户需要下载和更新的时候太麻烦

二、网络编程三要素

2.1IP

  • 全称:Internet Protocol,是互联网协议地址,也称IP地址。

  • 是分配给上网设备的数字标签。

  • 唯一的

  • 分类:IPv4、IPv6

    • IPv4:是给每个连接在网络上的主机分配一个32bit地址。按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,也就是4个字节。例如一个采用二进制形式的IP地址是“11000000 10101000 00000001 01000010”,这么长的地址,处理起来也太费劲了。为了方便使用,IP地址经常被写成十进制的形式,中间使用符号“.”分隔不同的字节。于是,上面的IP地址可以表示为“192.168.1.66”。IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多。
    • IPv6:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。为了扩大地址空间,通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,这样就解决了网络地址资源数量不够的问题。
    • DOS常用命令:

    • ipconfig:查看本机IP地址

    • ping IP地址:检查网络是否连通


在这里插入图片描述


    • 特殊IP地址:
    • 127.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用

2.1.1 InetAddress

InetAddress:此类表示Internet协议(IP)地址

方法名说明
static InetAddress getByName(String host)确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
String getHostName()获取此IP地址的主机名
String getHostAddress()返回文本显示中的IP地址字符串
package com.practice;import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressDemo {public static void main(String[] args) throws UnknownHostException {//获取InetAddress对象//一台电脑的对象InetAddress address = InetAddress.getByName("DESKTOP-MB3PIVP");//InetAddress address = InetAddress.getByName("192.168.1.66");System.out.println(address);//public String getHostName():获取此IP地址的主机名String name = address.getHostName();//public String getHostAddress():返回文本显示中的IP地址字符串String ip = address.getHostAddress();System.out.println("主机名:" + name);System.out.println("IP地址:" + ip);}
}

2.2端口

  • 设备上应用程序的唯一标识
  • 端口号
    • 用两个字节表示的整数,它的取值范围是0 ~ 65535。其中,0 ~ 1023之间的端口号用于一些知名的网络服务和应用。
    • 普通的应用程序需要使用1024以上的端口号,如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。
  • 一个端口号只能被一个应用程序使用。

2.3协议

  • 协议

    • 计算机网络中,连接和通信的规则被称为网络通信协议
  • UDP协议

    • 用户数据报协议(User Datagram Protocol)
    • UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
    • 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输
    • 例如视频会议通常采用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议
  • TCP协议

    • 传输控制协议 (Transmission Control Protocol)

    • TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”

  • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠

    • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认

    • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

    • 第三次握手,客户端再次向服务器端发送确认信息,确认连接

    • 完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛。例如上传文件、下载文件、浏览网页等。

三、UDP通信程序

  • Java中的UDP通信:
    • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念
    • Java提供了DatagramSocket类作为基于UDP协议的Socket

3.1发送数据

  • 发送数据的步骤
    • 1.创建发送端的Socket对象(DatagramSocket)
    • 2.创建数据,并把数据打包
    • 3.调用DatagramSocket对象的方法发送数据
    • 4.关闭发送端
package com.practice.udpdemo;import java.io.IOException;
import java.net.*;/*** @Author YJ* @Date 2023/7/29 10:44* Description:UDP发送数据*/
public class SetMessageDemo {public static void main(String[] args) throws IOException {//1.创建对象//创建发送端的Socket对象(DatagramSocket)//绑定端口,通过这个端口往外发送数据//空参:所有可用端口中随机一个进行使用//有参:指定端口进行绑定DatagramSocket ds = new DatagramSocket();String str = "你好呀!!!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;//2.打包数据DatagramPacket  dp = new DatagramPacket(bytes,bytes.length,address,port);//3.发送数据ds.send(dp);//4.释放资源ds.close();}
}

3.2接受数据

  • 接收数据的步骤

    • 创建接收端的Socket对象(DatagramSocket)
    • 创建一个数据包,用于接收数据
    • 调用DatagramSocket对象的方法接收数据
    • 解析数据包,并把数据在控制台显示
    • 关闭接收端
package com.practice.udpdemo;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** @Author YJ* @Date 2023/7/29 10:55* Description:UDP接收数据*/
public class ReceiveDemo {public static void main(String[] args) throws IOException {1.创建对象//创建发送端的Socket对象(DatagramSocket)//在接收的时候,一定要绑定端口//绑定的端口一定要跟发送的端口保持一致DatagramSocket ds = new DatagramSocket(10086);//2.接受数据包byte[] bytes = new byte[1024];DatagramPacket dp= new DatagramPacket(bytes,bytes.length);//receive是阻塞的,会在这死等ds.receive(dp);//3.解析数据包byte[] data = dp.getData();int length = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据:"+ new String(data,0,length));System.out.println("数据是从“"+ address + "”在这台电脑中的 "+ port+" 端口发出的");ds.close();}
}

在这里插入图片描述

3.3聊天室

package com.practice.udpdemo;import java.io.IOException;
import java.net.*;
import java.util.Scanner;/*** @Author YJ* @Date 2023/7/29 11:09* Description:发送数据*/
public class SendMessage {public static void main(String[] args) throws IOException {//1.创建对象DatagramSocket ds = new DatagramSocket();//2.打包数据Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入消息:");String str = sc.next();if("886".equals(str)){break;}byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);//3.发送数据ds.send(dp);}ds.close();}
}
package com.practice.udpdemo;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;/*** @Author YJ* @Date 2023/7/29 11:10* Description:接收数据*/
public class ReceiveMessage {public static void main(String[] args) throws Exception {1.创建对象DatagramSocket ds = new DatagramSocket(10086);//2.接收数据包byte[] bytes = new byte[1024];while (true) {DatagramPacket dp = new DatagramPacket(bytes,bytes.length);ds.receive(dp);//3.解析数据byte[] data = dp.getData();int length = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();System.out.println("ip为:" + ip + "主机名为:" + name + "的人,发送了:"+ new String(data,0,length));}}
}

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


3.4UDP的三种通信方式(单播、组播、广播)

3.4.1单播

一对一的形式,之前的代码都是单播的形式

package com.practice.udpdemo;import java.io.IOException;
import java.net.*;
import java.util.Scanner;/*** @Author YJ* @Date 2023/7/29 11:09* Description:单播*/
public class SendMessage {public static void main(String[] args) throws IOException {//1.创建对象DatagramSocket ds = new DatagramSocket();//2.打包数据Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入消息:");String str = sc.next();if("886".equals(str)){break;}byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);//3.发送数据ds.send(dp);}ds.close();}
}

3.4.2组播

组播地址:224.0.0.0 ~ 239.255.255.255

  • 其中224.0.0.0 ~ 224.0.0.255为预留组播地址
package com.practice.udpdemo;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;/*** @Author YJ* @Date 2023/7/29 11:39* Description:组播发送  -- 发送端*/
public class SendMessage1 {public static void main(String[] args) throws IOException {//1.创建MulticastSocket对象MulticastSocket ms = new MulticastSocket();String str = "你好~";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("224.0.0.1");int port = 10000;//2.打包数据DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,address,port);//3.发送数据ms.send(datagramPacket);//4.释放资源ms.close();}
}
package com.practice.udpdemo;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;/*** @Author YJ* @Date 2023/7/29 11:10* Description:接收数据 -- 接收端1*/
public class ReceiveMessage1 {public static void main(String[] args) throws Exception {1.创建对象MulticastSocket ms = new MulticastSocket(10000);//2.将当前本机,添加到224.0.0.1这一组中InetAddress address = InetAddress.getByName("224.0.0.1");ms.joinGroup(address);//3.打包数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes,bytes.length);//4.接收数据ms.receive(dp);//5.解析数据byte[] data = dp.getData();int length = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();System.out.println("ip为:" + ip + "主机名为:" + name + "的人,发送了:"+ new String(data,0,length));}
}
package com.practice.udpdemo;import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;/*** @Author YJ* @Date 2023/7/29 11:10* Description:接收数据 -- 接收端2*/
public class ReceiveMessage2 {public static void main(String[] args) throws Exception {1.创建对象MulticastSocket ms = new MulticastSocket(10000);//2.将当前本机,添加到224.0.0.1这一组中InetAddress address = InetAddress.getByName("224.0.0.1");ms.joinGroup(address);//3.打包数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes,bytes.length);//4.接收数据ms.receive(dp);//5.解析数据byte[] data = dp.getData();int length = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();System.out.println("ip为:" + ip + "主机名为:" + name + "的人,发送了:"+ new String(data,0,length));}
}

在这里插入图片描述

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

3.4.3广播

广播地址:255.255.255.255

package com.practice.udpdemo;import java.io.IOException;
import java.net.*;
import java.util.Scanner;/*** @Author YJ* @Date 2023/7/29 11:09* Description:广播*/
public class SendMessage {public static void main(String[] args) throws IOException {//1.创建对象DatagramSocket ds = new DatagramSocket();//2.打包数据Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入消息:");String str = sc.next();if("886".equals(str)){break;}byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("255.255.255.255");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);//3.发送数据ds.send(dp);}ds.close();}
}

四、TCP通信程序

  • Java中的TCP通信:

    • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。
    • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
      在这里插入图片描述
  • 客户端

    • 1.创建客户端的Socket对象与指定服务端连接Socket(String host,int port)
    • 2.获取输出流,写数据OutputStream getOutputStream()
    • 3.释放资源void close()
  • 服务器

    • 1.创建服务器端的Socket对象(ServerSocket)
    • 2.监听客户端连接,返回一个Socket对象
    • 3.获取输入流,读数据,并把数据显示在控制台
    • 4.释放资源
package com.practice.udpdemo;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {public static void main(String[] args) throws IOException {//创建客户端的Socket对象(Socket)//Socket(String host, int port)//创建流套接字并将其连接到指定主机上的指定端口号Socket s = new Socket("127.0.0.1",10001);//获取输出流,写数据//OutputStream getOutputStream() 返回此套接字的输出流OutputStream os = s.getOutputStream();os.write("hello,tcp,我来了".getBytes());//释放资源s.close();}
}
package com.practice.udpdemo;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo {public static void main(String[] args) throws IOException {//1.创建服务器端的Socket对象(ServerSocket)//ServerSocket(int port) 创建绑定到指定端口的服务器套接字ServerSocket ss = new ServerSocket(10001);//监听客户端连接//Socket accept() 侦听要连接到此套接字并接受它Socket s = ss.accept();//3.从连接通道中获取输入流,读数据,并把数据显示在控制台InputStream is = s.getInputStream();/*byte[] bys = new byte[1024];int len = is.read(bys);*/int b;while ((b = is.read()) != -1) {System.out.println((char) b);}/*String data = new String(bys,0,len);System.out.println("数据是:" + data);*///释放资源s.close();ss.close();}
}

在这里插入图片描述

4.1解决中文乱码问题

package com.practice.udpdemo;import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo {public static void main(String[] args) throws IOException {//1.创建服务器端的Socket对象(ServerSocket)//ServerSocket(int port) 创建绑定到指定端口的服务器套接字ServerSocket ss = new ServerSocket(10001);//监听客户端连接//Socket accept() 侦听要连接到此套接字并接受它Socket s = ss.accept();//3.从连接通道中获取输入流,读数据,并把数据显示在控制台InputStream is = s.getInputStream();//转换流InputStreamReader isr = new InputStreamReader(is);int b;while ((b = isr.read()) != -1) {System.out.println((char) b);}//释放资源s.close();ss.close();}
}

在这里插入图片描述

4.2提高读取效率

  • 添加缓冲流
package com.practice.udpdemo;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo {public static void main(String[] args) throws IOException {//1.创建服务器端的Socket对象(ServerSocket)//ServerSocket(int port) 创建绑定到指定端口的服务器套接字ServerSocket ss = new ServerSocket(10001);//监听客户端连接//Socket accept() 侦听要连接到此套接字并接受它Socket s = ss.accept();//3.从连接通道中获取输入流,读数据,并把数据显示在控制台/*InputStream is = s.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader bf = new BufferedReader(isr);*///写成一行BufferedReader bf = new BufferedReader(new InputStreamReader(s.getInputStream()));int b;while ((b = bf.read()) != -1) {System.out.print((char) b);}//释放资源s.close();ss.close();}
}

在这里插入图片描述

4.3三次握手和四次挥手

4.3.1三次握手(确保连接建立)

  • 1.客户端向服务器发出连接请求,等待服务器确认
  • 2.服务器向客户端返回一个相应,告诉客户端收到了请求
  • 3.客户端向服务器再次发出确认信息,连接建立

在这里插入图片描述


  • 1.客户端向服务器发出取消连接请求
  • 2.服务器向客户端返回一个响应,表示收到客户端取消请求
  • 3.服务器向客户端发出确认取消请求
  • 4.客户端再次发送确认消息,连接取消

在这里插入图片描述


总结

关于网络编程的基本知识我们都有了了解,希望对大家有所帮助,欢迎各位小伙伴点赞+关注!!!

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

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

相关文章

OpenMMLab【超级视客营】——把类别信息加入可视化结果中(MMSegmentation的第二个PR)

文章目录 1. 任务说明1.0 新手指引1.1 任务目标1.2 提交格式 2. 实施2.1 可视化的形式2.2 拉分支和提交PR2.2.1 拉分支2.2.2 提交PR 2.3 MMSegmentation中关于可视化的内容2.3.1 文档说明2.3.2 相关PR(确定要修改的文件)2.3.3 提交时的代码测试 2.4 发现…

item_get-小红薯-商品详情

一、接口参数说明: item_get-获得小红薯商品详情,点击更多API调试,请移步注册API账号点击获取测试key和secret 公共参数 名称类型必须描述keyString是调用key(http://o0b.cn/iimiya)secretString是调用密钥api_nameS…

中国农村程序员学习此【ES6】购买大平层,开上帕拉梅拉,迎娶白富美出任CEO走上人生巅峰

注:最后有面试挑战,看看自己掌握了吗 文章目录 比较 var 和 let 关键字的作用域--var可能被随时覆盖-全局变量for循环全局作用域函数作用域块作用域循环作用域HTML 中的全局变量提升改变一个用 const 声明的数组防止对象改变使用箭头函数编写简洁的匿名函…

CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、CPU密集型与IO密集型3.1、CPU密集型3.2、I/O密…

list遍历添加条件同时修改元素

list遍历添加条件同时修改元素 方式一 // 遍历list同时修改元素List<Person> list new ArrayList(16);list.add(new Person("小王", 18));list.add(new Person("小三", 17));list.stream().filter(item -> item.getAge() > 17).forEach(item…

Linux系统使用(超详细)

目录 Linux操作系统简介 Linux和windows区别 Linux常见命令 Linux目录结构 Linux命令提示符 常用命令 ls cd pwd touch cat echo mkdir rm cp mv vim vim的基本使用 grep netstat Linux面试题 Linux操作系统简介 Linux操作系统是和windows操作系统是并列…

docker 安装 字体文件

先说一下我当前的 场景 及 环境&#xff0c;这样同学们可以先评估本篇文章是否有帮助。 环境&#xff1a; dockerphp8.1-fpmwindows 之所以有 php&#xff0c;是因为这个功能是使用 php 开发的&#xff0c;其他语言的同学&#xff0c;如果也有使用到 字体文件&#xff0c;那么…

uniapp echarts 点击失效

这个问题网上搜了一堆&#xff0c;有的让你降版本&#xff0c;有的让你改源码。。。都不太符合预期&#xff0c;目前我的方法可以用最新的echarts。 这个方法就是由npm安装转为CDN&#xff0c;当然你可能会质疑用CDN这样会不稳定&#xff0c;那如果CDN的地址是本地呢&#xff1…

Stable Diffusion - Stable Diffusion WebUI 支持 SDXL 1.0 模型的环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132056980 SDXL 1.0 版本 是 Stable Diffusion 的最新版本&#xff0c;是基于潜在扩散模型的文本到图像生成技术&#xff0c;能够根据输入的任何文…

uniapp小程序自定义loding,通过状态管理配置全局使用

一、在项目中创建loding组件 在uniapp的components文件夹下创建loding组件&#xff0c;如图&#xff1a; 示例代码&#xff1a; <template><view class"loginLoading"><image src"../../static/loading.gif" class"loading-img&q…

《ChatGPT原理最佳解释,从根上理解ChatGPT》

【热点】 2022年11月30日&#xff0c;OpenAI发布ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c; 即聊天机器人程序 &#xff0c;开启AIGC的研究热潮。 ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够…

make/makefile的使用

make/makefile 文章目录 make/makefile初步认识makefile的工作流程依赖关系和依赖方法make的使用 总结 make是一个命令&#xff0c;是一个解释makefile中指令的命令工具&#xff0c;makefile是一个文件&#xff0c;当前目录下的文件&#xff0c;两者搭配使用&#xff0c;完成项…

6.物联网操作系统信号量

一。信号量的概念与应用 信号量定义 FreeRTOS信号量介绍 FreeRTOS信号量工作原理 1.信号量的定义 多任务环境下使用&#xff0c;用来协调多个任务正确合理使用临界资源。 2.FreeRTOS信号量介绍 Semaphore包括Binary&#xff0c;Count&#xff0c;Mutex&#xff1b; Mutex包…

【Spring Boot】单元测试

单元测试 单元测试在日常项目开发中必不可少&#xff0c;Spring Boot提供了完善的单元测试框架和工具用于测试开发的应用。接下来介绍Spring Boot为单元测试提供了哪些支持&#xff0c;以及如何在Spring Boot项目中进行单元测试。 1.Spring Boot集成单元测试 单元测试主要用…

【Python小笔记】零碎同步

1.多字段连接&#xff0c;连接字段名不一致–left_on\right_on对应列示后可匹配 import pandas as pd df_A1pd.read_excel(E:\Mercy\data\mytest\A.xlsx,sheet_name0) df_A2pd.read_excel(E:\Mercy\data\mytest\A.xlsx,sheet_name1)df_Adf_A1.merge(rightdf_A2,howleft,left_o…

spring-cache框架使用笔记

spring-cache框架使用笔记 什么是spring-cache框架 spring-cache是spring框架中的一个缓存抽象层&#xff0c; 它提供了一种简便的方式来集成不同的底层缓存实现&#xff0c; 如内存缓存(concurrentMap/ehcache/caffeine)/分布式缓存(redis/couchbase)等 它简化了在app中使用…

哈工大计算机网络课程网络安全基本原理之:身份认证

哈工大计算机网络课程网络安全基本原理之&#xff1a;身份认证 在日常生活中&#xff0c;在很多场景下我们都需要对当前身份做认证&#xff0c;比如使用密码、人脸识别、指纹识别等&#xff0c;这些都是身份认证的常用方式。本节介绍的身份认证&#xff0c;是在计算机网络安全…

【机器学习】分类算法 - KNN算法(K-近邻算法)KNeighborsClassifier

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;零基础快速入门人工智能《机器学习入门到精通》 K-近邻算法 1、什么是K-近邻算法&#xff1f;2、K-近邻算法API3、…

Tessy 4.3.18

Tessy 4.3.18 windows 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/