当前位置: 首页 > news >正文

Java网络通信-第21章

Java网络通信-第21章

1.网络程序设计基础

网络程序设计基础涵盖了许多方面,包括网络协议、Web开发、数据库连接、安全性等。

1.1局域网与互联网

局域网(LAN)与互联网(Internet)是两个不同的概念,它们分别用于描述不同范围内的网络连接。

  1. 局域网(LAN):
    • 定义: 局域网是指在一个相对较小的地理范围内连接在一起的计算机网络,如家庭、学校、办公室或公司。
    • 范围: 通常,局域网覆盖的范围限制在一个建筑物或者一组相邻的建筑物内。
    • 连接设备: 局域网内的设备可以通过局域网技术(如以太网、Wi-Fi等)相互通信,共享资源,比如打印机、文件等。
  2. 互联网(Internet):
    • 定义: 互联网是一个全球性的计算机网络,它连接了世界上的数以亿计的设备,允许它们之间进行通信和数据交换。
    • 范围: 互联网没有地理限制,覆盖全球范围。
    • 连接设备: 互联网连接了各种设备,包括个人计算机、智能手机、服务器等。它是通过一系列的互联网服务提供商(ISP)相互连接起来的。
  3. 关系:
    • 局域网是构建在较小的地理范围内,用于组织内部设备之间的通信。
    • 互联网是一个覆盖全球的网络,将不同地理位置的局域网连接起来,使得全球范围内的设备能够相互通信。
  4. 通信方式:
    • 局域网内部的通信通常更快、更可靠,而且通常不需要经过公共互联网。
    • 互联网通信需要经过公共的基础设施,如因特网服务提供商(ISP),数据在全球范围内传输。

1.2网络协议

网络协议是计算机网络中设备之间进行通信和数据交换的规则和约定。它们定义了数据的格式、传输方法、错误检测等方面的规范,确保不同厂商和不同类型的设备能够在网络中互相通信。

1.IP协议

IP(Internet Protocol)是计算机网络中的一种基础协议,用于在网络中传输数据包。IP协议定义了数据包的格式和规则,确保数据在网络中正确传递。目前广泛使用的IP版本有两个:IPv4(Internet Protocol version 4)和IPv6(Internet Protocol version 6)。

IPv4(Internet Protocol version 4):

  1. 地址格式: IPv4地址是32位的,通常以点分十进制表示,如192.168.0.1
  2. 地址空间: IPv4提供了大约42亿个唯一的地址,由于互联网的快速发展,IPv4地址空间已经不够用,导致IPv4地址枯竭问题。
  3. 子网: 为了更好地管理IP地址,IPv4引入了子网的概念,允许将一个大的IP地址块划分成多个小的子网。
  4. 私有地址范围: IPv4定义了一些私有地址范围,例如192.168.0.0/16,这些地址通常用于内部网络。

IPv6(Internet Protocol version 6):

  1. 地址格式: IPv6地址是128位的,通常以冒号分隔的十六进制表示,如2001:0db8:85a3:0000:0000:8a2e:0370:7334
  2. 地址空间: IPv6提供了远远超过IPv4的地址空间,理论上足够支持未来互联网的发展需求。
  3. 简化报头: IPv6在报头中做了一些简化,减少了一些字段,提高了路由和转发效率。
  4. 无需NAT: 由于IPv6地址空间足够大,通常无需使用网络地址转换(NAT)技术,简化了网络配置和管理。

共同点:

  1. 数据包传输: IPv4和IPv6都是网络层协议,负责将数据包从源主机传输到目标主机。
  2. 逐跳路由: 在网络中,数据包通过一系列的路由器逐跳传输,最终到达目标主机。

由于IPv4地址枯竭的问题,全球范围内正在逐渐过渡到IPv6。IPv6提供了更大的地址空间,更好的路由和转发效率,以及更简化的网络配置。在实际应用中,IPv4和IPv6可能同时存在,而且网络设备和应用程序需要同时支持这两种协议,这被称为双栈(Dual Stack)支持。

2.TCP与UDP协议

TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种常见的传输层协议,它们定义了在计算机网络中数据如何被传输和接收的规则。以下是它们的主要特点和区别:

TCP(Transmission Control Protocol):

  1. 连接导向: TCP是面向连接的协议,建立了一条双向的通信路径,确保数据的可靠传输。
  2. 可靠性: TCP提供可靠的数据传输,通过使用确认机制和重传机制来确保数据的完整性和顺序性。
  3. 流控制: TCP通过流控制机制来控制数据的发送速率,防止接收方被过多的数据淹没。
  4. 拥塞控制: TCP使用拥塞控制算法,当网络拥塞时会调整发送速率,以避免网络的过载。
  5. 面向字节: TCP将数据视为一连串的字节流,而非独立的数据包。

UDP(User Datagram Protocol):

  1. 无连接: UDP是面向无连接的协议,通信双方在传输数据前不需要建立连接。
  2. 不可靠性: UDP不提供可靠的数据传输,不保证数据的完整性和顺序性,也不提供重传机制。
  3. 无流控制: UDP不提供流控制机制,因此发送方会一直以固定速率发送数据,而不会根据接收方的处理能力进行调整。
  4. 无拥塞控制: UDP不具备拥塞控制机制,因此在网络拥塞时可能会丢失数据包。
  5. 面向数据报: UDP将数据视为独立的数据包,而非字节流。

共同点:

  1. 端口: TCP和UDP都使用端口来标识应用程序,使得数据能够正确地交付到目标应用。
  2. 传输层协议: TCP和UDP都属于传输层协议,负责将数据从一个端点传输到另一个端点。

选择使用场景:

  • TCP适用于:
    • 需要可靠数据传输的应用,如文件传输、电子邮件等。
    • 需要确保数据按顺序到达的应用,如视频流、Web页面加载等。
  • UDP适用于:
    • 实时性要求较高,能够容忍一定程度的数据丢失的应用,如实时语音、视频通话等。
    • 需要较低的通信延迟,对数据可靠性要求不高的应用,如在线游戏。
3.端口与套接字

端口(Port)和套接字(Socket)是计算机网络中重要的概念,它们在网络通信中起到关键的作用。

端口(Port):

  • 定义: 端口是一个逻辑上的概念,用于标识一台计算机中运行的特定应用程序或服务。它允许一台计算机上的不同应用程序通过网络进行通信,每个应用程序都被分配一个唯一的端口号。
  • 范围: 端口号范围从0到65535,其中0到1023的端口号被称为「系统端口」或「知名端口」,它们通常用于一些常见的服务(如HTTP使用的80端口,FTP使用的21端口等)。1024到49151的端口号是「注册端口」,用于用户应用。49152到65535的端口号是「动态或私有端口」,它们用于动态分配,通常由客户端应用程序使用。

套接字(Socket):

  • 定义: 套接字是支持网络通信的编程接口,它允许进程通过网络发送和接收数据。套接字由IP地址和端口号组成,标识了通信中的两个端点。套接字可以用于在同一台计算机上的进程间通信,也可以用于在不同计算机之间进行网络通信。
  • 类型: 套接字可以分为两种类型:流套接字(Stream Socket)和数据报套接字(Datagram Socket)。
    • 流套接字: 提供面向连接的、可靠的、基于字节流的通信,使用TCP协议。
    • 数据报套接字: 提供无连接的、不可靠的、基于数据包的通信,使用UDP协议。

套接字编程通常包括创建套接字、绑定到一个特定的IP地址和端口号、监听连接请求(对于服务器端)、接受连接(对于服务器端)、连接到服务器(对于客户端)、发送和接收数据等步骤。

2.TCP程序

TCP(Transmission Control Protocol)是一种面向连接的、可靠的协议,常用于网络通信中。

2.1InetAddress类

InetAddress 类是 Java 中用于表示 IP 地址的类。它位于 java.net 包中,提供了一种在网络上标识主机的方法。InetAddress 类主要用于获取主机的 IP 地址和主机名。

以下是 InetAddress 类的一些主要方法和用法:

  1. 获取本地主机的 InetAddress 对象:

    InetAddress localHost = InetAddress.getLocalHost();
    
  2. 根据主机名获取 InetAddress 对象:

    String hostName = "example.com";
    InetAddress address = InetAddress.getByName(hostName);
    
  3. 获取主机的 IP 地址:

    byte[] ipAddress = address.getAddress(); // 返回字节数组形式的 IP 地址
    String ipAddressStr = address.getHostAddress(); // 返回字符串形式的 IP 地址
    
  4. 获取主机名:

    String hostName = address.getHostName();
    
  5. 判断是否是 IP 地址:

    boolean isIP = InetAddressUtils.isIPv4Address(ipAddressStr); // 可以使用 InetAddressUtils 类中的方法判断 IPv4 或 IPv6 地址
    

InetAddress 类的使用可以帮助我们进行网络编程中的主机信息获取和处理。请注意,它主要用于获取网络上的主机信息,而不涉及与网络通信的具体操作。如果需要进行网络通信,通常需要使用 SocketURL 等类。

2.2ServerSocket类

ServerSocket 类是 Java 中用于创建服务器套接字的类,它位于 java.net 包中。通过 ServerSocket,你可以监听特定端口,接受客户端的连接请求,并与客户端进行通信。以下是一些 ServerSocket 类的常见用法:

创建 ServerSocket 对象:

int port = 8080;
ServerSocket serverSocket = new ServerSocket(port);

接受客户端连接:

Socket clientSocket = serverSocket.accept();

这个方法会阻塞程序的执行,直到有客户端请求连接。一旦有连接请求,它会返回一个新的 Socket 对象,该对象用于与客户端进行通信。

获取输入输出流进行通信:

javaCopy codeInputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();

使用这些流,你可以读取来自客户端的数据和向客户端发送数据。

关闭 ServerSocket:

javaCopy code
serverSocket.close();

当服务器不再需要监听新的连接时,可以关闭 ServerSocket

以下是一个简单的示例,演示了 ServerSocket 的基本用法:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class SimpleServer {public static void main(String[] args) {int port = 8080;try (ServerSocket serverSocket = new ServerSocket(port)) {System.out.println("Server is listening on port " + port);// 等待客户端连接Socket clientSocket = serverSocket.accept();System.out.println("Client connected");// 获取输入输出流InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream();// 读取客户端发送的数据byte[] buffer = new byte[1024];int bytesRead = inputStream.read(buffer);String clientMessage = new String(buffer, 0, bytesRead);System.out.println("Client message: " + clientMessage);// 向客户端发送响应String responseMessage = "Hello, client!";outputStream.write(responseMessage.getBytes());// 关闭连接clientSocket.close();} catch (IOException e) {e.printStackTrace();}}
}

注意,这只是一个简单的例子,实际上,服务器通常需要在不同的线程中处理多个客户端连接,以避免阻塞。此外,网络编程涉及异常处理等更复杂的问题。

2.3TCP网络程序设计

设计 TCP 网络程序通常涉及两个主要角色:服务器端和客户端。TCP(传输控制协议)是一种面向连接的协议,它提供可靠的、有序的、基于字节流的双向数据传输。下面分别介绍服务器端和客户端的设计。

服务器端(TCP Server)

  1. 创建 ServerSocket 对象:

    ServerSocket serverSocket = new ServerSocket(port);
    
  2. 等待客户端连接:

    Socket clientSocket = serverSocket.accept();
    
  3. 获取输入输出流:

    InputStream inputStream = clientSocket.getInputStream();
    OutputStream outputStream = clientSocket.getOutputStream();
    
  4. 处理客户端发送的数据:

    // 读取数据
    byte[] buffer = new byte[1024];
    int bytesRead = inputStream.read(buffer);
    String clientMessage = new String(buffer, 0, bytesRead);// 处理数据,执行业务逻辑// 发送响应
    String responseMessage = "Hello, client!";
    outputStream.write(responseMessage.getBytes());
    
  5. 关闭连接:

    clientSocket.close();
    
  6. 异常处理: 在实际应用中,需要添加适当的异常处理,以确保程序在发生异常时能够正确地处理和关闭资源。

客户端(TCP Client)

  1. 创建 Socket 对象连接服务器:

    Socket socket = new Socket(serverAddress, serverPort);
    
  2. 获取输入输出流:

    InputStream inputStream = socket.getInputStream();
    OutputStream outputStream = socket.getOutputStream();
    
  3. 发送数据给服务器:

    // 发送数据
    String message = "Hello, server!";
    outputStream.write(message.getBytes());
    
  4. 接收服务器响应:

    // 接收数据
    byte[] buffer = new byte[1024];
    int bytesRead = inputStream.read(buffer);
    String serverResponse = new String(buffer, 0, bytesRead);
    System.out.println("Server response: " + serverResponse);
    
  5. 关闭连接:

    socket.close();
    
  6. 异常处理: 同样,需要适当地处理可能出现的异常。

示例

以下是一个简单的示例,演示了一个简单的 TCP 服务器和客户端:

TCP Server:

import java.io.*;
import java.net.*;public class TCPServer {public static void main(String[] args) {int port = 8080;try (ServerSocket serverSocket = new ServerSocket(port)) {System.out.println("Server is listening on port " + port);Socket clientSocket = serverSocket.accept();System.out.println("Client connected");InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream();byte[] buffer = new byte[1024];int bytesRead = inputStream.read(buffer);String clientMessage = new String(buffer, 0, bytesRead);System.out.println("Client message: " + clientMessage);String responseMessage = "Hello, client!";outputStream.write(responseMessage.getBytes());clientSocket.close();} catch (IOException e) {e.printStackTrace();}}
}

TCP Client:

import java.io.*;
import java.net.*;public class TCPClient {public static void main(String[] args) {String serverAddress = "localhost";int serverPort = 8080;try (Socket socket = new Socket(serverAddress, serverPort)) {InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();String message = "Hello, server!";outputStream.write(message.getBytes());byte[] buffer = new byte[1024];int bytesRead = inputStream.read(buffer);String serverResponse = new String(buffer, 0, bytesRead);System.out.println("Server response: " + serverResponse);socket.close();} catch (IOException e) {e.printStackTrace();}}
}

这只是一个简单的例子,实际上,我们可能需要在不同的线程中处理多个客户端连接,以及添加更复杂的业务逻辑和异常处理。

运行结果

TCP Server:

在这里插入图片描述

TCP Client:

在这里插入图片描述

3.UDP程序

UDP(User Datagram Protocol)是一种无连接、不可靠、简单的面向数据报的协议。UDP 提供了一种轻量级的数据传输机制,适用于一些对实时性要求较高、容忍数据丢失的应用场景。

3.1DatagramPacket类

DatagramPacket 类是 Java 中用于表示数据报包的类,通常用于 UDP 协议的通信。DatagramPacket 封装了数据和目标主机信息,包括目标主机的 IP 地址和端口号。这类被用于在网络上发送和接收数据报。

构造方法:

  1. 发送数据时的构造方法:

    DatagramPacket(byte[] data, int length, InetAddress address, int port)
    
    • data:要发送的数据,以字节数组形式提供。
    • length:要发送的数据的长度。
    • address:目标主机的 IP 地址。
    • port:目标主机的端口号。
  2. 接收数据时的构造方法:

    javaCopy code
    DatagramPacket(byte[] data, int length)
    
    • data:用于接收数据的字节数组。
    • length:接收数据的最大长度。

常用方法:

  1. 获取数据:

    byte[] getData()
    
  2. 获取数据长度:

    int getLength()
    
  3. 获取数据报包的源地址:

    InetAddress getAddress()
    
  4. 获取数据报包的源端口号:

    int getPort()
    
  5. 设置数据报包的目标地址和端口号:

    setAddress(InetAddress address)
    setPort(int port)
    

3.2DatagramSocket类

DatagramSocket 类是 Java 中用于进行 UDP(User Datagram Protocol)通信的套接字类。它提供了在网络上发送和接收数据报(DatagramPacket)的方法。与 TCP 不同,UDP 是一种无连接、不可靠的协议,但它更加轻量且适用于一些实时性要求较高的应用场景。

构造方法:

  1. 创建 DatagramSocket 实例:

    javaCopy code
    DatagramSocket socket = new DatagramSocket();
    

    创建一个新的 DatagramSocket 实例,用于与其他主机进行 UDP 通信。

  2. 指定端口号创建 DatagramSocket:

    DatagramSocket socket = new DatagramSocket(port);
    

    创建一个监听指定端口的 DatagramSocket 实例,用于接收数据。

  3. 指定本地地址和端口创建 DatagramSocket:

    DatagramSocket socket = new DatagramSocket(port, InetAddress.getLocalHost());
    

    创建一个绑定到指定本地地址和端口的 DatagramSocket 实例。

常用方法:

  1. 发送数据报:

    send(DatagramPacket packet)
    

    通过 DatagramSocket 发送数据报。

  2. 接收数据报:

    receive(DatagramPacket packet)
    

    通过 DatagramSocket 接收数据报。

  3. 设置超时时间:

    setSoTimeout(int timeout)
    

    设置 DatagramSocket 的超时时间,用于控制在接收时等待数据的最长时间。

  4. 关闭 DatagramSocket:

    close()
    

    关闭 DatagramSocket,释放相关资源。

3.3UDP网络序设计

设计 UDP(User Datagram Protocol)网络程序通常涉及两个主要角色:服务器端和客户端。UDP 是一种无连接、不可靠的协议,适用于对实时性要求较高、能够容忍一定数据丢失的应用场景。以下是 UDP 服务器端和客户端的基本设计步骤:

UDP 服务器端设计:

  1. 创建 DatagramSocket 对象:

    DatagramSocket serverSocket = new DatagramSocket(port);
    

    创建一个 DatagramSocket 实例来监听指定端口。

  2. 创建 DatagramPacket 对象用于接收数据:

    byte[] receiveData = new byte[1024];
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
    

    用于接收从客户端发送过来的数据。

  3. 接收客户端数据:

    serverSocket.receive(receivePacket);
    

    通过 DatagramSocket 接收数据报。

  4. 处理客户端数据:

    String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
    // 处理客户端数据...
    

    处理接收到的客户端数据,执行相应的业务逻辑。

  5. 发送响应给客户端(可选):

    InetAddress clientAddress = receivePacket.getAddress();
    int clientPort = receivePacket.getPort();
    String responseMessage = "Hello, client!";
    byte[] sendData = responseMessage.getBytes();
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);
    serverSocket.send(sendPacket);
    

    如果需要,可以通过 DatagramSocket 发送响应给客户端。

  6. 关闭 DatagramSocket:

    serverSocket.close();
    

    在不再需要监听时关闭 DatagramSocket

UDP 客户端设计:

  1. 创建 DatagramSocket 对象:

    DatagramSocket clientSocket = new DatagramSocket();
    

    创建一个 DatagramSocket 实例,用于发送和接收数据。

  2. 创建 DatagramPacket 对象用于发送数据:

    String message = "Hello, server!";
    byte[] sendData = message.getBytes();
    InetAddress serverAddress = InetAddress.getByName(serverHost);
    int serverPort = 9876; // 服务器端口号
    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort);
    

    用于将数据发送给服务器。

  3. 发送数据给服务器:

    clientSocket.send(sendPacket);
    

    通过 DatagramSocket 发送数据报给服务器。

  4. 创建 DatagramPacket 对象用于接收服务器响应:

    byte[] receiveData = new byte[1024];
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
    

    用于接收从服务器返回的数据。

  5. 接收服务器响应:

    clientSocket.receive(receivePacket);
    String serverResponse = new String(receivePacket.getData(), 0, receivePacket.getLength());
    System.out.println("Server response: " + serverResponse);
    

    通过 DatagramSocket 接收服务器的响应。

  6. 关闭 DatagramSocket:

    clientSocket.close();
    

    在不再需要发送和接收数据时关闭 DatagramSocket

示例:

以下是一个简单的 UDP 服务器端和客户端的示例:

UDP Server:

import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDPServer {public static void main(String[] args) {int port = 9876;try (DatagramSocket serverSocket = new DatagramSocket(port)) {System.out.println("Server is listening on port " + port);byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);serverSocket.receive(receivePacket);String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Client message: " + clientMessage);// 处理客户端数据...} catch (Exception e) {e.printStackTrace();}}
}

UDP Client:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class UDPClient {public static void main(String[] args) {String serverHost = "localhost";int serverPort = 9876;try (DatagramSocket clientSocket = new DatagramSocket()) {String message = "Hello, server!";byte[] sendData = message.getBytes();InetAddress serverAddress = InetAddress.getByName(serverHost);DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort);clientSocket.send(sendPacket);byte[] receiveData = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);clientSocket.receive(receivePacket);String serverResponse = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Server response: " + serverResponse);} catch (Exception e) {e.printStackTrace();}}
}

在实际应用中,需要注意异常处理、超时机制、数据的序列化和反序列化等方面,以确保程序的稳定性和可靠性。

相关文章:

Java网络通信-第21章

Java网络通信-第21章 1.网络程序设计基础 网络程序设计基础涵盖了许多方面,包括网络协议、Web开发、数据库连接、安全性等。 1.1局域网与互联网 局域网(LAN)与互联网(Internet)是两个不同的概念,它们分…...

Leetcode 345. Reverse Vowels of a String

Problem Given a string s, reverse only all the vowels in the string and return it. The vowels are ‘a’, ‘e’, ‘i’, ‘o’, and ‘u’, and they can appear in both lower and upper cases, more than once. Algorithm Collect all the vowels and reverse the…...

[linux] 用命令行wget下载google drive的大文件

使用wget命令下载Google drive上的文件_ubuntu上wget下载谷歌云盘文件-CSDN博客 如何用命令行下载Google Drive上的共享文件?-腾讯云开发者社区-腾讯云 举例:https://drive.google.com/drive/folders/1vKj3VvJEKgS_o-uOSmz3I0-GomECpql3 1、在网页上&…...

Docker Network(网络)——8

目录: Docker 为什么需要网络管理Docker 网络架构简介 CNMLibnetwork驱动常见网络类型 bridge 网络host 网络container 网络none 网络overlay 网络docker 网络管理命令 docker network createdocker network inspectdocker network connectdocker network disconne…...

网页设计--第6次课后作业

试用Vue相关指令完成对以下json数据的显示。显示效果如下: 其中:gender1 显示为女,gender2显示为男。价格超过30元,显示“有点小贵”。价格少于等于30元,则显示“价格亲民”。 data: {books: [{"id": "…...

R语言学习

Part1阶段1:入门基础 1安装R和RStudio: 下载并安装R:https://cran.r-project.org/ 下载并安装RStudio:https://www.rstudio.com/products/rstudio/download/ 2Hello World: 学习如何在R中输出"Hello, World!"…...

基于Unity3D 低多边形地形模型纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…...

vue预览pdf,放大缩小拖动,dialog拖动,父页面滚动

公共组件部分代码 main.js import draggable from /directive/drag/index Vue.use(draggable) pdf组件部分代码...

泽攸科技二维材料转移台的应用场景及优势

随着二维材料的广泛研究和各种潜在应用的开发,对于二维材料样品的精密操控与转移的需求日益增加。特别是一些新型二维材料的制备和器件集成制备中,需要在显微镜下对样品进行观察与定位,并能够在微米甚至纳米量级上精确移動和转移样品。 传统…...

JavaScript——基本使用HelloWrold

1. 内部标签 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--script标签内&#xff1a;写js代码 也可以写在body标签内--><script>alert(hello,world)&l…...

关于DNS服务器地址总是127.0.0.1且无法解析域名地址

问题 笔者尝试nslookup解释域名时&#xff0c;出现服务器变成本地环回口地址&#xff0c;导致无法解析域名 C:\Users\Zsy>nslookup www.baidu.com 服务器: UnKnown Address: 127.0.0.1*** UnKnown 找不到 www.baidu.com: Server failed排查思路 尝试关闭虚拟网卡&#…...

制作一个RISC-V的操作系统四-嵌入式开发介绍

文章目录 什么是嵌入式开发交叉编译查看一些GCC文件夹 调试器GDB相关语法命令 模拟器QEMUQEMU的安装和使用项目构造工具MakeMakeFile的构成make的运行 练习4-1练习4-2练习4-3 什么是嵌入式开发 程序跑到开发板上&#xff0c;或者说运行到硬件上 交叉编译 简单理解交叉编译来说…...

Python爬虫-实现批量抓取王者荣耀皮肤图片并保存到本地

前言 本文是该专栏的第12篇,后面会持续分享python爬虫案例干货,记得关注。 本文以王者荣耀的英雄皮肤为例,用python实现批量抓取“全部英雄”的皮肤图片,并将图片“批量保存”到本地。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。注意,这里抓取的图片…...

04-详解Eureka注册中心的作用,具体配置,服务注册和服务发现

Eureka注册中心的作用 Eureka架构 远程调用的两个问题 服务的ip地址和端口号写死: 生产环境中服务的地址可能会随时发生变化,如果写死每次都需要重新修改代码多实例问题: 在高并发的情况下一个服务可以有多个实例形成一个集群,此时如果采用硬编码的方式只能访问服务的一个实…...

数据分析基础之《matplotlib(3)—散点图》

一、常见图形种类及意义 1、matplotlib能够绘制折线图、散点图、柱状图、直方图、饼图。我们需要知道不同的统计图的意义&#xff0c;以此来决定选择哪种统计图来呈现我们的数据 2、折线图plot 说明&#xff1a;以折线的上升或下降来表示统计数量的增减变化的统计图 特点&…...

Flask 动态路由、请求数据接收、视图函数返回值详解

一、动态路由 在前面的博客中&#xff0c;我们学习了如何创建基本的 Flask 应用&#xff0c;并定义了一些简单的路由。但有时候&#xff0c;我们需要更加灵活的路由&#xff0c;能够根据用户请求的不同来动态生成响应。Flask 提供了动态路由的功能&#xff0c;使我们能够轻松处…...

Transformer 简介

Transformer 是 Google 在 2017 年底发表的论文 Attention Is All You Need 中所提出的 seq2seq 模型。Transformer 模型的核心是 Self-Attention 机制&#xff0c;能够处理输入序列中的每个元素&#xff0c;并能计算其与序列中其他元素的交互关系的方法&#xff0c;从而能够更…...

LLVM学习笔记(64)

4.4.3.3.3. 设置寄存器类对类型的行为 1679行调用computeRegisterProperties()来计算寄存器类的衍生属性。TargetLoweringBase的容器RegisterTypeForVT、RegClassForVT以及NumRegistersForVT用于记录原生支持每个ValueType目标机器寄存器类的信息&#xff0c;即类型对应的寄存…...

深度学习TensorFlow2基础知识学习前半部分

目录 测试TensorFlow是否支持GPU&#xff1a; 自动求导&#xff1a; 数据预处理 之 统一数组维度 定义变量和常量 训练模型的时候设备变量的设置 生成随机数据 交叉熵损失CE和均方误差函数MSE 全连接Dense层 维度变换reshape 增加或减小维度 数组合并 广播机制&#…...

Linux系统---简易伙伴系统

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、题目要求 1.采用C语言实现 2.伙伴系统采用free_area[11]数组来组织。要求伙伴内存最小为一个页面&#xff0c;页面大小为4KB…...

Redis使用Lua脚本

Lua脚本 redis可以支持lua脚本&#xff0c;可以使用lua脚本来将几个命令整合为一个整体来执行&#xff0c;这样可以使得多个命令原子操作&#xff0c;且可以减少网络开销 Lua的数据类型 Lua是一个动态类型的语言&#xff0c;一个变量可以存储任何类型的值&#xff0c;类型有&am…...

macos安装metal 加速版 pytorch

categories: [Python] tags: Python MacOS 写在前面 试试 m3 的 metal 加速效果如何 Mac computers with Apple silicon or AMD GPUsmacOS 12.3 or laterPython 3.7 or laterXcode command-line tools: xcode-select --install 安装 Python: conda-forge brew install minif…...

【学习笔记】lyndon分解

摘抄自quack的ppt。 这部分和 s a sa sa的关联比较大&#xff0c;可以加深对 s a sa sa的理解。 Part 1 如果字符串 s s s的字典序在 s s s以及 s s s的所有后缀中是最小的&#xff0c;则称 s s s是一个 lyndon \text{lyndon} lyndon串。 lyndon \text{lyndon} lyndon分解&a…...

21、命令执行

文章目录 一、命令执行概述1.1 基本定义1.2 原理1.3 两个条件1.4 命令执行漏洞产生的原因1.5 管道符号和通用命令符 二、远程命令执行2.1 远程命令执行相关函数2.2 远程命令执行漏洞的利用 三、系统命令执行3.1 相关函数3.2 系统命令执行漏洞利用 四、命令执行漏洞防御 一、命令…...

Qexo博客后台管理部署

Qexo博客后台管理部署 个人主页 个人博客 参考文档 https://www.oplog.cn/qexo/本地部署 采用本地Docker部署管理本地Hexo 下载代码包 若无法下载使用科学工具下载到本地在上传到服务器 wget https://github.com/Qexo/Qexo/archive/refs/tags/3.0.1.zip# 解压 unzip Qexo…...

最小生成树prim

最小生成树&#xff08;三&#xff09;Prim算法及存储结构_哔哩哔哩_bilibili⁤ 311 最小生成树 Prim 算法_哔哩哔哩_bilibili #include <iostream> #include <queue> #include <string> #include <stack> #include <vector> #include <set…...

实用篇 | 一文学会人工智能中API的Flask编写(内含模板)

----------------------- &#x1f388;API 相关直达 &#x1f388;-------------------------- &#x1f680;Gradio: 实用篇 | 关于Gradio快速构建人工智能模型实现界面&#xff0c;你想知道的都在这里-CSDN博客 &#x1f680;Streamlit :实用篇 | 一文快速构建人工智能前端展…...

Si24R03—低功耗 SOC 芯片(集成RISC-V内核+2.4GHz无线收发器)

Si24R03是一款高度集成的低功耗SOC芯片&#xff0c;其集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC等丰…...

C# Winform 日志系统

目录 一、效果 1.刷新日志效果 2.单独日志的分类 3.保存日志的样式 二、概述 三、日志系统API 1.字段 Debug.IsScrolling Debug.Version Debug.LogMaxLen Debug.LogTitle Debug.IsConsoleShowLog 2.方法 Debug.Log(string) Debug.Log(string, params object[]) …...

【Java 基础】27 XML 解析

文章目录 1.SAX 解析器1&#xff09;什么是 SAX2&#xff09;SAX 工作流程初始化实现事件处理类解析 3&#xff09;示例代码 2.DOM 解析器1&#xff09;什么是 DOM2&#xff09;DOM 工作流程初始化解析 XML 文档操作 DOM 树 3&#xff09;示例代码 总结 在项目开发中&#xff0…...