[java入门到精通] 19 网络编程,设计模式

今日目标

1 网络编程

1.1 软件架构

  • C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件
  • B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等
  • 两种架构各有优势,但是都离不开网络的支持。网络编程 , 就是在一定的协议下,实现两台计算机的通信的程序
    在这里插入图片描述

在这里插入图片描述

1.2 什么是网络编程

  • 在网络通信协议下,不同计算机上运行的程序,可以进行数据传输

1.3 网络编程三要素

  • IP地址 : 设备在网络中的地址,是唯一的标识。
  • 端口 : 设备在网络中的地址,是唯一的标识。
  • 数据在网络中传输的规则,常见的协议有UDP协议和TCP协议。

1.4 IP地址

  • IP:全称”互联网协议地址”,也称IP地址。是分配给上网设备的数字标签。常见的IP分类为:ipv4和ipv6

    简单来说 : 就是设备在网络中的唯一标识 , 想要连接哪一台电脑 , 就找到此电脑在网络中的ip地址

  • IP地址常见分类 : ipv4和ipv6

  • 常用命令:

    • ipconfig:查看本机IP地址
    • IP地址:检查网络是否连通
  • 特殊IP地址:

    • 127.0.0.1:是回送地址也称本地回环地址,可以代表本机的IP地址,一般用来测试使用
  • 为了方便我们对IP地址的获取和操作,Java提供了一个类InetAddress 供我们使用
    InetAddress:此类表示Internet协议(IP)地址

    • static InetAddress getByName(String host)在给定主机名的情况下确定主机的 IP 地址
      String getHostName()获取此 IP 地址的主机名
      String getHostAddress()返回 IP 地址字符串(以文本表现形式)。

1.5 端口

  • 端口:应用程序在设备中唯一的标识。

  • 端口号:应用程序的唯一标识方式 , 用两个字节表示的整数,它的取值范围是0~65535。
    其中0~1023之间的端口号用于一些知名的网络服务或者应用。
    我们自己使用1024以上的端口号就可以了。

  • 注意:一个端口号只能被一个应用程序使用。

1.6 通信协议

  • 协议:计算机网络中,连接和通信的规则被称为网络通信协议
  • UDP协议
    • 用户数据报协议(User Datagram Protocol)
    • UDP是面向无连接通信协议。
    • 速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据。
  • TCP协议
    • 传输控制协议 (Transmission Control Protocol)
    • TCP协议是面向连接的通信协议。
    • 速度慢,没有大小限制,数据安全

2 TCP通信

2.1 TCP发送数据

package com.lystar.tcp_demo.demo1;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;/*客户端 :发送数据的步骤1 创建客户端的Socket对象 : Socket(String host, int port) 与指定服务端连接参数说明:host 表示服务器端的主机名,也可以是服务器端的IP地址,只不过是String类型的port 表示服务器端的端口2 通获Socket对象取网络中的输出流,写数据OutputStream getOutputStream()3 释放资源void close()*/
public class ClientDemo {public static void main(String[] args) throws IOException {// 创建客户端的Socket对象(Socket) 与指定服务端连接Socket socket = new Socket("127.0.0.1", 10010);// 通获Socket对象取网络中的输出流,写数据OutputStream os = socket.getOutputStream();os.write("hello".getBytes());// while(true){}// 释放资源os.close();socket.close();}
}

2.2 TCP接收数据

package com.lystar.tcp_demo.demo1;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*服务端接收数据 :1 创建服务器端的Socket对象 : ServerSocket类ServerSocket(int port)  : 构造方法需要绑定一个端口号 , port就是端口号2 监听客户端连接,并接受连接,返回一个Socket对象Socket accept() : 该方法会一直阻塞直到建立连接3 获取网络中的输入流,用来读取客户端发送过来的数据InputStream getInputStream()4 释放资源 : 服务端一般不会关闭void close()*/
public class ServerDemo {public static void main(String[] args) throws IOException {
//        1 创建服务器端的Socket对象 : ServerSocket类
//        ServerSocket(int port)  : 构造方法需要绑定一个端口号 , port就是端口号ServerSocket serverSocket = new ServerSocket(10010);//        2 监听客户端连接,并接受连接,返回一个Socket对象
//        Socket accept() : 该方法会一直阻塞直到建立连接Socket socket = serverSocket.accept();
//
//        3 获取网络中的输入流,用来读取客户端发送过来的数据
//        InputStream getInputStream()InputStream is = socket.getInputStream();int by;System.out.println("read方法执行前");while ((by = is.read()) != -1) {System.out.print((char) by);}System.out.println("read方法执行后");}
}

2.3 TCP通信原理分析

在这里插入图片描述

2.4 TCP三次握手

在这里插入图片描述

2.5 TCP练习1

package com.lystar.tcp_demo.test1;import java.io.*;
import java.net.Socket;/*客户端 :发送数据的步骤1 创建客户端的Socket对象 : Socket(String host, int port) 与指定服务端连接参数说明:host 表示服务器端的主机名,也可以是服务器端的IP地址,只不过是String类型的port 表示服务器端的端口2 通获Socket对象取网络中的输出流,写数据OutputStream getOutputStream​()3 释放资源void close​()*/
public class ClientDemo {public static void main(String[] args) throws IOException {// 创建客户端的Socket对象(Socket) 与指定服务端连接Socket socket = new Socket("127.0.0.1", 10010);// 通获Socket对象取网络中的输出流,写数据OutputStream os = socket.getOutputStream();os.write("hello".getBytes());// 像服务端写入结束标记socket.shutdownOutput();BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = br.readLine();System.out.println(line);// 释放资源br.close();os.close();socket.close();}
}
package com.lystar.tcp_demo.test1;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*服务端接收数据 :1 创建服务器端的Socket对象 : ServerSocket类ServerSocket​(int port)  : 构造方法需要绑定一个端口号 , port就是端口号2 监听客户端连接,并接受连接,返回一个Socket对象Socket accept​() : 该方法会一直阻塞直到建立连接3 获取网络中的输入流,用来读取客户端发送过来的数据InputStream getInputStream​()4 释放资源 : 服务端一般不会关闭void close​()*/
public class ServerDemo {public static void main(String[] args) throws IOException {
//        1 创建服务器端的Socket对象 : ServerSocket类
//        ServerSocket​(int port)  : 构造方法需要绑定一个端口号 , port就是端口号ServerSocket serverSocket = new ServerSocket(10010);//        2 监听客户端连接,并接受连接,返回一个Socket对象
//        Socket accept​() : 该方法会一直阻塞直到建立连接Socket socket = serverSocket.accept();
//
//        3 获取网络中的输入流,用来读取客户端发送过来的数据
//        InputStream getInputStream​()InputStream is = socket.getInputStream();int by;while ((by = is.read()) != -1) {System.out.print((char) by);}BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bos.write("你谁啊");bos.close();is.close();socket.close();serverSocket.close();}
}

2.6 TCP练习2

package com.lystar.tcp_demo.test2;import java.io.*;
import java.net.Socket;public class ClientDemo {public static void main(String[] args) throws IOException {// 创建客户端Socket对象Socket socket = new Socket("127.0.0.1", 10086);BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\传智播客\\安装包\\好看的图片\\liqin.jpg"));BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());int by;while ((by = bis.read()) != -1) {// 从本地中读一个字节bos.write(by);// 往服务器写一个字节bos.flush();}// 写结束标记socket.shutdownOutput();// 把网络中的字节输入流 , 封装成高效的字符输入流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//        String line;
//        while ((line = br.readLine()) != null) {
//            System.out.println(line);
//        }String msg = br.readLine();// 读到换行才叫读到一行, 所以必须写服务器必须写newLineSystem.out.println(msg);// 释放资源bis.close();socket.close();}
}
package com.lystar.tcp_demo.test2;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo {public static void main(String[] args) throws IOException {// 创建服务端的连接对象ServerSocket serverSocket = new ServerSocket(10086);Socket socket = null;BufferedInputStream bis = null;BufferedWriter socketBw = null;while (true) {// 获取Socket对象socket = serverSocket.accept();// 获取网络中的字节输入流  在封装成高效的字节输入流对象bis = new BufferedInputStream(socket.getInputStream());// 创建本地的字节输出流 , 封装成高效的字节输出流BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("day13_demo\\图片\\a.jpg"));int by;while ((by = bis.read()) != -1) {bw.write(by);bw.flush();}//关闭本地流bw.close();// 获取网络中的字节输出流 , 封装成高效的字符输出流socketBw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));socketBw.write("谢谢你");socketBw.newLine();// 必须有换行 , 因为readLine读到换行结束socketBw.flush();}// 释放资源
//        socketBw.close();
//        bis.close();
//        socket.close();
//        serverSocket.close();}
}

2.7 TCP练习3

package com.lystar.tcp_demo.test3;import java.io.*;
import java.net.Socket;public class ClientDemo {public static void main(String[] args) throws IOException {// 创建客户端Socket对象Socket socket = new Socket("127.0.0.1", 10086);BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\传智播客\\安装包\\好看的图片\\liqin.jpg"));BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());int by;while ((by = bis.read()) != -1) {// 从本地中读一个字节bos.write(by);// 往服务器写一个字节bos.flush();}// 写结束标记socket.shutdownOutput();// 把网络中的字节输入流 , 封装成高效的字符输入流BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//        String line;
//        while ((line = br.readLine()) != null) {
//            System.out.println(line);
//        }String msg = br.readLine();// 读到换行才叫读到一行, 所以必须写服务器必须写newLineSystem.out.println(msg);// 释放资源bis.close();socket.close();}
}
package com.lystar.tcp_demo.test3;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ServerDemo {public static void main(String[] args) throws IOException {// 创建服务端的连接对象ServerSocket serverSocket = new ServerSocket(10086);ExecutorService executorService = Executors.newFixedThreadPool(10);while (true) {// 获取Socket对象Socket socket = serverSocket.accept();executorService.submit(new ServerThread(socket));}// 释放资源
//        socketBw.close();
//        bis.close();
//        socket.close();
//        serverSocket.close();}
}
package com.lystar.tcp_demo.test3;import javax.management.relation.RoleUnresolved;
import java.io.*;
import java.net.Socket;
import java.util.UUID;public class ServerThread implements Runnable {Socket socket = null;BufferedOutputStream bw = null;public ServerThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {// 获取网络中的字节输入流  在封装成高效的字节输入流对象BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());// 创建本地的字节输出流 , 封装成高效的字节输出流bw = new BufferedOutputStream(new FileOutputStream("day13_demo\\图片\\" + UUID.randomUUID() + ".jpg"));int by;while ((by = bis.read()) != -1) {bw.write(by);bw.flush();}// 获取网络中的字节输出流 , 封装成高效的字符输出流BufferedWriter socketBw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));socketBw.write("谢谢你");socketBw.newLine();// 必须有换行 , 因为readLine读到换行结束socketBw.flush();} catch (IOException e) {e.printStackTrace();} finally {//关闭本地流try {bw.close();} catch (IOException e) {e.printStackTrace();}}}
}

3 单例设计模式

学习目标

  • 能够使用单例设计模式设计代码

内容讲解

  • 正常情况下一个类可以创建多个对象
public static void main(String[] args) {// 正常情况下一个类可以创建多个对象Person p1 = new Person();Person p2 = new Person();Person p3 = new Person();
}
  • 如果说有时一个对象就能搞定的事情 , 非要创建多个对象 , 浪费内存!!!
3.1 单例设计模式的作用
  • 单例模式,是一种常用的软件设计模式。通过单例模式可以保证项目中,应用该模式的这个类只有一个实例。

    即一个类只有一个对象实例。

  • 好处 :可以节省内存,共享数据

3.2 单例设计模式实现步骤
  1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
  2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量。
  3. 定义一个静态方法返回这个唯一对象。
3.3 单例设计模式的类型

根据创建对象的时机单例设计模式又分为以下两种:

  1. 饿汉单例设计模式

  2. 懒汉单例设计模式

3.4 饿汉单例设计模式
  • 饿汉单例设计模式就是使用类的时候已经将对象创建完毕

    不管以后会不会使用到该实例化对象,先创建了再说。很着急的样子,故被称为“饿汉模式”。

  • 代码如下:

    public class Singleton {// 1.将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。private Singleton() {}// 2.在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量。private static final Singleton instance = new Singleton();// 3.定义一个静态方法返回这个唯一对象。public static Singleton getInstance() {return instance;}
    }
    
  • 需求:定义一个皇帝类,要求对象只能存在一个。

    package com.lystar.singledesign;
    /*需求 : 使用单例模式(饿汉式) , 要求此类只能有一个对象步骤 :1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量。3. 定义一个静态方法返回这个唯一对象。*/
    public class King {// 1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。private King(){}// 2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量。private static final King KING = new King();// 3. 定义一个静态方法返回这个唯一对象。public static King getInstance(){return KING;}
    }
    
3.5 懒汉单例设计模式
  • 懒汉单例设计模式就是调用getInstance()方法时对象才被创建

    也就是说先不急着实例化出对象,等要用的时候才实例化出对象。不着急,故称为“懒汉模式”。

    代码如下:

public class Singleton {// 1.将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。private Singleton() {}// 2.在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。private static Singleton instance;// 0x001// 3.定义一个静态方法返回这个唯一对象。要用的时候才例化出对象public static synchronized Singleton getInstance() {if(instance == null) {instance = new Singleton();}return instance;}
}
  • 注意 :
    • 懒汉单例设计模式在多线程环境下可能会实例化出多个对象,不能保证单例的状态,所以加上关键字:synchronized,保证其同步安全。
  • 需求:使用懒汉单例 ,改写皇帝类的单例模式

    package com.lystar.singledesign;/*需求 : 使用单例模式(懒汉式) , 要求此类只能有一个对象步骤 :1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。2. 在该类内部定义一个private static修饰的成员变量 . 此变量不需要赋值3. 定义一个静态方法返回这个唯一对象。 此方法需要加上synchronized关键字保证在多线程中也只有一个实例对象*/
    public class King2 {// 1. 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。private King2() {}// 2. 在该类内部定义一个private static修饰的成员变量 . 此变量不需要赋值private static King2 king;// null// 3. 定义一个静态方法返回这个唯一对象。 此方法需要加上synchronized关键字保证在多线程中也只有一个实例对象public static synchronized King2 getInstance() {if (king == null) {king = new King2();}return king;}
    }
    
知识小结
  • 单例模式可以保证系统中一个类只有一个对象实例。

  • 实现单例模式的步骤:

    • 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
    • 在该类内部产生一个唯一的实例化对象,并且将其封装为private static类型的成员变量。
    • 定义一个静态方法返回这个唯一对象。

4 多例设计模式

学习目标

  • 能使用多例设计模式设计代码

内容讲解

4.1 多例设计模式的作用
  • 多例模式,是一种常用的设计模式之一。通过多例模式可以保证项目中,应用该模式的类有固定数量的实例

    多例类要自我创建并管理自己的实例,还要向外界提供获取本类实例的方法。

  • 使用场景:线程池

    线程池 = Executors.newFixedThreadPool(3);
    
4.2.实现步骤

​ 1.创建一个类, 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。

​ 2.在类中定义该类被创建对象的总数量

​ 3.在类中定义存放类实例的list集合

​ 4.在类中提供静态代码块,在静态代码块中创建类的实例

​ 5.提供获取类实例的静态方法

4.3.实现代码
  • 某一个学科有固定3位老师,年级中上该课程的老师就是这三位老师其中一位

    要求使用多例模式 ,每次获取的都是这三位老师其中一位

package com.lystar.moreinstance_demo;import com.lystar.homework.work.Student;import java.util.ArrayList;
import java.util.Random;/*需求  : 某一个学科有固定3位老师,年级中上该课程的老师就是这三位老师其中一位要求使用多例模式 ,每次获取的都是这三位老师其中一位实现步骤 :1.创建一个类,  将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。2.在类中定义该类被创建对象的总数量3.在类中定义存放类实例的list集合4.在类中提供静态代码块,在静态代码块中创建类的实例5.提供获取类实例的静态方法*/
public class Teacher {// 1.创建一个类,  将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。private Teacher() {}// 2.在类中定义该类被创建对象的总数量private static int count = 3;// 3.在类中定义存放类实例的list集合private static ArrayList<Teacher> list = new ArrayList<>();// 4.在类中提供静态代码块,在静态代码块中创建类的实例static {for (int i = 0; i < count; i++) {list.add(new Teacher());}}// 5.提供获取类实例的静态方法public static Teacher getInstance() {int index = new Random().nextInt(count);// [0,3)return list.get(index);}}
4.4 小结
  • 多例模式作用 : 可以保证项目中一个类有固定个数的实例, 在实现需求的基础上, 能够提高实例的复用性.

    实现多例模式的步骤 :

    • 创建一个类, 将构造方法私有化,使其不能在类的外部通过new关键字实例化该类对象。
    • 在类中定义该类被创建的总数量
    • 在类中定义存放类实例的list集合
    • 在类中提供静态代码块,在静态代码块中创建类的实例
    • 提供获取类实例的静态方法

5 工厂设计模式

学习目标

  • 能够使用工厂设计模式设计代码

内容讲解

5.1 概述
  • 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。之前我们创建类对象时, 都是使用 new 对象的形式创建, 除new 对象方式以外, 工厂模式也可以创建对象.
5.2 作用
  • 解决类与类之间的耦合问题
5.3案例实践
  • 需求:定义汽车工厂类,生产各种品牌的车

  • 实现步骤

    • 编写一个Car接口, 提供run方法
    • 编写一个Falali类实现Car接口,重写run方法
    • 编写一个Benchi类实现Car接口,重写run方法
    • 提供一个CarFactory(汽车工厂),用于生产汽车对象
    • 定义CarFactoryTest测试汽车工厂

实现代码

package com.lystar.factorydesign_demo;/*- 需求:定义汽车工厂类,生产各种品牌的车- 实现步骤- 编写一个Car接口, 提供run方法- 编写一个Falali类实现Car接口,重写run方法- 编写一个Benchi类实现Car接口- 提供一个CarFactory(汽车工厂),用于生产汽车对象- 定义CarFactoryTest测试汽车工厂*/
public class CarTest {public static void main(String[] args) {Car car = CarFactory.getInstance(CarBrand.FALALI);car.run();}
}// 定义车的品牌枚举
enum CarBrand {// 枚举项FALALI, BENCHI, DAZHONG, BAOMA;
}// 生产汽车对象的工厂
class CarFactory {// 私有构造private CarFactory() {}public static Car getInstance(CarBrand brand) {switch (brand) {case FALALI:return new Falali(1);case BENCHI:return new Benchi();default:return null;}}
} 生产汽车对象的工厂
//class CarFactory {
//    // 私有构造
//    private CarFactory() {
//    }
//
//    public static Car getInstance(String brand) {
//        switch (brand) {
//            case "Falali":
//                return new Falali(1);
//            case "Benchi":
//                return new Benchi();
//            default:
//                return null;
//        }
//    }
//}// 编写一个Car接口, 提供run方法
interface Car {public abstract void run();
}class Falali implements Car {public Falali(int num) {}@Overridepublic void run() {System.out.println("法拉利破百需要3秒!");}
}class Benchi implements Car {@Overridepublic void run() {System.out.println("奔驰破百需要5秒!");}
}

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

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

相关文章

【Python数据结构与判断1/7】复杂的多向选择

目录 导入 举个栗子 代码优化 elif 栗子 执行顺序 情况一 情况二 情况三 if-elif-else特性 三种判断语句小结 if if-else if-elif-else 嵌套语句 if嵌套 栗子 执行顺序 相互嵌套 Tips Debug 总结 导入 在前面&#xff0c;我们学习了单向选择的if语句和多项…

第四节:SashulinMessageBroker的团队协作

SMB工程可以通过git或svn等工具进行管理。除此外&#xff0c;SMB也提供了云代码管理功能。实际效果如图&#xff1a; 一、准备工作 1、代码管理相关的表结构 以下是云代码管理表结构&#xff0c;在mysql中运行。 -- Create syntax for TABLE sc_flow CREATE TABLE sc_flow (…

数据结构与算法:链式二叉树

上一篇文章我们结束了二叉树的顺序存储&#xff0c;本届内容我们来到二叉树的链式存储&#xff01; 链式二叉树 1.链式二叉树的遍历1.1二叉树的前序&#xff0c;中序&#xff0c;后序遍历1.2 三种遍历方法代码实现 2. 获取相关个数2.1获取节点个数2.2获取叶节点个数2.3 获取树的…

《软件安装与使用教程》— Git 在Windows的安装教程

目录 Git在Windows安装教程1 获得安装包2 解压文件3 注意事项4 安装步骤4.1 运行安装程序4.2 声明许可4.3 选择安装路径4.4 选择需要安装的组件4.5 选择开始菜单4.6 选择默认编辑器4.7 选择PATH环境4.8 选择HTTPS后端传输4.9 配置行尾巴符转换4.10 配置Git Bash终端仿真器4.11 …

NLP 算法实战项目:使用 BERT 进行模型微调,进行文本情感分析

本篇我们使用公开的微博数据集(weibo_senti_100k)进行训练&#xff0c;此数据集已经进行标注&#xff0c;0: 负面情绪&#xff0c;1:正面情绪。数据集共计82718条(包含标题)。如下图&#xff1a; 下面我们使用bert-base-chinese预训练模型进行微调并进行测试。 技术交流&#x…

STC89C52串口通信详解

目录 前言 一.通信基本原理 1.1串行通信与并行通信 1.2同步通信和异步通信 1.2.1异步通信 1.2.2同步通信 1.3单工、半双工与全双工通信 1.4通信速率 二.串口通信简介 2.1接口标准 2.2串口内部结构 2.3串口相关寄存器 三.串口工作方式 四.波特率计算 五.串口初始化步骤 六.实验…

万界星空科技MES系统中的车间管理的作用

在了解mes生产管理系统的作用包括哪些方面之前&#xff0c;我们先来了解一下作为生产管理信息化的关键部分&#xff0c;车间管理系统包含哪几个部分&#xff1a;一、mes系统中的车间管理通常包含以下部分&#xff1a; 1、设备管理&#xff1a;用于监控车间内的设备状态&#xf…

新规正式发布 | 百度深度参编《生成式人工智能服务安全基本要求》

2024年2月29日&#xff0c;全国网络安全标准化技术委员会&#xff08; TC260 &#xff09;正式发布《生成式人工智能服务安全基本要求》&#xff08;以下简称《基本要求》&#xff09;。《基本要求》规定了生成式人工智能服务在安全方面的基本要求&#xff0c;包括语料安全、模…

springboot整合shiro的实战教程(二)

文章目录 整合思路1.创建springboot项目2.引入依赖3.创建Shiro Filter0.创建配置类1.配置shiroFilterFactoryBean2.配置WebSecurityManager3.创建自定义Relm4.配置自定义realm5.编写控制器跳转至index.html6.加入资源的权限控制7. 常见过滤器 登录认证实现登录界面开发controll…

目标网站屏蔽右键检查(使用开发者工具)

问题&#xff1a; 通过网络触手中想要获取某网站的数据出现&#xff1a;鼠标右击&#xff0c;或按ctrl F10 键 无反应&#xff08;也就是打不开类似谷歌的开发工具&#xff09; 问题同等与&#xff1a; 解决网页屏蔽F12或右键打开审查元素 引用&#xff1a; 作者&#xff…

C/C++ BM19 寻找峰值

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 这道题第一遍做的时候题目条件没有好好的审阅&#xff0c;导致在判断边界问题的时候出了不少岔子。 我的方法是时间复杂度为O(N)的&#xff0c;官方的logN可能更好一些。我的就是简…

启发式算法:遗传算法

文章目录 遗传算法-引例交叉变异遗传算法遗传算法流程遗传算法应用遗传算法-引例 在一代代演化过程中,父母扇贝的基因组合产生新扇贝,所以遗传算法会选择两个原有的扇贝,然后对这两个扇贝的染色体进行随机交叉形成新的扇贝。迭代演化也会造成基因突变,遗传算法让新产生扇贝…

Mysql索引底层数据结构

Mysql索引底层数据结构 一、数据结构1.1.索引的本质1.2.MySQl特点1.3.索引数据结构1.4.B-Tree结构1.5.BTree结构1.6.查看mysql文件页大小&#xff08;16K&#xff09;1.7.为什么mysql页文件默认16K&#xff1f;1.8.Hash结构 二、存储引擎2.1.InnoDB2.1.1.聚集索引2.1.2.为什么建…

力扣:数组篇

1、数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 需要两点注意的是 数组下标都是从0开始的。数组内存空间的地址是连续的 因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添元素的时候&#xff0c;就难免要移动其他元素的地址。 …

【你也能从零基础学会网站开发】Web建站之javascript入门篇 JavaScript中的表达式、运算符、位运算、递增递减

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 JavaScript…

kali当中不同的python版本切换(超简单)

kali当中本身就是自带两个python版本的 配置 update-alternatives --install /usr/bin/python python /usr/bin/python2 100 update-alternatives --install /usr/bin/python python /usr/bin/python3 150 切换版本 update-alternatives --config python 0 1 2编号选择一个即可…

【MySQL篇】 MySQL基础学习

文章目录 前言基础数据类型DDL数据库操作查询数据库创建数据库删除数据库使用数据库 DDL表操作创建表查询表修改表删除 DML-增删改添加数据更改数据删除数据 DQL-查询基础查询条件查询聚合函数分组查询排序查询分页查询编写顺序 DML-用户及权限用户管理权限控制 函数字符串函数…

挑战杯 基于设深度学习的人脸性别年龄识别系统

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习机器视觉的…

浅谈2024 年 AI 辅助研发趋势!

目录 ​编辑 引言 一、AI辅助研发现状 1. 技术发展 2. 工具集成 3. 应用场景 二、AI辅助研发趋势 1. 更高的自动化程度 2. 更高的智能化程度 3. 更多的领域应用 4. 更高的重视度 三、结论 四. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff…

(南京观海微电子)——I3C协议介绍

特点 两线制总线&#xff1a;I2C仅使用两条线——串行数据线&#xff08;SDA&#xff09;和串行时钟线&#xff08;SCL&#xff09;进行通信&#xff0c;有效降低了连接复杂性。多主多从设备支持&#xff1a;I2C支持多个主设备和多个从设备连接到同一总线上。每个设备都有唯一…