Day19-【Java SE进阶】网络编程

一、网络编程

1.概述
  • 可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。
  • java.net,*包下提供了网络编程的解决方案!

基本的通信架构
基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)。

在这里插入图片描述

在这里插入图片描述
网络通信的关键三要素
在这里插入图片描述
IP地址

  • IP(Internet Protocol):全称”互联网协议地址”,是分配给上网设备的唯一标志。
  • IP地址有两种形式:IPV4、IPV6

在这里插入图片描述

  • IPv6:共128位,号称可以为地球每一粒沙子编号。
  • IPV6分成8段表示,每段每四位编码成一个十六进制位表示,数之间用冒号(:)分开。

在这里插入图片描述
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地址:检查网络是否连通。

1.1 InetAddress
  • 代表IP地址。
    -

端口

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

分类

  • 周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)
  • 注册端口:1024~49151,分配给用户进程或某些应用程序。
  • 动态端口:49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配。
  • 注意:我们自己开发的程序一般选择使用注册端口,且一个设备中不能出现两个程序的端口号一样,否则出错。

通信协议

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

开放式网络互联标准:OSI网络参考模型

  • OSI网络参考模型:全球网络互联标准。
  • TCP/IP网络模型:事实上的国际标准。
    在这里插入图片描述
1.2 重要知识点:传输层的2个通信协议
  • UDP(User Datagram Protocol):用户数据报协议;
  • TCP(Transmission ControlProtocol):传输控制协议。

UDP协议

  • 特点:无连接、不可靠通信。
  • 通讯效率高!语音通话 视频直播
  • 不事先建立连接,数据按照包发,一包数据包含:自己的IP、程序端口,目的地IP、程序端口和数据(限制在64KB内)等。
  • 发送方不管对方是否在线,数据在中间丢失也不管,如果接收方收到数据也不返回确认,故是不可靠的。

TCP协议

  • 特点:面向连接、可靠通信。
  • 通信效率相对不高 网页 文件下载 支付
  • TCP的最终目的:要保证在不可靠的信道上实现可靠的传输。
  • TCP主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接。
  • TCP协议:三次握手建立可靠连接
    • 可靠连接:确定通信双方,收发消息都是正常无问题的!(全双工)
    • 传输数据会进行确认,以保证数据传输的可靠性在这里插入图片描述
  • TCP协议:四次握手断开连接
    • 目的:确保双方数据的收发都已经完成!

在这里插入图片描述

在这里插入图片描述

2. UDP通信-快速入门

UDP通信

  • 特点:无连接、不可靠通信。
  • 不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端IP、等信息封装成一个数据包,发出去就不管了。
  • Java提供了一个java.net.DatagramSocket类来实现UDP通信。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
import java.net.*;

public class Client {
    public static void main(String[] args) throws Exception {
        //1. 创建客户端对象(发韭菜出去的人)
        DatagramSocket socket = new DatagramSocket();

        //2. 创建数据包对象封装要发出去得数据(创建一个韭菜盒子)
        /* public DatagramPacket(byte buf[], int length,InetAddress address,int port)
        参数一:封装要发出去的数据。
        参数二:发送出去的数据大小(字节个数)
        参数三:服务端的IP地址(找到服务端主机)
        参数四:服务端程序的端口。
        */
        byte[] bytes = "我是客户端,向您发送数据!".getBytes();
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length,
                InetAddress.getLocalHost(),6666);

        //3. 开始正式发送这个数据包出去了
        socket.send(packet);
        
        System.out.println("客户端数据发送完毕~~~");
        socket.close();//释放资源!
    }
}

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

public class Server {
    public static void main(String[] args) throws Exception {
        //1. 创建一个服务端对象(创建一个接韭菜的人) 注册端口
        DatagramSocket socket = new DatagramSocket(6666);

        //2. 创建一个数据包对象,用于接收数据的(创建一个韭菜盒子)
        byte[] buf = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);

        //3. 开始正式使用数据包来接收客户端发来的数据
        socket.receive(packet);

        //4. 从字节数组中,把接收到的数据直接打印出来
        // 接收多少就倒出多少 获取本次数据包接收了多少数据
        int len = packet.getLength();
        String s = new String(buf, 0, len);
        System.out.println(s);

        String hostAddress = packet.getAddress().getHostAddress();
        int port = packet.getPort();
        System.out.println(hostAddress + ":" + port);

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

在这里插入图片描述
在这里插入图片描述
UDP通信 多发多收
edit configures->allow 多开 apply即可躲开client程序的

package com.jingwei;

import java.net.*;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        //1. 创建客户端对象(发韭菜出去的人)
        DatagramSocket socket = new DatagramSocket();//可以分配端口 或者不填写自动分配

        //2. 创建数据包对象封装要发出去得数据(创建一个韭菜盒子)
        /* public DatagramPacket(byte buf[], int length,InetAddress address,int port)
        参数一:封装要发出去的数据。
        参数二:发送出去的数据大小(字节个数)
        参数三:服务端的IP地址(找到服务端主机)
        参数四:服务端程序的端口。
        */
        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;
            }

            byte[] bytes = msg.getBytes();
            DatagramPacket packet = new DatagramPacket(bytes,bytes.length,
                    InetAddress.getLocalHost(),6666);

            //3. 开始正式发送这个数据包出去了
            socket.send(packet);
        }
        System.out.println("客户端数据发送完毕~~~");
    }
}

package com.jingwei;

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

public class Server {
    public static void main(String[] args) throws Exception {
        //1. 创建一个服务端对象(创建一个接韭菜的人) 注册端口
        DatagramSocket socket = new DatagramSocket(6666);

        //2. 创建一个数据包对象,用于接收数据的(创建一个韭菜盒子)
        byte[] buf = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);

        while (true) {
            //3. 开始正式使用数据包来接收客户端发来的数据
            socket.receive(packet);

            //4. 从字节数组中,把接收到的数据直接打印出来
            // 接收多少就倒出多少 获取本次数据包接收了多少数据
            int len = packet.getLength();
            String s = new String(buf, 0, len);
            System.out.println(s);

            String hostAddress = packet.getAddress().getHostAddress();
            int port = packet.getPort();
            System.out.println(hostAddress + ":" + port);
            System.out.println("-----------------------");
        }
    }
}

3. TCP通信
  • 特点:面向连接、可靠通信。
  • 通信双方事先会采用“三次握手”方式建立可靠连接,实现端到端的通信;底层能保证数据成功传给服务端。
  • Java提供了一个java.net.Socket类来实现TCP通信。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
一发一收

package com.jingwei;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

public class SocketClient {
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动成功!");
        //1. 创建ServerSocket的对象,同时为服务端注册端口。
        ServerSocket serverSocket = new ServerSocket(8888);
        //2. 使用ServerSocket对象,调用accept方法,等待客户端的连接请求。
        Socket socket = serverSocket.accept();
        //3. 从socket通信管道中得到一个字节输入流
        InputStream is = socket.getInputStream();
        //4. 把原始的字节输入流包装成数据输入流
        DataInputStream dis = new DataInputStream(is);
        //5. 使用数据输入流读取客户端发送过来的消息
        String s = dis.readUTF();
        System.out.println(s);
        //其实我们也可以获取客户端的IP地址
        SocketAddress remoteSocketAddress = socket.getRemoteSocketAddress();
        System.out.println(remoteSocketAddress);

        dis.close();
        socket.close();
    }
}

package com.jingwei;

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

public class SocketServer {
    public static void main(String[] args) throws IOException {
        //1. 创建Socket对象,并同时请求与服务器程序的连接。
        Socket socket = new Socket("127.0.0.1", 8888);

        //2. 从Socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3. 把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        //4. 开始写数据出去了
        dos.writeUTF("在一起好吗?");

        dos.close();

        socket.close();//释放连接资源
    }
}

多发多收

package com.jingwei;

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

public class SocketServer {
    public static void main(String[] args) throws IOException {
        //1. 创建Socket对象,并同时请求与服务器程序的连接。
        Socket socket = new Socket("127.0.0.1", 8888);

        //2. 从Socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3. 把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            //4. 开始写数据出去了
            String msg = sc.nextLine();
            if("exit".equals(msg)){
                dos.close();
                socket.close();
                break;
            }
            dos.writeUTF(msg);
            dos.flush();
        }

//        dos.close();
//
//        socket.close();//释放连接资源
    }
}

package com.jingwei;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

public class SocketClient {
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动成功!");
        //1. 创建ServerSocket的对象,同时为服务端注册端口。
        ServerSocket serverSocket = new ServerSocket(8888);
        //2. 使用ServerSocket对象,调用accept方法,等待客户端的连接请求。
        Socket socket = serverSocket.accept();
        //3. 从socket通信管道中得到一个字节输入流
        InputStream is = socket.getInputStream();
        //4. 把原始的字节输入流包装成数据输入流
        DataInputStream dis = new DataInputStream(is);
        while (true) {
            //5. 使用数据输入流读取客户端发送过来的消息
            try {
                String s = dis.readUTF();
                System.out.println(s);
                //其实我们也可以获取客户端的IP地址
                SocketAddress remoteSocketAddress = socket.getRemoteSocketAddress();
                System.out.println(remoteSocketAddress);
            } catch (IOException e) {
                System.out.println(socket.getRemoteSocketAddress()+"离线了!");
                dis.close();
                socket.close();
                break;
            }
        }
//        dis.close();
//        socket.close();
    }
}

在这里插入图片描述

目前我们开发的服务端程序,是否可以支持与多个客户端同时通信?

  • 不可以的。
  • 因为服务端现在只有一个主线程,只能处理一个客户端的消息,

在这里插入图片描述

package com.jingwei;

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

public class SocketServer {
    public static void main(String[] args) throws IOException {
        //1. 创建Socket对象,并同时请求与服务器程序的连接。
        Socket socket = new Socket("127.0.0.1", 8888);

        //2. 从Socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3. 把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            //4. 开始写数据出去了
            String msg = sc.nextLine();
            if("exit".equals(msg)){
                dos.close();
                socket.close();
                break;
            }
            dos.writeUTF(msg);
            dos.flush();
        }

//        dos.close();
//
//        socket.close();//释放连接资源
    }
}

package com.jingwei;

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

public class SocketClient {
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动成功!");
        //1. 创建ServerSocket的对象,同时为服务端注册端口。
        ServerSocket serverSocket = new ServerSocket(8888);
        //2. 使用ServerSocket对象,调用accept方法,等待客户端的连接请求。
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("有人上线了"+socket.getRemoteSocketAddress());
            new ServerReaderThread(socket).start();
        }
//        dis.close();
//        socket.close();
    }
}


package com.jingwei;

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

public class ServerReaderThread extends Thread{
    private Socket socket;
    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream inputStream = socket.getInputStream();
            DataInputStream dataInputStream = new DataInputStream(inputStream);
            while (true){
                try {
                    String msg = dataInputStream.readUTF();
                    System.out.println(msg);
                } catch (IOException e) {
                    System.out.println(socket.getRemoteSocketAddress()+"下线了");
                    dataInputStream.close();
                    socket.close();
                    break;
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

TCP通信-综合案例

  • 即时通信-群聊
  • 实现一个简易版的BS架构

题目:要求从浏览器中访问服务器
并立即让服务器响应一个很简单的网页给浏览器展示
网页内容就是“我666”

在这里插入图片描述

注意:服务器必须给浏览器响应HTTP协议规定的数据格式,否则浏览器不识别返回的数据

在这里插入图片描述

package com.jingwei;

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

public class SocketClient {
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动成功!");
        //1. 创建ServerSocket的对象,同时为服务端注册端口。
        ServerSocket serverSocket = new ServerSocket(8888);
        //2. 使用ServerSocket对象,调用accept方法,等待客户端的连接请求。
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("有人上线了"+socket.getRemoteSocketAddress());
//            new ServerReaderThread(socket).start();
            new ServerWriterThread(socket).start();
        }
//        dis.close();
//        socket.close();
    }
}

package com.jingwei;

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

public class ServerWriterThread extends Thread {
    private Socket socket;

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

    @Override
    public void run() {
        try {
            OutputStream outputStream = socket.getOutputStream();
            PrintStream printStream = new PrintStream(outputStream);
            printStream.println("Http/1.1 200 OK");
            printStream.println("Content-Type: text/html;charset=utf-8");
            printStream.println();
            printStream.println("<!DOCTYPE html>");
            printStream.println("<html>");
            printStream.println("<head>");
            printStream.println("<title>Server Writer</title>");
            printStream.println("</head>");
            printStream.println("<body>");
            printStream.println("<h1>Server Writer</h1>");
            printStream.println("</body>");
            printStream.println("</html>");

            printStream.flush();
            printStream.close();
            socket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}

拓展知识
每次请求都开一个新线程,到底好不好?
高并发时,容易宕机!

在这里插入图片描述

package com.day19;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

public class SocketClient {
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动成功!");
        //1. 创建ServerSocket的对象,同时为服务端注册端口。
        ServerSocket serverSocket = new ServerSocket(8888);
        //创建出一个线程池,负责处理通信管道的任务
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(20 * 2, 20 * 2, 0, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(8), Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
        //2. 使用ServerSocket对象,调用accept方法,等待客户端的连接请求。
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("有人上线了"+socket.getRemoteSocketAddress());
//            new ServerReaderThread(socket).start();
            //3、把这个客户端对应的socket通信管道,交给一个独立的线程负责处理。
            threadPoolExecutor.execute(new ServerWriterRunnable(socket));
        }
//        dis.close();
//        socket.close();
    }
}

package com.day19;

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

public class ServerWriterRunnable implements Runnable {
    private Socket socket;

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

    @Override
    public void run() {
        try {
            OutputStream outputStream = socket.getOutputStream();
            PrintStream printStream = new PrintStream(outputStream);
            printStream.println("Http/1.1 200 OK");
            printStream.println("Content-Type: text/html;charset=utf-8");
            printStream.println();
            printStream.println("<!DOCTYPE html>");
            printStream.println("<html>");
            printStream.println("<head>");
            printStream.println("<title>Server Writer</title>");
            printStream.println("</head>");
            printStream.println("<body>");
            printStream.println("<h1>Server Writer</h1>");
            printStream.println("</body>");
            printStream.println("</html>");

            printStream.flush();
            printStream.close();
            socket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}

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

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

相关文章

轮腿机器人-五连杆正运动学解算

轮腿机器人-五连杆与VMC 1.五连杆正运动学分析2.参考文献 1.五连杆正运动学分析 如图所示为五连杆结构图&#xff0c;其中A&#xff0c;E为机器人腿部控制的两个电机&#xff0c;θ1,θ4可以通过电机的编码器测得。五连杆控制任务主要关注机构末端C点位置&#xff0c;其位置用直…

【Unity】常见性能优化

1 前言 本文将介绍下常用的Unity自带的常用优化工具&#xff0c;并介绍部分常用优化方法。都是比较基础的内容。 2 界面 2.1 Statistics窗口 可以简单查看Unity运行时的统计数据&#xff0c;当前一帧的性能数据。 2.1.1 Audio 音频相关内容。 Level&#xff1a;音量大小&a…

物联网云组态平台

TopStack 物联网云组态平台&#xff0c;提供从边缘感知及设备到云的数据采集、分析、可视化软件服务&#xff0c;提供完善的平台开发环境&#xff0c;协助客户完善垂直领域的业务应用开发。与伙伴共同打造多元产业物联网解决方案。 产品采用微前端、微服务架构进行设计&#x…

Testng测试框架(7)--测试运行

忽略测试 TestNG可以让你忽略类、特殊包、包及其子中的所有Test方法。 当在测试方法级别使用Ignore 注解&#xff0c;在功能上与Test(enabledfalse).一样。 以下例子将忽略类中所有tests。 import org.testng.annotations.Ignore; import org.testng.annotations.Test; Ign…

day9 | 栈与队列 part-1 (Go) | 232 用栈实现队列、225 用队列实现栈

今日任务 栈与队列的理论基础 (介绍:代码随想录)232 用栈实现队列(题目: . - 力扣&#xff08;LeetCode&#xff09;)225 用队列实现栈 (题目: . - 力扣&#xff08;LeetCode&#xff09; ) 栈与队列的理论基础 栈 : 先进后出 队列: 后进先出 老师给的讲解:代码随想录 …

left join limit offset 分页查询问题

1. LEFT JOIN 简介 在开始讨论LEFT JOIN的使用方法之前&#xff0c;让我们先简要回顾一下LEFT JOIN的概念。 LEFT JOIN是一种用于将左表和右表连接起来的操作。它会返回左表中的所有记录&#xff0c;并且对于每条左表记录&#xff0c;如果在右表中找到符合条件的记录&#xf…

js+网络摄像头实现人体肢体关键点动作捕获

最近有一个项目&#xff0c;客户需要用户人体姿势识别&#xff0c;进行表演考核用途&#xff0c;或者康复中心用户恢复护理考核&#xff0c;需要用摄像头进行人体四肢进行肢体关键点对比考核&#xff0c;资料还是太少了。只有个别大佬发了部分技术指导。感觉写的不错。 阿里云…

算法第四十一天-排除排序链表中的重复元素Ⅱ

排除排序链表中的重复元素Ⅱ 题目要求 解题思路 题意&#xff1a;在一个有序链表中&#xff0c;如果一个节点的值出现不止一次&#xff0c;那么把这个节点删除掉 重点&#xff1a;有序链表&#xff0c;所以&#xff0c;一个节点的值出现不止一次&#xff0c;那么他们必相邻。…

CMC学习系列 (7):β 范围 EEG-EMG 相干性与皮质光谱功率有关

CMC学习系列:β 范围 EEG-EMG 相干性与皮质光谱功率有关 0. 引言1. 主要贡献2. 方法2.1 目标2.2 实验范式2.3 数据处理和分析 3. 结果4. 讨论5. 总结欢迎来稿 论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1053811907001760 论文题目&#xff…

一、接口自动化之pytest 运行参数

1、在跟目录下创建一个配置项pytest.ini [pytest] testpaths./testcases markersp0:高于优先级test:测试环境pro:生成环境2、打标签 3、运行命名pytest -m "p0"

单链表详解(无哨兵位),实现增删改查

1.顺序表对比单链表的缺点 中间或头部插入时&#xff0c;需要移动数据再插入&#xff0c;如果数据庞大会导致效率降低每次增容就需要申请空间&#xff0c;而且需要拷贝数据&#xff0c;释放旧空间增容造成浪费&#xff0c;因为一般都是以2倍增容 2.链表的基础知识 链表也是线…

蓝桥杯 — — 数数

数数 友情链接&#xff1a;数数 题目&#xff1a; 思路&#xff1a; 这道题目主要用到了埃氏筛法&#xff08;Sieve of Eratosthenes&#xff09;来快速求解质数的方法&#xff0c;思路很巧妙&#xff0c;并且用到了动态规划的思想。 我们首先定义两个数组mk和p&#xff0c…

LPA3399Pro搭建Qt开发环境

将以前的开发文档在此做一个记录。 一、介绍 Qt是一个跨平台的应用程序开发框架&#xff0c;支持多种操作系统和硬件架构&#xff0c;包括ARM架构的Linux。 RK3399Pro是一款基于ARM架构的处理器&#xff0c;用于嵌入式系统。可以在RK3399上搭建Qt开发环境&#xff0c;进行项目…

C语言学习笔记之结构体(一)

目录 什么是结构体&#xff1f; 结构体的声明 结构体变量的定义和初始化 结构体成员的访问 结构体传参 什么是结构体&#xff1f; 在现实生活中的很多事物无法用单一类型的变量就能描述清楚&#xff0c;如&#xff1a;描述一个学生&#xff0c;需要姓名&#xff0c;年龄&a…

演示:单包攻击,扫描类攻击,畸形报文攻击[Land攻击,泪滴攻击,ip地址欺骗]。配置防火墙进行防御

浏览上篇博客进行环境搭建 单包攻击 单包攻击&#xff08;Single Packet Attack&#xff09;是一种利用网络协议或应用程序中的漏洞进行的攻击方式。这种攻击通常只需要发送一个精心构造的数据包&#xff0c;就能够触发目标系统的漏洞&#xff0c;导致攻击者能够执行非授权的…

JVM修炼之路【12】- GC调优 、性能调优

上一篇中 我们详细讲了内存溢出 内存泄漏 还有相关的案例。 这篇博客中我们主要了解一下GC调优。 有些新手可能会有一点 疑问—— 这两者不是一回事吗&#xff1f;&#xff1f; 其实说一回事 也没错 因为GC调优本质上还是针对 堆上的内存 只不过前面我们关注的侧重点在于 不合…

关于机器学习中贝叶斯学习(Bayesian Learning)计算公式的理解

一、引言 在《统计学习的分类概述》中介绍了贝叶斯学习的概念和计算公式&#xff0c;可以看到这个公式就是概率统计理论中的贝叶斯公式&#xff0c;但在机器学习中这个公式与概率统计中的理解要复杂得多。 二、贝叶斯学习公式及各组成因子的含义 要理解贝叶斯学习公式&#…

【Spring Security】1.Spring Security介绍 功能介绍

文章目录 一、Spring Security介绍二、功能介绍 一、Spring Security介绍 官方文档&#xff1a;https://docs.spring.io/spring-security/reference/index.html 官网解释&#xff1a;Spring Security 是一个提供 身份验证、授权 和 针对常见攻击的保护 的框架。 它为 保护命令…

运放噪声评估的来龙去脉

运放噪声评估的来龙去脉 友情提示&#xff0c;运放电路的噪声分析还是比较复杂的&#xff0c;不论是基础理论还是对应的推导过程&#xff0c;都不是特别容易。考虑到兄弟们的基础参差不齐&#xff0c;所以我还是尽量说清楚点&#xff0c;这样导致看起来就有点罗里吧嗦&#xff…

刷题之动态规划-回文串

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的回文串类型相关的题目 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么>dp[i]表示什么状态转移方程&#xff1a; dp[i] 等于什么1 和 2 是动态规划的核心步骤&#xff0c;…