网络编程(IP、端口、协议、UDP、TCP)【详解】

目录

1.什么是网络编程?

2.基本的通信架构

3.网络通信三要素

4.UDP通信-快速入门

5.UDP通信-多发多收

6.TCP通信-快速入门     

7.TCP通信-多发多收   

8.TCP通信-同时接收多个客户端

9.TCP通信-综合案例

1.什么是网络编程?

        网络编程是可以让设备中的程序与网络上其他设备中的程序进行数据交互的技术

2.基本的通信架构

        CS架构:Client客户端/Server服务端

        BS架构:Browser浏览器/Server服务端

        无论是CS架构,还是BS架构的软件都必须依赖网络编程

3.网络通信三要素

        1.IP地址

                IP(Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一标识,可以用来定位网络上的设备。

                IP地址有两种形式:

                        IPv4:

                                32位,4个字节

                                点分十进制: 192.168.1.66

                        IPv6:

                                128位

                                冒分十六进制: 2001:0db8:0000:0023:0008:0800:200c:417a

                IP域名: 网址

                公网IP, 内网IP:

                        公网IP:是可以连接互联网的IP地址;内网IP:也叫局域网IP,只能组织机构内部使用。                

                        内网IP:192.168. 开头的就是常见的局域网地址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用。

                特殊IP地址:127.0.0.1、localhost:代表本机IP,只会寻找当前所在的主机。

                IP常用命令:

                        ipconfig :查看本机IP地址

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

                Java中IP地址的表示:

                        InetAddress

  

package com.itheima.day13.teacher.demo02_ip;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * IP:用于在一个网络里,找到某个计算机设备。一般使用IPv4,比如:192.168.29.33
 * 域名:因为IP比较难记,所以有了域名系统,更方便记忆
 *      IP和域名的关系,类似于  手机通讯录里  手机号和姓名备注的关系
 *      百度的ip:110.242.68.4
 *      百度的域名:www.baidu.com
 * IP地址对象:InetAddress
 *
 */
public class DemoInetAddress {
    public static void main(String[] args) throws IOException {
        //获取本机ip信息
        InetAddress local = InetAddress.getLocalHost();
        String localIp = local.getHostAddress();
        System.out.println("本机ip = " + localIp);
        String localName = local.getHostName();
        System.out.println("本机名 = " + localName);

        //获取指定ip或指定域名的信息
        // InetAddress baidu = InetAddress.getByName("www.baidu.com");
        InetAddress baidu = InetAddress.getByName("110.242.68.4");
        String baiduName = baidu.getHostName();
        System.out.println("baiduName = " + baiduName);
        String baiduIp = baidu.getHostAddress();
        System.out.println("baiduIp = " + baiduIp);

        //测试指定域名的网络是否畅通:200ms之内能否ping通百度
        boolean reachable = baidu.isReachable(200);
        System.out.println("reachable = " + reachable);
    }
}

        2.端口号

                标记正在计算机设备上运行的应用程序的,被规定为一个 16 位的二进制,范围是 0~65535

                分类:

                        周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)                 

                        注册端口:1024~49151,分配给用户进程或某些应用程序

                        动态端口:49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配

                注意:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

        3.协议

                1.网络上通信的设备,事先规定的连接规则,以及传输数据的规则被称为网络通信协议。

                2.开放式网络互联标准

                        OSI网络参考模型:全球网络互联标准

                        TCP/IP网络模型:事实上的国际标准

                

                3.传输层的2个通信协议       

                        UDP:用户数据报协议

                        特点:

                                无连接、不可靠通信,通信效率高

                                不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。

                                发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的 。

                        应用场景:语音通话、视频直播

                        TCP:传输控制协议 

                        特点:

                                面向连接、可靠通信

                                要保证在不可靠的信道上实现可靠的传输

                        TCP主要有三个步骤实现可靠传输:

                                三次握手建立可靠连接:目的确定通信双方,收发消息都是正常无问题的!(全双工)

                                传输数据进行确认:目的保证传输数据的可靠性

                                四次挥手断开连接:目的确保双方数据的收发都已经完成!

                        应用场景:网页、文件下载、支付

4.UDP通信-快速入门

        Java提供了一个java.net.DatagramSocket类来实现UDP通信。

        构造器、方法:

        

        客户端实现步骤:

                创建DatagramSocket对象(客户端对象)​​​​​

                创建DatagramPacket对象封装需要发送的数据(数据包对象)

                使用DatagramSocket对象的send方法,传入DatagramPacket对象

                释放资源

        服务端实现步骤​​ 

                创建DatagramSocket对象并指定端口(服务端对象)

                创建DatagramPacket对象接收数据(数据包对象)

                使用DatagramSocket对象的receive方法,传入DatagramPacket对象

                释放资源

package com.itheima.day13.teacher.demo01_udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 */
public class Sender {
    public static void main(String[] args) throws Exception {
        //1. 创建DatagramSocket对象:因为它提供了收发udp数据包的方法
        DatagramSocket ds = new DatagramSocket();

        //2. 准备数据包
        byte[] data = "hello".getBytes();
        DatagramPacket packet =
           new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 7788);

        //3. 把数据包里的数据发送出去
        ds.send(packet);

        //4. 释放资源
        ds.close();
    }
}


----------------
package com.itheima.day13.teacher.demo01_udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 */
public class Receiver {
    public static void main(String[] args) throws Exception {
        //1. 创建DatagramSocket对象,并监听7788端口
        DatagramSocket ds = new DatagramSocket(7788);

        //2. 准备数据包。用于存储 接收到的数据。UDP的数据包64K
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        //3. 接收数据。接收到的数据会被放到packet对象里
        ds.receive(packet);

        //4. 把接收到的数据打印出来
        String str =
           new String(packet.getData(), packet.getOffset(), packet.getLength());
        System.out.println("str = " + str);

        //5. 释放资源
        ds.close();
    }
}

        

5.UDP通信-多发多收

        客户端实现步骤:

                创建DatagramSocket对象(发送端对象)

                使用while死循环不断的接收用户的数据输入,如果用户输入的exit则退出程序

                如果用户输入的不是exit, 把数据封装成DatagramPacket

                使用DatagramSocket对象的send方法将数据包对象进行发送

                释放资源

        服务端实现步骤:

                创建DatagramSocket对象并指定端口(接收端对象)

                创建DatagramPacket对象接收数据(数据包对象)

                使用DatagramSocket对象的receive方法传入DatagramPacket对象

                使用while死循环不断的进行第3步

        

package com.itheima.day13.teacher.demo03_udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/**
 * 1. 发送的消息内容,由用户进行输入:用Scanner
 *      Scanner scanner = new Scanner(System.in);
 *      String line = scanner.nextLine();
 * 2. 可以多次发送消息,进行持续通信
 *      发送者持续多次发送
 *      如果用户输入的是“byebye”,就结束循环
 */
public class Sender {
    public static void main(String[] args) throws Exception {
        //1. 创建DatagramSocket对象:因为它提供了收发udp数据包的方法
        DatagramSocket ds = new DatagramSocket();

        //2. 准备一个扫描器,用于读取用户的输入
        Scanner scanner = new Scanner(System.in);

        //3. 持续通信:不断读取用户的输入,把内容发送出去
        while (true) {
            //读取用户输入的内容
            String line = scanner.nextLine();
            //封装到数据包里
            byte[] data = line.getBytes();
            DatagramPacket packet =
                    new DatagramPacket(data, data.length, InetAddress.getLocalHost(), 7788);
            //把数据包里的数据发送出去
            ds.send(packet);
            //如果用户输入的是byebye,就结束循环
            if ("byebye".equals(line)) {
                break;
            }
        }

        //4. 释放资源
        ds.close();
    }
}


---------------------
package com.itheima.day13.teacher.demo03_udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * @author liuyp
 * @since 2024/02/28
 */
public class Receiver {
    public static void main(String[] args) throws Exception {
        //1. 创建DatagramSocket对象,并监听7788端口
        DatagramSocket ds = new DatagramSocket(7788);

        //2. 准备数据包。用于存储 接收到的数据。UDP的数据包64K
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        //3. 持续通信:不断的接收数据并打印出来
        while (true) {
            //4. 接收数据。接收到的数据会被放到packet对象里
            ds.receive(packet);

            //5. 把接收到的数据打印出来
            String str =
                    new String(packet.getData(), packet.getOffset(), packet.getLength());

            System.out.println(packet.getSocketAddress() +"发送了: " + str);
        }

        //5. 释放资源
        // ds.close();
    }
}

6.TCP通信-快速入门     

        1.Java提供了一个java.net.Socket类来实现TCP通信。

                2.客户端实现步骤

                创建客户端的Socket对象,请求与服务端的连接。           

                使用socket对象调用getOutputStream()方法得到字节输出流。

                使用字节输出流完成数据的发送。

                释放资源:关闭socket管道。

        3.服务端实现步骤

                创建ServerSocket对象,注册服务端端口。

                调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。

                通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。

                释放资源:关闭socket管道

package com.itheima.day13.teacher.demo04_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

/**
 */
public class Client{
    public static void main(String[] args) throws IOException {
        //1. 使用TCP连接 本机的8888端口:创建Socket对象
        Socket socket = new Socket("127.0.0.1", 8888);

        //2. 通过Socket,把数据发出去到服务端
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF("hello");

        //3. 通过Socket,接收服务端返回的数据
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String answer = dis.readUTF();
        System.out.println("收到服务端返回结果:" + answer);

        //4. 释放资源
        dis.close();
        dos.close();
        socket.close();
    }
}

----------------------
package com.itheima.day13.teacher.demo04_tcp;

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author liuyp
 * @since 2024/02/28
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //1. 监听8888端口:创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(8888);

        //2. 获取客户端的连接:Socket对象。是阻塞方法。如果没有客户端连接进来,就一直阻塞等待
        Socket socket = serverSocket.accept();

        //3. 通过Socket,接收客户端发过来的数据
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String data = dis.readUTF();
        System.out.println("接收到客户端发来的数据:" + data);

        //4. 通过Socket,给客户端返回数据
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF("hi");

        //5. 释放资源
        dos.close();
        dis.close();
        socket.close();
        serverSocket.close();
    }
}

7.TCP通信-多发多收   

        客户端使用死循环,让用户不断输入消息。

        服务端也使用死循环,控制服务端收完消息,继续等待接收下一个消息。

package com.itheima.day13.teacher.demo05_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

/**
 * 1. 客户端给服务端发送的内容:由用户输入
 * 2. 实现客户端和服务端的持续通信
 */
public class Client{
    public static void main(String[] args) throws IOException {
        //1. 使用TCP连接 本机的8888端口:创建Socket对象
        Socket socket = new Socket("127.0.0.1", 8888);

        Scanner scanner = new Scanner(System.in);
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        DataInputStream dis = new DataInputStream(socket.getInputStream());

        while (true) {
            //2. 通过Socket,把数据发出去到服务端:使用Scanner读取用户输入的内容,把内容发出去
            String line = scanner.nextLine();
            dos.writeUTF(line);

            //3. 通过Socket,接收服务端返回的数据
            String answer = dis.readUTF();
            System.out.println("收到服务端返回结果:" + answer);

            //如果用户输入的内容是byebye,就结束
            if ("byebye".equals(line)) {
                break;
            }
        }

        //4. 释放资源
        dis.close();
        dos.close();
        socket.close();
    }
}


-----------------
package com.itheima.day13.teacher.demo05_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author liuyp
 * @since 2024/02/28
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //1. 监听8888端口:创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(8888);

        //2. 获取客户端的连接:Socket对象。是阻塞方法。如果没有客户端连接进来,就一直阻塞等待
        Socket socket = serverSocket.accept();

        DataInputStream dis = new DataInputStream(socket.getInputStream());
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        while (true) {
            //3. 通过Socket,接收客户端发过来的数据
            String data = dis.readUTF();
            System.out.println("接收到客户端发来的数据:" + data);

            //4. 通过Socket,给客户端返回数据
            dos.writeUTF("hi");

            if ("byebye".equals(data)) {
                break;
            }
        }

        //5. 释放资源
        dos.close();
        dis.close();
        socket.close();
        serverSocket.close();
    }
}

8.TCP通信-同时接收多个客户端

        主线程定义了循环负责接收客户端Socket管道连接 

        每接收到一个Socket通信管道后分配一个独立的线程负责处理它。

package com.itheima.day13.teacher.demo06_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

/**
 */
public class ServerWorkerRunnable implements Runnable{
    private Socket socket;

    public ServerWorkerRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            while (true) {
                //通过Socket,接收客户端发过来的数据。也是阻塞方法,即:如果当前socket里没有数据可读取,就阻塞
                String data = dis.readUTF();
                System.out.println("接收到客户端发来的数据:" + data);
                //通过Socket,给客户端返回数据
                dos.writeUTF("hi");

                if ("byebye".equals(data)) {
                    break;
                }
            }
            //释放资源
            dos.close();
            dis.close();
            socket.close();
        } catch (IOException e) {
            System.out.println("连接已断开");
        }
    }
}


--------------------
package com.itheima.day13.teacher.demo06_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //1. 监听8888端口:创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(8888);

        //2. 死循环:不断尝试接受客户端的连接。有几个客户端连接进来,就接受几个连接
        while (true) {
            //3. 获取客户端的连接:Socket对象。是阻塞方法。如果没有客户端连接进来,就一直阻塞等待
            Socket socket = serverSocket.accept();

            //4. 创建一个线程,由这个新线程专门负责它的通信。线程本身是异步的
            new Thread(new ServerWorkerRunnable(socket)).start();
        }

        // serverSocket.close();
    }
}


----------------
package com.itheima.day13.teacher.demo06_tcp;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

/**
 * 1. 客户端给服务端发送的内容:由用户输入
 * 2. 实现客户端和服务端的持续通信
 */
public class Client{
    public static void main(String[] args) throws IOException {
        //1. 使用TCP连接 本机的8888端口:创建Socket对象
        Socket socket = new Socket("127.0.0.1", 8888);

        Scanner scanner = new Scanner(System.in);
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        DataInputStream dis = new DataInputStream(socket.getInputStream());

        while (true) {
            //2. 通过Socket,把数据发出去到服务端:使用Scanner读取用户输入的内容,把内容发出去
            String line = scanner.nextLine();
            dos.writeUTF(line);

            //3. 通过Socket,接收服务端返回的数据
            String answer = dis.readUTF();
            System.out.println("收到服务端返回结果:" + answer);

            //如果用户输入的内容是byebye,就结束
            if ("byebye".equals(line)) {
                break;
            }
        }

        //4. 释放资源
        dis.close();
        dos.close();
        socket.close();
    }
}

9.TCP通信-综合案例

        1.即时通信-群聊

                是指一个客户端把消息发出去,其他在线的全部客户端都可以收到消息。

                需要用到端口转发的设计思想。

                        服务端需要把在线的Socket管道存储起来,一旦收到一个消息要推送给其他管道。

        2.实现一个简易版的BS架构 

                BS架构的基本原理

        

package com.itheima.day13.teacher.demo07_tcp_tomcat;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 */
public class TomcatWorkerRunnable implements Runnable {
    private Socket socket;

    public TomcatWorkerRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        // while (true) {
        try {
            //如果想要接收客户端提交过来的数据
            // InputStream is = socket.getInputStream();
            // is.read();


            //直接给客户端返回结果
            OutputStream os = socket.getOutputStream();
            os.write("HTTP/1.1 200\r\n".getBytes());
            os.write("Content-Type: text/html;charset=UTF-8\r\n".getBytes());
            os.write("\r\n".getBytes());
            os.write("<h1>Hello World!!!</h1>".getBytes());
            os.write("<a href='http://www.baidu.com'>百度</a>".getBytes());

            //必须给浏览器返回一个结束标志,否则浏览器会一直转圈
            socket.shutdownOutput();
        } catch (IOException e) {
            System.out.println("断开连接");
        }
        // }
    }
}


----------------------
package com.itheima.day13.teacher.demo07_tcp_tomcat;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 */
public class TomcatServer {
    public static void main(String[] args) throws IOException {
        //1. 监听8080端口。浏览器访问地址的格式 http://ip地址:8080
        ServerSocket serverSocket = new ServerSocket(8080);

        //2. 死循环
        while (true) {
            //3. 不断尝试接受客户端的连接,得到Socket
            Socket socket = serverSocket.accept();
            //4. 把socket交给一个新线程进行处理
            new Thread(new TomcatWorkerRunnable(socket)).start();
        }
    }
}

        

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cloud整合Zookeeper代替Eureka

微服务间通信重构与服务治理笔记-CSDN博客 Zookeeper是一个分布式协调工具,可以实现注册中心功能 安装Zookeeper 随便 就用最新版本吧 进入Zookeeper 包目录 cd /usr/local/develop/ 解压 tar -zxvf apache-zookeeper-3.9.1-bin.tar.gz -C /usr/local/develop 进入配置文件…

electron nsis 安装包 window下任务栏无法正常固定与取消固定 Pin to taskbar

问题 win10系统下&#xff0c;程序任务栏在固定后取消固定&#xff0c;展示的程序内容异常。 排查 1.通过论坛查询&#xff0c;应该是与app的api setAppUserModelId 相关 https://github.com/electron/electron/issues/3303 2.electron-builder脚本 electron-builder…

VUE CLI3项目搭建 ESLint配置

VUE项目框架配置 一、工具准备 Node.js安装 安装方法&#xff1a;点击查看WebStorm安装 下载地址&#xff1a;点击查看 二、环境准备 镜像准备 1.查看代理&#xff1a;npm get registry 2.设置淘宝镜像 2.1临时使用. npm --registry https://registry.npm.taobao.org ins…

vue 使用vue-scroller 列表滑动到底部加载更多数据

安装插件 npm install vue-scroller -dmain.js import VueScroller from vue-scroller Vue.use(VueScroller)<template><div class"wrap"><div class"footer"><div class"btn" click"open true">新增</d…

LeetCode --- 三数之和

题目描述 三数之和 代码解析 暴力 在做这一道题的时候&#xff0c;脑海里先想出来的是暴力方法&#xff0c;一次排序&#xff0c;将这个数组变为有序的&#xff0c;再通过三次for循环来寻找满足条件的数字&#xff0c;然后将符合条件的数组与之前符合条件的数组进行一一对比…

Matlab 机器人工具箱 运动学

文章目录 R.fkine()R.ikine()R.ikine6s()R.jacob0、R.jacobn、R.jacob_dotjtrajctraj参考链接官网:Robotics Toolbox - Peter Corke R.fkine() 正运动学,根据关节坐标求末端执行器位姿 mdl_puma560; % 加载puma560模型 qz % 零角度 qr

Spring学习笔记(六)利用Spring的jdbc实现学生管理系统的用户登录功能

一、案例分析 本案例要求学生在控制台输入用户名密码&#xff0c;如果用户账号密码正确则显示用户所属班级&#xff0c;如果登录失败则显示登录失败。 &#xff08;1&#xff09;为了存储学生信息&#xff0c;需要创建一个数据库。 &#xff08;2&#xff09;为了程序连接数…

备战蓝桥杯Day21 - 堆排序的内置模块+topk问题

一、内置模块 在python中&#xff0c;堆排序已经设置好了内置模块&#xff0c;不想自己写的话可以使用内置模块&#xff0c;真的很方便&#xff0c;但是堆排序算法的底层逻辑最好还是要了解并掌握一下的。 使用heapq模块的heapify()函数将列表转换为堆&#xff0c;然后使用he…

CVPR2023 RIFormer, 无需TokenMixer也能达成SOTA性能的极简ViT架构

编辑 | Happy 首发 | AIWalker 链接 | https://mp.weixin.qq.com/s/l3US8Dsd0yNC19o7B1ZBgw project, paper, code Token Mixer是ViT骨干非常重要的组成成分&#xff0c;它用于对不同空域位置信息进行自适应聚合&#xff0c;但常规的自注意力往往存在高计算复杂度与高延迟问题…

记录一次架构优化处理性能从3千->3万

0.背景 优化Kafka消费入Es&#xff0c;适配600台设备上报数据&#xff0c;吞吐量到达2万每秒 1.环境配置 2.压测工具 3.未优化之前的消费逻辑 4.优化之后的消费流程 5.多线程多ESclient 6.修改ES配置&#xff0c;增加kafka分区&#xff0c;增加线程&#xff0c;提升吞吐量 7.…

pytest多重断言插件-pytest-assume

最近准备废弃之前用metersphere做的接口自动化&#xff0c;转战pytest了&#xff0c;先来分享下最近接触到的一个插件&#xff1a;pytest-assume。 在使用这个插件之前&#xff0c;如果一个用例里面有多个断言的话&#xff0c;前面的断言失败了&#xff0c;就不会去执行后面的断…

vite+vue3图片引入方式不生效解决方案

vitevue3图片引入方式不生效解决方案 引入方式改成 const wordImgnew URL(/src/assets/MicsosoftWord.png,import.meta.url).href;原理

Pycharm的下载安装与汉化

一.下载安装包 1.接下来按照步骤来就行 2.然后就能在桌面上找到打开了 3.先建立一个文件夹 二.Pycharm的汉化

Unity--自动版面(Horizontal Layout Croup)||Unity--自动版面(Vertical Layout Group)

Unity--自动版面&#xff08;Horizontal Layout Croup&#xff09; Horizontal Layout Croup&#xff1a; “水平布局组”组件将其子布局元素并排放置。它们的宽度由各自的最小&#xff0c;首选和灵活的宽度决定&#xff0c;具体取决于以下模型&#xff1a; 所有子布局元素的…

python模块和包概念与使用

python模块和包概念与使用 Python模块与包的关键概念 在Python编程中&#xff0c;模块和包是代码组织和管理的基石。以下是关于Python模块与包的核心要点&#xff1a; 模块&#xff1a; 模块是一个包含Python代码的.py文件&#xff0c;它可以定义函数、类、变量等。通过导入模…

● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数

● 70. 爬楼梯 &#xff08;进阶&#xff09; 题目&#xff1a;57. 爬楼梯 题目描述&#xff1a; 根据示例&#xff1a; 可知1到m的阶数可以重复选择&#xff0c;跳了1阶之后还能跳一阶&#xff0c;所以是完全背包&#xff0c;又因为考虑了顺序问题&#xff0c;所以是完全背包的…

排序(4)——堆排序

目录 堆排序&#xff08;回顾&#xff09; 基本思路 代码实现 向下调整排序 AdjustDown 建堆排序 时间复杂度 特性总结 堆排序&#xff08;回顾&#xff09; 重点回顾戳&#x1f449;堆排序 基本思路 堆排序(Heapsort)是指利用堆积树&#xff08;堆&#xff09;这种数…

备战蓝桥杯---动态规划的一些思想1

话不多说&#xff0c;直接看题&#xff1a; 目录 1.双线程DP 2.正难则反多组DP 3.换个方向思考&#xff1a; 1.双线程DP 可能有人会说直接贪心&#xff1a;先选第1条的最优路径&#xff0c;再选第2条最优路径。 其实我们再选第1条时&#xff0c;我们怎么选会对第2条的路径…

【leetcode】有效的括号

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 点击查看题目 思路: 实现栈在上个博客中已经写过&#xff0c;在这就不在赘述 点击进入博客&#xff1a;【数…

vscode如何远程到linux python venv虚拟环境开发?(python虚拟环境、vscode远程开发、vscode远程连接)

文章目录 1. 安装VSCode2. 安装扩展插件3. 配置SSH连接4. 输入用户名和密码5. 打开远程文件夹6. 创建/选择Python虚拟环境7. 安装Python插件 Visual Studio Code (VSCode) 提供了一种称为 Remote Development 的功能&#xff0c;允许用户在远程系统、容器或甚至 Windows 子系统…