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

网络编程(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的数据包64Kbyte[] 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的数据包64Kbyte[] 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端口:创建ServerSocketServerSocket 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端口:创建ServerSocketServerSocket 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;}@Overridepublic 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端口:创建ServerSocketServerSocket 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;}@Overridepublic 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地址:8080ServerSocket serverSocket = new ServerSocket(8080);//2. 死循环while (true) {//3. 不断尝试接受客户端的连接,得到SocketSocket socket = serverSocket.accept();//4. 把socket交给一个新线程进行处理new Thread(new TomcatWorkerRunnable(socket)).start();}}
}

        

        

相关文章:

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

目录 1.什么是网络编程&#xff1f; 2.基本的通信架构 3.网络通信三要素 4.UDP通信-快速入门 5.UDP通信-多发多收 6.TCP通信-快速入门 7.TCP通信-多发多收 8.TCP通信-同时接收多个客户端 9.TCP通信-综合案例 1.什么是网络编程&#xff1f; 网络编程是可以让设…...

Linux线程(二)----- 线程控制

目录 前言 一、线程资源区 1.1 线程私有资源 1.2 线程共享资源 1.3 原生线程库 二、线程控制接口 2.1 线程创建 2.1.1 创建一批线程 2.2 线程等待 2.3 终止线程 2.4 线程实战 2.5 其他接口 2.5.1 关闭线程 2.5.2 获取线程ID 2.5.3 线程分离 三、深入理解线程 …...

Linux 内核irq_stack遍历

环境Centos 4.18.0-80.el8.x86_64 一、x86架构堆栈类型说明 https://www.kernel.org/doc/Documentation/x86/kernel-stacks int get_stack_info(unsigned long *stack, struct task_struct *task,struct stack_info *info, unsigned long *visit_mask) {if (!stack)goto unk…...

GIT问题记录

一、 1.Gitee相关 复现步骤&#xff1a;自己在gitee上使用WEB解决冲突&#xff0c;本地未拉取最新的origin分支&#xff0c;然后本地也做了其他的修改&#xff0c;然后commit并且push&#xff0c;push时候报错&#xff0c;本地分支不干净 尝试拉取origin的最新内容&#xff…...

AzerothCore安装记录

尝试在FreeBSD系统下安装AzerothCore 首先安装相关软件 pkg install cmake mysql80-server boost-all装完mysql之后提示&#xff1a; MySQL80 has a default /usr/local/etc/mysql/my.cnf, remember to replace it with your own or set mysql_optfile"$YOUR_CNF_FILE i…...

Infineon_TC264智能车代码初探及C语言深度学习(一)

本篇文章记录我在智能车竞赛中&#xff0c;对 Infineon_TC264 这款芯片的底层库函数的学习分析。通过深入地对其库函数进行分析&#xff0c;C语言深入的知识得以再次在编程中呈现和运用。故觉得很有必要在此进行记录一下。 目录 ​编辑 一、代码段 1、枚举类型 2、结构体 …...

[Redis]——初识Redis

一、Redis为非关系型数据库 ❓我们常见的MySQL、SQLServer都是关系型数据库&#xff0c;那他们之间有什么区别与联系呢&#xff1f; &#x1f4d5;关系型数据库与非关系型数据库的区别&#xff08;面试题&#xff09; 解释&#xff1a; SQL数据库中的表是有结构的&#xff0c;包…...

YTM32的同步串行通信外设SPI外设详解(Master Part)

YTM32的同步串行通信外设SPI外设详解&#xff08;Master Part&#xff09; 文章目录 YTM32的同步串行通信外设SPI外设详解&#xff08;Master Part&#xff09;IntroductionFeatures引脚信号时钟源其它不常用功能 Pricinple & Mechinism基于FIFO的命令和数据管理机制锁定配…...

【C语言】三子棋

前言&#xff1a; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小&#xff0c;三子棋在很多时候会出现和…...

Web组态可视化编辑器 快速绘制组态

随着工业智能制造的发展&#xff0c;工业企业对设备可视化、远程运维的需求日趋强烈&#xff0c;传统的单机版组态软件已经不能满足越来越复杂的控制需求&#xff0c;那么实现Web组态可视化界面成为了主要的技术路径。 行业痛点 对于软件服务商来说&#xff0c;将单机版软件转变…...

WebServer -- 注册登录

目录 &#x1f349;整体内容 &#x1f33c;流程图 &#x1f382;载入数据库表 提取用户名和密码 &#x1f6a9;同步线程登录注册 补充解释 代码 &#x1f618;页面跳转 补充解释 代码 &#x1f349;整体内容 概述 TinyWebServer 中&#xff0c;使用数据库连接池实现…...

C3_W2_Collaborative_RecSys_Assignment_吴恩达_中英_Pytorch

Practice lab: Collaborative Filtering Recommender Systems(实践实验室:协同过滤推荐系统) In this exercise, you will implement collaborative filtering to build a recommender system for movies. 在本次实验中&#xff0c;你将实现协同过滤来构建一个电影推荐系统。 …...

Elasticsearch使用function_score查询酒店和排序

需求 基于用户地理位置&#xff0c;对酒店做简单的排序&#xff0c;非个性化的推荐。酒店评分包含以下&#xff1a; 酒店类型&#xff08;依赖用户历史订单数据&#xff09;&#xff1a;希望匹配出更加符合用户使用的酒店类型酒店评分&#xff1a;评分高的酒店用户体验感好ge…...

iOS消息发送流程

Objc的方法调用基于消息发送机制。即Objc中的方法调用&#xff0c;在底层实际都是通过调用objc_msgSend方法向对象消息发送消息来实现的。在iOS中&#xff0c; 实例对象的方法主要存储在类的方法列表中&#xff0c;类方法则是主要存储在原类中。 向对象发送消息&#xff0c;核心…...

【接口测试】常见HTTP面试题

目录 HTTP GET 和 POST 的区别 GET 和 POST 方法都是安全和幂等的吗 接口幂等实现方式 说说 post 请求的几种参数格式是什么样的&#xff1f; HTTP特性 HTTP&#xff08;1.1&#xff09; 的优点有哪些&#xff1f; HTTP&#xff08;1.1&#xff09; 的缺点有哪些&#x…...

服务器硬件基础知识

1. 服务器分类 服务器分类 服务器的分类没有一个统一的标准。 从多个多个维度来看服务器的分类可以加深我们对各种服务器的认识。 N.B. CISC: complex instruction set computing 复杂指令集计算 RISC: reduced instruction set computer 精简指令集计算 EPIC: explicitly p…...

matlab实现层次聚类与k-均值聚类算法

1. 原理 1.层次聚类&#xff1a;通过计算两类数据点间的相似性&#xff0c;对所有数据点中最为相似的两个数据点进行组合&#xff0c;并反复迭代这一过程并生成聚类树 2.k-means聚类&#xff1a;在数据集中根据一定策略选择K个点作为每个簇的初始中心&#xff0c;然后将数据划…...

【机器学习】包裹式特征选择之递归特征消除法

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…...

【ArcGIS】重采样栅格像元匹配问题:不同空间分辨率栅格数据统一

重采样栅格像元匹配问题&#xff1a;不同空间分辨率栅格数据统一 原始数据数据1&#xff1a;GDP分布数据2.1&#xff1a;人口密度数据2.2&#xff1a;人口总数数据3&#xff1a;土地利用类型 数据处理操作1&#xff1a;将人口密度数据投影至GDP数据&#xff08;栅格数据的投影变…...

Qt 简约又简单的加载动画 第七季 音量柱风格

今天和大家分享两个音量柱风格的加载动画,这次的加载动画的最大特点就是简单,只有几行代码. 效果如下: 一共三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...