Day(21)--网络编程

news2025/4/19 12:59:28

网络编程

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

  • 应用场景:即使通信、网友对战、金融证券等等,不管是什么场景,都是计算机和计算机之间通过网络进行的数据传输

  • java.net

常见的软件架构

C/S(Client/Server,客户端 / 服务器)架构和 B/S(Browser/Server,浏览器 / 服务器)架构是软件开发中两种常见的软件架构模式,下面为你详细介绍:

C/S 架构

概念

C/S 架构将应用程序分为客户端和服务器两部分。客户端是用户直接交互的界面,负责处理用户的输入和显示结果;服务器则负责处理客户端的请求,提供数据存储和业务逻辑处理等服务。客户端和服务器之间通过网络进行通信。

优点
  • 性能较高:客户端可以在本地处理部分业务逻辑,减少了与服务器的通信次数,因此在处理大量数据和复杂业务时性能较好。

  • 用户体验好:可以根据用户的需求定制客户端界面和功能,提供更加个性化的用户体验。

  • 安全性高:客户端和服务器之间的通信可以采用加密技术,数据存储在服务器端,相对比较安全。

缺点
  • 维护成本高:客户端需要安装和维护,当软件更新时,需要对每个客户端进行更新,工作量较大。

  • 可扩展性差:当用户数量增加或业务需求变化时,需要对客户端和服务器进行相应的升级和扩展,难度较大。

  • 跨平台性差:不同操作系统的客户端需要开发不同的版本,增加了开发成本。

适用场景
  • 对性能要求较高的应用,如大型游戏、图形处理软件等。

  • 对数据安全性要求较高的应用,如银行的网上银行系统、企业的内部办公系统等。

B/S 架构

概念

B/S 架构是一种基于 Web 技术的架构模式,用户通过浏览器访问服务器上的应用程序。服务器负责处理所有的业务逻辑和数据存储,浏览器只负责显示页面和与用户进行交互。

优点
  • 易于维护:只需要对服务器进行维护和更新,用户不需要安装任何客户端软件,通过浏览器即可访问应用程序。

  • 可扩展性好:服务器可以根据用户数量和业务需求进行灵活的扩展,如增加服务器数量、升级服务器配置等。

  • 跨平台性好:只要有浏览器的设备都可以访问应用程序,不受操作系统的限制。

缺点
  • 性能相对较低:所有的业务逻辑都在服务器端处理,浏览器只负责显示页面,因此在处理大量数据和复杂业务时性能相对较低。

  • 用户体验受浏览器限制:不同浏览器对页面的渲染效果可能会有所不同,用户体验可能会受到一定的影响。

  • 安全性相对较低:由于浏览器是开放的,容易受到网络攻击,如 SQL 注入、XSS 攻击等。

适用场景
  • 对维护成本要求较低、用户数量较多的应用,如电子商务网站、社交网络平台等。

  • 对跨平台性要求较高的应用,如在线办公系统、在线教育平台等。

以下是一个简单的 Java 示例,分别展示 C/S 架构和 B/S 架构的基本实现。

C/S 架构示例

客户端代码:

java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
​
public class CSClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 8888);
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            out.println("Hello, Server!");
            String response = in.readLine();
            System.out.println("Server response: " + response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器端代码:

java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
​
public class CSServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8888)) {
            System.out.println("Server is listening on port 8888");
            try (Socket socket = serverSocket.accept();
                 PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
                String inputLine = in.readLine();
                System.out.println("Client message: " + inputLine);
                out.println("Hello, Client!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

B/S 架构示例(使用 Spring Boot)

创建一个简单的 Spring Boot 项目,包含一个控制器类:

java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
​
@SpringBootApplication
@RestController
public class BSApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(BSApplication.class, args);
    }
​
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

运行该 Spring Boot 应用程序后,在浏览器中访问 http://localhost:8080/hello 即可看到返回的信息。

网络编程三要素

网络编程三要素分别是 IP 地址、端口号和传输协议,以下为你详细介绍:

1. IP 地址

概念

IP 地址是互联网协议地址(Internet Protocol Address)的缩写,它是分配给网络上使用网际协议的设备的数字标签,其作用是唯一标识网络中的设备,就像现实生活中的家庭住址一样,通过 IP 地址可以在网络中找到对应的设备。

分类
  • IPv4:由 32 位二进制数组成,通常用点分十进制表示,例如192.168.1.1。IPv4 地址数量有限,目前已经基本分配完毕。

  • IPv6:为了解决 IPv4 地址不足的问题而推出的新一代 IP 协议,由 128 位二进制数组成,通常用冒号分隔的十六进制数表示,例如2001:0db8:85a3:0000:0000:8a2e:0370:7334

相关代码示例(Java 获取本地 IP 地址)

java

import java.net.InetAddress;
import java.net.UnknownHostException;
​
public class GetLocalIP {
    public static void main(String[] args) {
        try {
            InetAddress localHost = InetAddress.getLocalHost();
            System.out.println("本地IP地址: " + localHost.getHostAddress());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

2. 端口号

概念

端口号是一个 16 位的整数,范围从 0 到 65535。它的作用是标识设备上的应用程序或服务,一台设备上可能同时运行多个网络应用程序,通过端口号可以区分不同的应用程序,从而将数据准确地发送到对应的应用程序。

分类
  • 系统端口(0 - 1023):这些端口被系统保留,用于一些知名的服务,例如 HTTP 服务使用的端口号是 80,HTTPS 服务使用的端口号是 443。

  • 注册端口(1024 - 49151):这些端口通常由用户程序或服务注册使用,例如 MySQL 数据库默认使用的端口号是 3306。

  • 动态端口(49152 - 65535):这些端口用于临时分配给客户端程序,当客户端程序与服务器建立连接时,系统会从动态端口中分配一个端口号给客户端使用。

相关代码示例(Java 使用指定端口创建服务器)

java

import java.io.IOException;
import java.net.ServerSocket;
​
public class ServerWithPort {
    public static void main(String[] args) {
        try {
            int port = 8888;
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("服务器已启动,监听端口: " + port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 传输协议

概念

传输协议是指在网络中传输数据时所遵循的规则和约定,它定义了数据的传输格式、传输方式、错误处理等内容。不同的传输协议适用于不同的应用场景。

常见传输协议
  • TCP(Transmission Control Protocol,传输控制协议):是一种面向连接的、可靠的、基于字节流的传输协议。在进行数据传输之前,需要先建立连接,传输完成后再断开连接。TCP 协议通过确认机制、重传机制等保证数据的可靠传输,适用于对数据准确性要求较高的场景,例如文件传输、电子邮件等。

  • UDP(User Datagram Protocol,用户数据报协议):是一种无连接的、不可靠的传输协议。它不需要建立连接,直接将数据发送出去,不保证数据的可靠传输,可能会出现数据丢失、乱序等情况。UDP 协议的传输效率较高,适用于对实时性要求较高的场景,例如视频会议、在线游戏等。

相关代码示例(Java 使用 TCP 协议实现简单的客户端和服务器通信)

服务器端代码

java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
​
public class TCPServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8888)) {
            System.out.println("服务器已启动,等待客户端连接...");
            try (Socket socket = serverSocket.accept();
                 PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
                String inputLine = in.readLine();
                System.out.println("客户端消息: " + inputLine);
                out.println("Hello, Client!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端代码

java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
​
public class TCPClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 8888);
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            out.println("Hello, Server!");
            String response = in.readLine();
            System.out.println("服务器响应: " + response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4 IP

  • ip的作用,设备在网络中的地址,是唯一的标识

  • IPv4:目前的主流方案,最多只有2^23次方个ip,目前已经用完了

  • IPv6:为了解决IPv4不够用而出现的,最多可以有2^128次方个ip

  • 利用局域网IP解决IP 不够用的问题

Inetaddress类

在 Java 中,InetAddress 类属于 java.net 包,它的主要功能是表示互联网协议(IP)地址。下面详细介绍该类的一些关键知识点:

1. 类的特点

InetAddress 类是一个抽象类,这意味着不能直接使用 new 关键字来创建它的实例。不过,它提供了多个静态方法来获取 InetAddress 实例。

2. 获取 InetAddress 实例

  • 通过主机名获取:可以使用 getByName(String host) 方法,该方法会返回一个表示指定主机名的 InetAddress 对象。

java

import java.net.InetAddress;
import java.net.UnknownHostException;
​
public class InetAddressExample {
    public static void main(String[] args) {
        try {
            InetAddress address = InetAddress.getByName("www.example.com");
            System.out.println(address);
        } catch (UnknownHostException e) {
            System.out.println("无法解析主机名: " + e.getMessage());
        }
    }
}
  • 获取本地主机地址:使用 getLocalHost() 方法,它会返回一个表示本地主机的 InetAddress 对象。

java

import java.net.InetAddress;
import java.net.UnknownHostException;

public class LocalHostExample {
    public static void main(String[] args) {
        try {
            InetAddress localHost = InetAddress.getLocalHost();
            System.out.println("本地主机地址: " + localHost);
        } catch (UnknownHostException e) {
            System.out.println("无法获取本地主机地址: " + e.getMessage());
        }
    }
}
  • 通过 IP 地址获取:使用 getByAddress(byte[] addr) 方法,该方法会返回一个表示指定 IP 地址的 InetAddress 对象。

java

import java.net.InetAddress;
import java.net.UnknownHostException;
​
public class ByAddressExample {
    public static void main(String[] args) {
        try {
            byte[] ip = {127, 0, 0, 1};
            InetAddress address = InetAddress.getByAddress(ip);
            System.out.println(address);
        } catch (UnknownHostException e) {
            System.out.println("无法解析 IP 地址: " + e.getMessage());
        }
    }
}

3. 常用方法

  • getHostName():返回此 IP 地址的主机名。

java

import java.net.InetAddress;
import java.net.UnknownHostException;

public class GetHostNameExample {
    public static void main(String[] args) {
        try {
            InetAddress address = InetAddress.getByName("www.example.com");
            String hostName = address.getHostName();
            System.out.println("主机名: " + hostName);
        } catch (UnknownHostException e) {
            System.out.println("无法解析主机名: " + e.getMessage());
        }
    }
}
  • getHostAddress():返回此 IP 地址的字符串表示形式。

java

import java.net.InetAddress;
import java.net.UnknownHostException;

public class GetHostAddressExample {
    public static void main(String[] args) {
        try {
            InetAddress address = InetAddress.getByName("www.example.com");
            String hostAddress = address.getHostAddress();
            System.out.println("IP 地址: " + hostAddress);
        } catch (UnknownHostException e) {
            System.out.println("无法解析主机名: " + e.getMessage());
        }
    }
}
  • isReachable(int timeout):测试是否可以达到该地址。该方法会尝试与该地址建立连接,如果在指定的超时时间内成功建立连接,则返回 true,否则返回 false

java

import java.net.InetAddress;
import java.io.IOException;
​
public class IsReachableExample {
    public static void main(String[] args) {
        try {
            InetAddress address = InetAddress.getByName("www.example.com");
            boolean isReachable = address.isReachable(5000);
            System.out.println("是否可以到达: " + isReachable);
        } catch (IOException e) {
            System.out.println("发生 I/O 错误: " + e.getMessage());
        }
    }
}

4. 子类

Inet4AddressInet6AddressInetAddress 的具体子类,分别代表 IPv4 和 IPv6 地址。你可以使用 instanceof 运算符来判断一个 InetAddress 对象是 IPv4 还是 IPv6 地址。

java

import java.net.InetAddress;
import java.net.UnknownHostException;

public class SubclassExample {
    public static void main(String[] args) {
        try {
            InetAddress address = InetAddress.getByName("www.example.com");
            if (address instanceof java.net.Inet4Address) {
                System.out.println("这是一个 IPv4 地址");
            } else if (address instanceof java.net.Inet6Address) {
                System.out.println("这是一个 IPv6 地址");
            }
        } catch (UnknownHostException e) {
            System.out.println("无法解析主机名: " + e.getMessage());
        }
    }
}

综上所述,InetAddress 类为 Java 程序与网络地址的交互提供了方便的方式,通过它可以轻松地进行主机名解析、IP 地址获取以及网络可达性测试等操作。

端口号

  • 是应用程序在设备中唯一的标识

  • 端口号:

    1. 由两个字节表示的整数,取值范围是0~65535

    2. 其0~1023之间的端口用于一些知名的网络网络服务或者应用

    3. 我们自己使用1024以上的端口号就可以了

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

网络编程中的协议知识点整理

一、网络协议概述

网络协议是计算机网络中进行数据交换而建立的规则、标准或约定的集合。它规定了数据传输的格式、传输顺序、错误处理等方面的内容,确保不同设备之间能够准确、可靠地进行通信。

二、常见网络协议层次模型

1. OSI 七层模型
  • 物理层:负责传输比特流,规定了传输介质、接口类型、信号编码等物理特性。例如,以太网的网线接口、光纤的传输标准等。

  • 数据链路层:将物理层接收到的比特流封装成帧,进行差错检测和流量控制。常见协议有以太网协议(Ethernet),用于局域网中设备之间的通信。

  • 网络层:负责将帧从源节点传输到目标节点,进行路由选择和寻址。主要协议有 IP(Internet Protocol)协议,包括 IPv4 和 IPv6。

  • 传输层:提供端到端的可靠通信,确保数据的正确传输。常见协议有 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)。

  • 会话层:负责建立、管理和终止会话,协调不同应用程序之间的通信。例如,RPC(Remote Procedure Call)协议。

  • 表示层:处理数据的表示和转换,如加密、解密、压缩、解压缩等。例如,SSL/TLS 协议用于数据加密传输。

  • 应用层:为用户提供应用程序接口,直接面向用户的应用程序。常见协议有 HTTP(Hypertext Transfer Protocol)、FTP(File Transfer Protocol)、SMTP(Simple Mail Transfer Protocol)等。

2. TCP/IP 四层模型
  • 网络接口层:对应 OSI 模型的物理层和数据链路层,负责将数据帧在物理网络上传输。

  • 网际层:与 OSI 模型的网络层功能相似,主要协议是 IP 协议。

  • 传输层:和 OSI 模型的传输层相同,提供 TCP 和 UDP 协议。

  • 应用层:包含了 OSI 模型的会话层、表示层和应用层的功能,常见协议有 HTTP、FTP、SMTP 等。

三、常见网络协议详解

1. IP 协议
  • 功能:为网络中的设备分配唯一的 IP 地址,实现数据包的路由和转发。

  • 版本

    • IPv4:采用 32 位地址,地址数量有限,格式为点分十进制,如 192.168.1.1

    • IPv6:采用 128 位地址,解决了 IPv4 地址不足的问题,格式为冒分十六进制,如 2001:0db8:85a3:0000:0000:8a2e:0370:7334

2. TCP 协议
  • 特点:面向连接、可靠传输、基于字节流。在传输数据之前,需要先建立连接(三次握手),传输完成后需要断开连接(四次挥手)。

  • 三次握手

    1. 客户端向服务器发送 SYN 包,请求建立连接。

    2. 服务器收到 SYN 包后,向客户端发送 SYN + ACK 包,表示同意建立连接。

    3. 客户端收到 SYN + ACK 包后,向服务器发送 ACK 包,连接建立成功。

  • 四次挥手(:确保连接断开,且数据处理完毕)

    1. 客户端向服务器发送 FIN 包,表示请求关闭连接。

    2. 服务器收到 FIN 包后,向客户端发送 ACK 包,表示同意关闭连接。

    3. 服务器向客户端发送 FIN 包,表示请求关闭连接。

    4. 客户端收到 FIN 包后,向服务器发送 ACK 包,表示同意关闭连接。

3. UDP 协议
  • 特点:无连接、不可靠传输、基于数据报。不需要建立连接,直接发送数据,传输效率高,但不能保证数据的可靠到达。适用于对实时性要求较高、对数据准确性要求较低的场景,如视频直播、在线游戏等。

  • 三种通信方式

    • 单播

      • 下面聊天室的代码就是单播

    • 组播

      • 组播地址:224.0.0.0~239.255.255.255

        • 其中224.0.0.0~224.0.0255 位预留的组播地址

    • 广播

      • 广播地址255.255.255.255

  • 以下是用 Java 语言实现该聊天室功能的代码示例及解析:

    发送端代码(Sender.java)

    java

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.*;
    ​
    public class Sender {
        public static void main(String[] args) throws IOException {
            // 创建DatagramSocket对象用于发送数据报
            DatagramSocket ds = new DatagramSocket();
    ​
            // 创建BufferedReader用于从键盘读取输入
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String line;
            while (true) {
                line = br.readLine();
                // 判断是否输入886,如果是则结束发送
                if ("886".equals(line)) {
                    break;
                }
                // 将输入的字符串转换为字节数组
                byte[] bys = line.getBytes();
                // 创建DatagramPacket对象,指定发送的数据、长度、目标地址和端口
                DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("localhost"), 12345);
                // 发送数据报
                ds.send(dp);
            }
            // 关闭资源
            ds.close();
        }
    }

    接收端代码(Receiver.java)

    java

    import java.io.IOException;
    import java.net.*;
    ​
    public class Receiver {
        public static void main(String[] args) throws IOException {
            // 创建DatagramSocket对象,指定接收数据的端口
            DatagramSocket ds = new DatagramSocket(12345);
            while (true) {
                // 创建字节数组用于存储接收的数据
                byte[] bys = new byte[1024];
                // 创建DatagramPacket对象用于接收数据报
                DatagramPacket dp = new DatagramPacket(bys, bys.length);
                // 接收数据报
                ds.receive(dp);
                // 获取接收到的数据的实际长度
                int length = dp.getLength();
                // 将字节数组转换为字符串并输出
                String data = new String(bys, 0, length);
                System.out.println("收到消息: " + data);
            }
        }
    }

    代码解析

    1. 发送端(Sender.java)

      • 首先创建 DatagramSocket 对象,这是 UDP 通信中用于发送和接收数据报的套接字。

      • 通过 BufferedReader 从键盘读取用户输入。

      • 使用 while 循环持续读取输入,当输入为 886 时跳出循环。

      • 对于每次读取到的非 886 输入,将其转换为字节数组,创建 DatagramPacket 对象,指定目标地址(这里用 localhost 表示本地主机)和端口(12345),然后通过 send 方法发送数据报。

      • 最后关闭 DatagramSocket 资源。

    2. 接收端(Receiver.java)

      • 创建 DatagramSocket 对象并指定端口(12345),用于接收发送端发来的数据报。

      • 使用一个无限循环(死循环)持续接收数据报。在循环内,先创建字节数组和 DatagramPacket 对象。

      • 通过 receive 方法接收数据报,然后获取数据的实际长度,将字节数组转换为字符串并输出接收到的消息。

    注意事项:

    • 这里发送端和接收端的端口要对应一致(都是 12345 ),实际应用中可根据需求修改。

    • 代码中发送的目标地址为 localhost,意味着发送和接收都在本地进行,若要在网络中不同主机间通信,需改为对应主机的 IP 地址。

4. HTTP 协议
  • 功能:用于在 Web 浏览器和 Web 服务器之间传输超文本(如 HTML 页面)。

  • 版本

    • HTTP/1.0:无状态协议,每次请求都需要建立新的连接,效率较低。

    • HTTP/1.1:支持持久连接、请求头压缩、分块传输等功能,提高了传输效率。

    • HTTP/2:采用二进制分帧、多路复用、头部压缩等技术,进一步提高了性能。

  • 请求方法:常见的有 GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。

5. FTP 协议
  • 功能:用于在客户端和服务器之间进行文件传输。

  • 工作模式

    • 主动模式:服务器主动连接客户端的数据端口。

    • 被动模式:服务器等待客户端连接其数据端口。

6. SMTP、POP3 和 IMAP 协议
  • SMTP(Simple Mail Transfer Protocol):用于发送电子邮件。

  • POP3(Post Office Protocol 3):用于接收电子邮件,将邮件从服务器下载到本地客户端后,服务器上的邮件通常会被删除。

  • IMAP(Internet Message Access Protocol):也是用于接收电子邮件,但可以在服务器上保留邮件副本,方便在不同设备上同步邮件。

四、协议的选择和应用场景

  • TCP 协议:适用于对数据准确性要求较高、对实时性要求较低的场景,如文件传输、网页浏览等。

  • UDP 协议:适用于对实时性要求较高、对数据准确性要求较低的场景,如视频直播、在线游戏等。

  • HTTP 协议:主要用于 Web 应用开发,实现客户端和服务器之间的通信。

  • FTP 协议:用于文件的上传和下载。

  • SMTP、POP3 和 IMAP 协议:用于电子邮件的发送和接收。

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

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

相关文章

JVM 调优不再难:AI 工具自动生成内存优化方案

在 Java 应用程序的开发与运行过程中,Java 虚拟机(JVM)的性能调优一直是一项极具挑战性的任务,尤其是内存优化方面。不合适的 JVM 内存配置可能会导致应用程序出现性能瓶颈,甚至频繁抛出内存溢出异常,影响业…

封装Tcp Socket

封装Tcp Socket 0. 前言1. Socket.hpp2. 简单的使用介绍 0. 前言 本文中用到的Log.hpp在笔者的历史文章中都有涉及,这里就不再粘贴源码了,学习地址如下:https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…

Linux 入门九:Linux 进程间通信

概述 进程间通信(IPC,Inter-Process Communication)是指在不同进程之间传递数据和信息的机制。Linux 提供了多种 IPC 方式,包括管道、信号、信号量、消息队列、共享内存和套接字等。 方式 一、管道(Pipe&#xff09…

Redis之缓存更新策略

缓存更新策略 文章目录 缓存更新策略一、策略对比二、常见的缓存更新策略三、如何选择策略四、实际应用示例五、使用 Cache-Aside TTL 的方式,实现缓存商铺信息详情1.引入StringRedisTemplate2.将查询商铺信息加入缓存3.更新商铺信息时移除缓存总结 六、注意事项 一…

【leetcode100】杨辉三角

1、题目描述 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]…

Selenium2+Python自动化:利用JS解决click失效问题

文章目录 前言一、遇到的问题二、点击父元素问题分析解决办法实现思路 三、使用JS直接点击四、参考代码 前言 在使用Selenium2和Python进行自动化测试时,我们有时会遇到这样的情况:元素明明已经被成功定位,代码运行也没有报错,但…

OpenStack Yoga版安装笔记(十九)启动一个实例(Self-service networks)

1、概述 1.1 官方文档 Launch an instancehttps://docs.openstack.org/install-guide/launch-instance.html 《OpenStack Yoga版安装笔记(十四)启动一个实例》文档中,已经按照Option1: Provider networks创建网络。 本文按照Option2&#…

数学教学通讯杂志数学教学通讯杂志社数学教学通讯编辑部2025年第6期目录

课程教材教法 “课程思政”视域下的高中数学教学探索与实践——以“函数概念的发展历程”为例 赵文博; 3-617 PBL教学模式下高中统计教学的探索与实践——以“随机抽样(第一课时)”为例 陈沛余; 7-10 “三新”背景下的高中数学教学困境与应对…

C#容器源码分析 --- Dictionary<TKey,TValue>

Dictionary<TKey, TValue> 是 System.Collections.Generic 命名空间下的高性能键值对集合&#xff0c;其核心实现基于​​哈希表​​和​​链地址法&#xff08;Separate Chaining&#xff09;。 .Net4.8 Dictionary<TKey,TValue>源码地址&#xff1a; dictionary…

在 Visual Studio Code 中安装通义灵码 - 智能编码助手

高效的编码工具对于提升开发效率和代码质量至关重要。 通义灵码作为一款智能编码助手&#xff0c;为开发者提供了全方位的支持。 本文将详细介绍如何在 Visual Studio Code&#xff08;简称 VSCode&#xff09;中安装通义灵码&#xff0c;以及如何进行相关配置以开启智能编码…

idea报错java: 非法字符: ‘\ufeff‘解决方案

解决方案步骤以及说明 BOM是什么&#xff1f;1. BOM的作用2. 为什么会出现 \ufeff 错误&#xff1f;3. 如何解决 \ufeff 问题&#xff1f; 最后重新编译&#xff0c;即可运行&#xff01;&#xff01;&#xff01; BOM是什么&#xff1f; \ufeff 是 Unicode 中的 BOM&#xff0…

PHY芯片与网络变压器接线设计指南——不同速率与接口的硬件设计原则

一、PHY与网络变压器的核心作用 • PHY芯片&#xff08;物理层芯片&#xff09; • 功能&#xff1a;实现数据编码&#xff08;如Manchester、PAM4&#xff09;、时钟恢复、链路协商&#xff08;Auto-Negotiation&#xff09;。 • 接口类型&#xff1a;MII/RMII/GMII/RGMII/…

【学习笔记】计算机网络(八)—— 音频/视频服务

第8章 互联网上的音频/视频服务 文章目录 第8章 互联网上的音频/视频服务8.1概述8.2 流式存储音频/视频8.2.1 具有元文件的万维网服务器8.2.2 媒体服务器8.2.3 实时流式协议 RTSP 8.3 交互式音频/视频8.3.1 IP 电话概述8.3.2 IP电话所需要的几种应用协议8.3.3 实时运输协议 RTP…

linux: 文件描述符fd

目录 1.C语言文件操作复习 2.底层的系统调用接口 3.文件描述符的分配规则 4.重定向 1.C语言文件操作复习 文件 内容 属性。所有对文件的操作有两部分&#xff1a;a.对内容的操作&#xff1b;b.对属性的操作。内容是数据&#xff0c;属性其实也是数据-存储文件&#xff0c…

记录一次后台项目的打包优化

文章目录 前言分析问题寻找切入点根据切入点逐一尝试cdn引入node包遇到的一些问题记录最终结果 前言 优化&#xff0c;所有开发者到一定的程度上&#xff0c;都绕不开的问题之一 例如&#xff1a; 首页加载优化白屏优化列表无限加载滚动优化&#xff0c;图片加载优化逻辑耦合…

问题记录(四)——拦截器“失效”?null 还是“null“?

拦截器“失效”&#xff1f;null 还是"null"&#xff1f; 问题描述 这个问题本身并不复杂&#xff0c;但是却是一个容易被忽略的问题。 相信大家在项目中一定实现过强制登录的逻辑吧&#xff0c;巧了&#xff0c;所要介绍的问题就出现在测试强制登录接口的过程中&am…

图论整理复习

回溯&#xff1a; 模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff…

C++修炼:vector模拟实现

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

案例-索引对于并发Insert性能优化测试

前言 最近因业务并发量上升,开发反馈对订单表Insert性能降低。应开发要求对涉及Insert的表进行分析并提供优化方案。   一般对Insert 影响基本都在索引,涉及表已按创建日期做了分区表,索引全部为普通索引未做分区索引。 优化建议: 1、将UNIQUE改为HASH(64) GLOBAL IND…

[区块链lab2] 构建具备加密功能的Web服务端

实验目标&#xff1a; 掌握区块链中密码技术的工作原理。在基于Flask框架的服务端中实现哈希算法的加密功能。 实验内容&#xff1a; 构建Flash Web服务器&#xff0c;实现哈希算法、非对称加密算法的加密功能。 实验步骤&#xff1a; 哈希算法的应用&#xff1a;创建hash…