JavaSE进阶(day12,复习自用)

news2024/11/17 16:15:54

网络编程(通信)

  • 网络通信三要素
    • 三要素概述、要素一:IP地址
    • IP地址操作类-InetAddress
    • 要素二:端口号
    • 要素三:协议
  • UDP通信-快速入门
  • UDP通信-广播、组播
  • TCP通信-快速入门
    • 编写客户端代码
    • 编写服务端代码、原理分析
  • TCP通信-多发多收消息
  • TCP通信-同时接受多个客户端消息
  • TCP通信-使用线程池优化
  • TCP通信实战案例-即时通信
  • TCP通信实战案例-模拟BS系统

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

网络通信三要素

在这里插入图片描述

三要素概述、要素一:IP地址

IP地址:设备在网络中的地址,是唯一的标识。

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

协议: 数据在网络中传输的规则,常见的协议有UDP协议和TCP协议。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

IP地址操作类-InetAddress

在这里插入图片描述

要素二:端口号

在这里插入图片描述

要素三:协议

连接和通信数据的规则被称为网络通信协议
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

UDP通信-快速入门

UDP是一种无连接、不可靠传输的协议。
将数据源IP、目的地IP和端口以及数据封装成数据包,大小限制在64KB内,直接发送出去即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/*
    发送端 一发 一收
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        System.out.println("==========客户端启动==========");

        //1.创建发送端对象:发送端自带默认的端口号
        DatagramSocket socket = new DatagramSocket(6666);

        //2.创建一个数据包对象封装数据(韭菜盘子)
       /* public DatagramPacket(byte buf[], int length,
        InetAddress address, int port)
        参数一:封装要发送的数据(韭菜)
        参数二:发送数据的大小
        参数三:服务端的主机IP地址
        参数四:服务端的端口
        */
        byte[] buffer = "我是一颗快乐的韭菜,你愿意吃吗?".getBytes();
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),8888);

        //3.发送数据出去
        socket.send(packet);

        socket.close();

    }
}
/*
    接收端
 */
public class ServerDemo2 {
    public static void main(String[] args) throws Exception {
        System.out.println("==========服务端启动==========");

        //1.创建接收端对象:注册端口(人)
        DatagramSocket socket = new DatagramSocket(8888);

        //2.创建一个数据包对象接受数据(韭菜盘子)
        byte[] buffer = new byte[1024*64];
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length);

        //3.等待接收数据即可
        socket.receive(packet);

        //4.取出数据即可
        //读取多少倒出多少
        int len = packet.getLength();
        String rs = new String(buffer,0,len);
        System.out.println("收到了:" + rs);

        //获取发送端的ip和端口
//        System.out.println(packet.getSocketAddress());//这样也对,比老师的更方便
        String ip = packet.getSocketAddress().toString();
        System.out.println("对方地址:"+ ip);
        int port = packet.getPort();
        System.out.println("对方端口:" + port);


        socket.close();


    }
}

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

/*
    发送端 多发多收
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        System.out.println("==========客户端启动==========");

        //1.创建发送端对象:发送端自带默认的端口号
        DatagramSocket socket = new DatagramSocket(7777);

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();
            if("exit".equals(msg)){
                System.out.println("离线成功!");
                socket.close();
                break;
            }
            //2.创建一个数据包对象封装数据(韭菜盘子)
            byte[] buffer = msg.getBytes();
            DatagramPacket packet = new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),8888);

            //3.发送数据出去
            socket.send(packet);
        }
    }
}

/*
    接收端
 */
public class ServerDemo2 {
    public static void main(String[] args) throws Exception {
        System.out.println("==========服务端启动==========");

        //1.创建接收端对象:注册端口(人)
        DatagramSocket socket = new DatagramSocket(8888);

        //2.创建一个数据包对象接受数据(韭菜盘子)
        byte[] buffer = new byte[1024*64];
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length);

        while (true) {
            //3.等待接收数据即可
            socket.receive(packet);

            //4.取出数据即可
            //读取多少倒出多少
            int len = packet.getLength();
            String rs = new String(buffer,0,len);
            System.out.println("收到了来自:" + packet.getAddress()+",对方端口是"+packet.getPort()+"的消息:"+rs);
        }
    }
}

UDP通信-广播、组播

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

TCP通信-快速入门

TCP是一种面向连接,安全、可靠的传输数据的协议
传输前,采用“三次握手”方式,点对点通信,是可靠的
在连接中可进行大数据量的传输

在这里插入图片描述

编写客户端代码

在这里插入图片描述

/*
    目标:完成Socket网络编程入门案例的客户端开发,一发一收
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.println("=========客户端启动=========");
            //1.创建Socket通信管道请求有服务器的连接
            //public Socket(String host,int port)
            //参数一:服务端的IP地址
            //参数二:服务端的端口
            Socket socket = new Socket("127.0.0.1",7777);

            //2.从socket通信管道中得到一个字节输出流 负责发送数据
            OutputStream os = socket.getOutputStream();

            //3.把低级的字节流包装成打印流
            PrintStream ps = new PrintStream(os);

            //4.发送消息
            ps.println("我是TCP的客户端,我已经与你对接,并发出邀请:约吗?");
            ps.flush();

            //关闭资源
//            socket.close();




        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

编写服务端代码、原理分析

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

/*
    目标:开发Socket网络编程入门代码的服务端:实现接收消息
 */
public class ServerDemo2 {
    public static void main(String[] args) {
        try {
            System.out.println("=========服务端启动成功!=========");
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(7777);
            //2.必须调用accept方法,等待接收客户端的Socket连接请求,建立Socket通信管道
            Socket socket = serverSocket.accept();
            //3.从socket通信管道中得到一个字节输入流
            InputStream is = socket.getInputStream();
            //4.把字节输入流包装成缓冲字符输入流进行消息的接收
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //5.按照行读取消息
            String msg;
            if ((msg = br.readLine())!=null){
                System.out.println(socket.getRemoteSocketAddress() + "说了:" + msg);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

TCP通信-多发多收消息

在这里插入图片描述本案例实现了多发多收,那么是否可以同时接收多个客户端的消息?
不可以的。
因为服务端现在只有一个线程,只能与一个客户端进行通信。
本次多发多收是如何实现的
客户端使用循环反复地发送消息。
服务端使用循环反复地接收消息。
现在服务端为什么不可以同时接收多个客户端的消息。
目前服务端是单线程的,每次只能处理一个客户端的消息。

/*
    目标:实现多发和多收
 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.println("=========客户端启动=========");
            //1.创建Socket通信管道请求有服务器的连接
            //public Socket(String host,int port)
            //参数一:服务端的IP地址
            //参数二:服务端的端口
            Socket socket = new Socket("127.0.0.1",7777);

            //2.从socket通信管道中得到一个字节输出流 负责发送数据
            OutputStream os = socket.getOutputStream();

            //3.把低级的字节流包装成打印流
            PrintStream ps = new PrintStream(os);

            Scanner sc = new Scanner(System.in);
            while (true) {
                System.out.println("请说:");
                String msg = sc.nextLine();
                //4.发送消息
                ps.println(msg);
                ps.flush();
            }

            //关闭资源
//            socket.close();




        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/*
    目标:开发Socket网络编程入门代码的服务端:实现接收消息
 */
public class ServerDemo2 {
    public static void main(String[] args) {
        try {
            System.out.println("=========服务端启动成功!=========");
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(7777);
            //2.必须调用accept方法,等待接收客户端的Socket连接请求,建立Socket通信管道
            Socket socket = serverSocket.accept();
            //3.从socket通信管道中得到一个字节输入流
            InputStream is = socket.getInputStream();
            //4.把字节输入流包装成缓冲字符输入流进行消息的接收
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //5.按照行读取消息
            String msg;
            while ((msg = br.readLine())!=null){
                System.out.println(socket.getRemoteSocketAddress() + "说了:" + msg);
            }



        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

TCP通信-同时接受多个客户端消息

如何才可以让服务端可以处理多个客户端的通信需求?
引入多线程。

public class ServerReaderThread extends Thread{
    private Socket socket;
    public ServerReaderThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //3.从socket通信管道中得到一个字节输入流
            InputStream is = socket.getInputStream();
            //4.把字节输入流包装成缓冲字符输入流进行消息的接收
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //5.按照行读取消息
            String msg;
            while ((msg = br.readLine())!=null){
                System.out.println(socket.getRemoteSocketAddress() + "说了:" + msg);
            }
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线了!!!");
        }
    }
}

/*
    目标:实现服务端可以同时处理多个客户端的消息
 */
public class ServerDemo2 {
    public static void main(String[] args) {
        try {
            System.out.println("=========服务端启动成功!=========");
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(7777);
            //a.定义一个死循环由主线程负责不断的接收客户端Socket管道连接
            while (true) {
                //2.每接收到一个客户端的Socket管道,交给一个独立的子线程负责读取消息
                Socket socket = serverSocket.accept();
                System.out.println(socket.getRemoteSocketAddress() + "它来了,上线了");
                //3.开始创建独立线程处理socket
                new ServerReaderThread(socket).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

本次是如何实现服务端接收多个客户端的消息的。
主线程定义了循环负责接收客户端Socket管道连接
每接收到一个Socket通信管道后分配一个独立的线程负责处理它。

TCP通信-使用线程池优化

public class SereverReaderRunnable implements Runnable{
    private Socket socket;
    public SereverReaderRunnable(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //3.从socket通信管道中得到一个字节输入流
            InputStream is = socket.getInputStream();
            //4.把字节输入流包装成缓冲字符输入流进行消息的接收
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //5.按照行读取消息
            String msg;
            while ((msg = br.readLine())!=null){
                System.out.println(socket.getRemoteSocketAddress() + "说了:" + msg);
            }
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线了!!!");
        }
    }
}

/*
    目标:实现服务端可以同时处理多个客户端的消息
 */
public class ServerDemo2 {

    //使用静态变量记住一个线程池对象
    private static ExecutorService pool = new ThreadPoolExecutor(3,
            5,6, TimeUnit.SECONDS,new ArrayBlockingQueue<>(2),
            Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());

    public static void main(String[] args) {
        try {
            System.out.println("=========服务端启动成功!=========");
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(6666);
            //a.定义一个死循环由主线程负责不断的接收客户端Socket管道连接
            while (true) {
                //2.每接收到一个客户端的Socket管道
                Socket socket = serverSocket.accept();
                System.out.println(socket.getRemoteSocketAddress() + "它来了,上线了");
                //任务对象负责读取消息
                Runnable target =  new SereverReaderRunnable(socket);
                pool.execute(target);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

TCP通信实战案例-即时通信

即时通信是什么含义,要实现怎么样的设计?
即时通信,是指一个客户端的消息发出去,其他客户端可以接收到。
之前我们的消息都是发给服务端的。
即时通信需要进行端口转发的设计思想。

/*
    目标:实现服务端可以同时处理多个客户端的消息

    1.客户端发送消息
    2.客户端随时可能需要收到消息



 */
public class ClientDemo1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.println("=========客户端启动=========");
            //1.创建Socket通信管道请求有服务器的连接
            //public Socket(String host,int port)
            //参数一:服务端的IP地址
            //参数二:服务端的端口
            Socket socket = new Socket("127.0.0.1",7777);

            //创建一个独立的线程专门负责这个客户端的读消息(服务端随时可能转发消息过来!)
            new ClientReaderThread(socket).start();

            //2.从socket通信管道中得到一个字节输出流 负责发送数据
            OutputStream os = socket.getOutputStream();

            //3.把低级的字节流包装成打印流
            PrintStream ps = new PrintStream(os);

            Scanner sc = new Scanner(System.in);
            while (true) {
                System.out.println("请说:");
                String msg = sc.nextLine();
                //4.发送消息
                ps.println(msg);
                ps.flush();
            }
            //关闭资源
//            socket.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

public class ClientReaderThread extends Thread{
    private Socket socket;
    public ClientReaderThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //3.从socket通信管道中得到一个字节输入流
            InputStream is = socket.getInputStream();
            //4.把字节输入流包装成缓冲字符输入流进行消息的接收
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //5.按照行读取消息
            String msg;
            while ((msg = br.readLine())!=null){
                System.out.println("收到消息:" + msg);
            }
        } catch (Exception e) {
            System.out.println("服务端把你踢出去了~~~");
        }
    }
}

/*
    目标:实现服务端可以同时处理多个客户端的消息
 */
public class ServerDemo2 {
    //定义一个静态的List集合存储当前全部在线的socket管道
    public static List<Socket> allOnlineSocket = new ArrayList<>();
    public static void main(String[] args) {
        try {
            System.out.println("=========服务端启动成功!=========");
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(7777);
            //a.定义一个死循环由主线程负责不断的接收客户端Socket管道连接
            while (true) {
                //2.每接收到一个客户端的Socket管道,交给一个独立的子线程负责读取消息
                Socket socket = serverSocket.accept();
                System.out.println(socket.getRemoteSocketAddress() + "它来了,上线了");
                allOnlineSocket.add(socket);//上线完成
                //3.开始创建独立线程处理socket
                new ServerReaderThread(socket).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public class ServerReaderThread extends Thread{
    private Socket socket;
    public ServerReaderThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //3.从socket通信管道中得到一个字节输入流
            InputStream is = socket.getInputStream();
            //4.把字节输入流包装成缓冲字符输入流进行消息的接收
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //5.按照行读取消息
            String msg;
            while ((msg = br.readLine())!=null){
                System.out.println(socket.getRemoteSocketAddress() + "说了:" + msg);
                //把这个消息进行端口转发给全部客户端socket管道
                sendMsgToAll(msg);
            }
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线了!!!");
            ServerDemo2.allOnlineSocket.remove(socket);
        }
    }

    private void sendMsgToAll(String msg) throws Exception {
        for (Socket socket : ServerDemo2.allOnlineSocket) {
            PrintStream ps = new PrintStream(socket.getOutputStream());
            ps.println(msg);
            ps.flush();
        }
    }
}

TCP通信实战案例-模拟BS系统

1、之前的客户端都是什么样的
其实就是CS架构,客户端实需要我们自己开发实现的。
2、BS结构是什么样的,需要开发客户端吗?
浏览器访问服务端,不需要开发客户端。
在这里插入图片描述

public class ServerReaderRunnable implements Runnable{
    private Socket socket;
    public ServerReaderRunnable(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            // 浏览器 已经与本线程建立了Socket管道
            // 响应消息给浏览器显示
            PrintStream ps = new PrintStream(socket.getOutputStream());
            // 必须响应HTTP协议格式数据,否则浏览器不认识消息
            ps.println("HTTP/1.1 200 OK"); // 协议类型和版本 响应成功的消息!
            ps.println("Content-Type:text/html;charset=UTF-8"); // 响应的数据类型:文本/网页

            ps.println(); // 必须发送一个空行

            // 才可以响应数据回去给浏览器
            ps.println("<span style='color:red;font-size:90px'>《最牛的149期》 </span>");
            ps.close();
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线了!!!");
        }
    }
}

/**
    了解:BS-浏览器-服务器基本了解。

    引入:
        之前客户端和服务端都需要自己开发。也就是CS架构。
        接下来模拟一下BS架构。

    客户端:浏览器。(无需开发)
    服务端:自己开发。
    需求:在浏览器中请求本程序,响应一个网页文字给浏览器显示


 */
public class BSserverDemo {
    // 使用静态变量记住一个线程池对象
    private static ExecutorService pool = new ThreadPoolExecutor(3,
            5, 6, TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(2)
            , Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

    public static void main(String[] args) {
        try {
            // 1.注册端口
            ServerSocket ss = new ServerSocket(8080);
            // 2.创建一个循环接收多个客户端的请求。
            while(true){
                Socket socket = ss.accept();
                // 3.交给一个独立的线程来处理!
                pool.execute(new ServerReaderRunnable(socket));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


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

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

相关文章

30天从入门到精通TensorFlow1.x 第四天,TensorFlow中的计算图或数据流图

文章目录 一、接前一天二、计算图或数据流图1. 什么是计算图或者数据流图2. 为什么需要计算图或者数据流图3. 执行顺序和延迟加载在tf中的使用 一、接前一天 这几天主要学习了张量的创建方法&#xff0c;以及变量&#xff0c;变量命名域共享变量等概念。今天主要熟悉 数据流图…

网络隔离的生物制药企业,怎样实现安全的跨网文件交换?

在数字时代&#xff0c;生物制药企业结合现代技术追求和实现生物科技领域上的突破&#xff0c;研发及生产出更多满足人体健康需求的药物及医疗技术。由于生物制药企业&#xff0c;在进行某一领域的科研时通常周期较长、且涉及很多创新性成果&#xff0c;因此&#xff0c;科研数…

css:CSS 线性渐变linear-gradient

CSS 渐变使您可以显示两种或多种指定颜色之间的平滑过渡。 CSS 定义了两种渐变类型&#xff1a; 线性渐变&#xff08;向下/向上/向左/向右/对角线&#xff09;径向渐变&#xff08;由其中心定义&#xff09; 参考文档 CSS 线性渐变 https://www.w3school.com.cn/css/css3_…

访问学者带孩子去美国何时入境最好?

访问学者带孩子去美国入境的最佳时间会受到多种因素的影响&#xff0c;例如孩子的学校安排、访问学者的工作计划以及家庭的个人喜好。然而&#xff0c;以下是知识人网小编整理的一些常见考虑因素&#xff1a; 1. 学校假期&#xff1a;如果孩子正在就读学校&#xff0c;最佳时间…

uniapp 打包app wgt热更新和整包更新以及更新弹窗动画

app热更新是app项目最常见的功能&#xff0c;接下来我总结了当时做这个功能的过程&#xff0c;来交流学习一哈 热更新的流程步骤 在用户进入app就获取当前版本号与调用后端接口返回的版本号对比是否是最新的版本不是最新弹出弹窗让用户确认是否更新&#xff0c;点击更新下载w…

财务创造价值,如何降本增效?

一、整体成本管控理论 有财务人员可能认为这和我们财务有什么关系&#xff0c;这和财务管理也没有关系。我们经常提到的业务财融合以及成本BP&#xff0c;其实在这里面是需要发挥应有的价值的。如何理解这个问题&#xff1f;无论是老板还是财务人员&#xff0c;一是有财务管理…

2023年测试人前景归途?我主攻自动化测试拿到了25k的offer...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

LeetCode_双指针_中等_86.分隔链表

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。 示例 1&…

JavaEE(系列19) -- 计算机网络初识

目录 1. 网络发展史 2. IP地址和端口号 3. 协议 4. 五元组 6. 协议分层 6.1 OSI 七层模型 6.2 TCP/IP五层&#xff08;或四层&#xff09;模型 7. 协议分层(网络数据传输过程) 7.1 应用层 7.2 传输层(进入了操作系统内核) 7.3 网络层 7.4 数据链路层 7.5 物理层 声明:本文内…

【CSS3+HTML5+JQUERY】------ 实现环形进度条实例代码-(已简单封装)

1. JavaScript代码 circle.js文件: 简单的封装了一下 直接调用方法即可 (function ($$) {var lyCircle {};lyCircle.options{timer:20,circleLeft:.ly-circle-left,elements:"",circleRight:".ly-circle-right",percentSum:0,//百分比bgColor:#00a7ff,bor…

stable diffusion中的u net

Stable Diffusion 包含几个核心的组件&#xff1a; 一个文本编码器&#xff08;在 Stable Diffusion 中使用 CLIP 的 ViT-L/14 的文本编码器&#xff09;&#xff0c;用于将用户输入的 Prompt 文本转化成 text embedding&#xff1b;一个 Image Auto Encoder-Decoder&#xff…

大模型核心技术原理: Transformer架构详解

在大模型发展历程中&#xff0c;有两个比较重要点&#xff1a;第一&#xff0c;Transformer 架构。它是模型的底座&#xff0c;但 Transformer 不等于大模型&#xff0c;但大模型的架构可以基于 Transformer&#xff1b;第二&#xff0c;GPT。严格意义上讲&#xff0c;GPT 可能…

【学习笔记】Python核心技术与实战-基础篇-03列表和元组,到底用哪个?

目录 列表和元组基础概念区别列表和元组的基础操作和注意事项列表和元组存储方式的差异列表和元组的性能列表和元组的使用场景总结思考题 列表和元组基础 概念 列表和元组&#xff0c;都是一个可以放置任意数据类型的有序集合。 在绝大多数编程语言中&#xff0c;集合的数据类…

C++算法:排序之二(归并、希尔、选择排序)

C算法&#xff1a;排序 排序之一&#xff08;插入、冒泡、快速排序&#xff09; 排序之二&#xff08;归并、希尔、选择排序&#xff09; 文章目录 C算法&#xff1a;排序二、比较排序算法实现4、归并排序5、希尔排序5、选择排序 原创文章&#xff0c;未经许可&#xff0c;严禁…

从vue2到vue3的生命周期

1.vue2 在vue2.x中的生命周期为 beforeCreate created beforeMount mounted beforeUpdate updated beforeDestroy destroyed activated deactivated errorCaptured 在vue3中&#xff0c;新增了一个setup生命周期函数&#xff0c;setup执行的时机是在beforeCreate生命函数之前…

count(0)、count(1)和count(*)、count(列名) 的区别

当我们对一张数据表中的记录进行统计的时候&#xff0c;习惯都会使用 count 函数来统计&#xff0c;但是 count 函数传入的参数有很多种&#xff0c;比如 count(1)、count(*)、count(字段) 等。 到底哪种效率是最好的呢&#xff1f;是不是 count(*) 效率最差&#xff1f; 一.…

【Mysql数据库从0到1】-入门基础篇--sql语句简单使用

【Mysql数据库从0到1】-入门基础篇--sql语句简单使用 &#x1f53b;一、数据库创建、删除、选择1.1 &#x1f343; create database 创建数据库1.2 &#x1f343; 使用 mysqladmin 创建数据库1.3 &#x1f343; drop 命令删除数据库--一般不建议在数据库执行delete、drop等命令…

公司招人面试了一个00后,绝对能称为是内卷届的天花板

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资也不低&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。令我印象最深的是一个00后测试员&#xff0c;他…

【商品页面详情页+商品评论】API接口技术交流,封装接口

商品详情API接口数据&#xff1a;提供了商品的基本信息&#xff0c;包括商品名称、描述、规格、价格、销量、库存等信息。此外&#xff0c;也可以通过提供的API接口来获取商品的图片、评价、物流信息等详细数据。 商品评论接口是消费者对商品所进行的客观评价 电商API的应用价…

使用geoserver发布shp和tiff数据

一、安装并启动geoserver服务 1.1 下载geoserver 进入官网下载 由于geoserver是使用Java语言开发的&#xff0c;所以运行需要java的环境&#xff0c;不同geoserver的版本号对java的版本要求不同&#xff0c;所以选择版本时需注意对应java的版本要求&#xff0c;由于我本地安…