19、网络编程:
19、网络编程:
网络的相关概念:
网络通讯:
- 概念:两台设备之间通过网络实现数据传输;
- 网络通讯:将数据通过网络从一台设备传输到另一台设备;
- java.net包下提供了一系列的类或接口,供程序员使用,完成通讯。
网络:
- 概念:两台或多台设备,通过一定的物理设备连接起来,构成了网络;
- 根据网络的覆盖范围不同,对网络进行分类:
- 局域网:覆盖范围小,可以覆盖一个学校,一个公司等;
- 城域网:覆盖范围较大,可以覆盖一个城市;
- 广域网:覆盖范围最大,可以覆盖全国,甚至全球,万维网是广域网的代表。
ip地址:
-
概念:用于唯一地标识网络中的每台计算机/主机(类似于我们地身份证);
-
参看 ip 地址:在命令行(cmd)中输入ipconfig
-
ip 地址表示(对于ipv4):点分十进制——xx.xx.xx.xx;
0~255 0~255 0~255 0~255 -
每一个十进制数地范围:0~255;
-
ip 地址地组成 = 网络地址 + 主机地址,比如192.168.16.69,那么192.168.16可以表示网络地址(xx市xx区xx小区),69表示主机地址(x幢x单元xxx房);
-
ipv6是互联网工程任务组设计地用于替代 IPV4 的下一代 IP协议,其地址数量号称可以为全世界的每一粒沙子边上一个地址;其使用128位表示地址(IPV4是32位);
-
由于 IPV4 最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPV6 的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备炼乳互联网的障碍。
IPV4地址分类:
- A类:1个字节表示网络地址(0-固定的 + 7位网络号),3个字节表示主机地址;
- 0.0.0.0~127.255.255.255
- 特殊:127.0.0.1表示本机地址
- B类:2个字节表示网络地址(10-固定 + 14位网络号),2个字节表示主机地址;
- 128.0.0.0~191.255.255.255
- C类:3个字节表示网络地址(110-固定 + 21位网路号),1个字节表示主机地址;
- 192.0.0.0~223.255.255.255
- D类:1110-固定 + 28位多播组号;类似广播。
- 224.0.0.0~239.255.255.255
- E类:11110-固定 + 27位留待后用。
- 240.0.0.0~247.255.255.255
域名:
- 如www.baidu.com;
- 好处:为了方便记忆,解决记 ip 的困难;(就像你想要访问百度的主机,对于用户来讲,你能记住百度的ip吗?我们记住的是百度的域名,www.baidu.com)
- 概念:将 ip 地址映射成域名。(如何映射上,使用http协议——于JavaWeb中)
端口号:
- 概念:用于标识计算机上某个特定的网络程序(网络服务);(一个网络服务需要监听一个端口,我们想要去访问网站服务的时候,我们请求的是端口——ip+端口才能访问到网络服务,怎么理解,就像你去办理身份证,在公安局只有特定的柜台才可以吧!公安局相当于ip,柜台相当于端口,你只有去了公安局再去特定端口才能得到办理身份证服务!)
- 一个端口只能被一个网络服务监听(当被网络服务监听时,该端口被占用)
- 表示形式:以整数形式,范围 0~65535[2个字节,0 ~ 216-1];
- 0~1024 已经被占用,比如 ssh 22,ftp 21, smtp 25, http 80;
- 在我们做开发的时候尽量避免使用0~1024的端口。
- 常见的网络程序端口号:
- tomcat:8080
- mysql:3306
- oracle:1521
- sqlserver:1433
网络通信协议:
协议(tcp/ip):
通俗理解:数据在网络编程中的组织形式,就是协议。(每个字段表示什么含义)
TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础,简单来说,就是由网络层的IP协议和传输层的TCP协议组成的。
TCP/IP模型:
- 应用层:Http、ftp、telnet、…
- 传输层(TCP层):TCP、UDP、…
- 网络层(IP层):协议——IP、ICMP、ARP、…
- 物理+数据链路层:协议——Link
开发中主要关注TCP层和IP层。
TCP 和 UDP:
TCP协议:传输控制协议
- 使用TCP协议前,必须建立TCP连接,形成数据传输通道;
- 传输前,采用“三次握手”方式,是可靠的;
- TCP协议进行通信的两个应用进程:客户端、服务端;
- 在连接中可进行大数据量的传输;
- 传输完毕,需释放已建立的连接,效率低。
UDP协议:用户数据协议
- 将数据、源、目的封装成数据包,不需要建立连接;
- 每个数据报的大小限制在64K内,不适合传输大量数据;
- 因无需连接,故不可靠;
- 发送数据结束时,无需释放资源(因为不是面向连接的),速度块;
InetAddress类:
相关方法:
- getLocalHost:获取本机InetAddress对象;
- getByName:根据指定主机名/域名获取ip地址对象;
- getHostName:获取InetAddress对象的主机名;
- getHostAddress:获取InetAddress对象的地址。
应用案例:
package com.jiangxian.inetaddress;import java.net.InetAddress;
import java.net.UnknownHostException;/*** @author JiangXian~* @version 1.0*/
public class InetAddress_ {public static void main(String[] args) throws UnknownHostException {// 1.获取本机的InetAdress 对象InetAddress localHost = InetAddress.getLocalHost();System.out.println("localHost = " + localHost);// 2.根据指定主机名,获取 InetAddress 对象:InetAddress host1 = InetAddress.getByName("江弦");System.out.println("host1 = " + host1);// 3.根据域名返回InetAddress 对象InetAddress host2 = InetAddress.getByName("www.baidu.com");System.out.println("host2 = " + host2);// 4.通过 InetAddress 对象,获取相应的地址String hostAddress = host2.getHostAddress();System.out.println("hostAddress = " + hostAddress);}
}
Socket:
基本介绍:
- 套接字(Socket)开发网络应用程序背广泛采用,以至于成为事实上的标准;
- 通信的两端都需要Socket,是两台机器间通信的端点;
- 网络通信实际上就是Socket间的通信;
- Socket 允许程序把网络连接当成一个流,数据在两个Socket 间通过IO传输;
- 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端(监听)。
TCP网络编程:
应用案例:
使用字节流1:
- 编写一个服务器端,和一个客户端;
- 服务器端在9999端口监听(仅能监听一次);
- 客户端连接到服务器端,发送"hello, server",然后退出;
- 服务器端接收到 客户端发送的 信息,输出,并退出。
客户端思路分析:
- 连接服务端(ip,端口);
- 连接上后,生成Socket,通过socket.getOutputStream();
- 通过输出流,写入数据到数据通道。
package com.jiangxian.socket;import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;/*** @author JiangXian~* @version 1.0* 客户端发送 “Hello Server”*/
public class SocketTCP01Client {public static void main(String[] args) throws IOException {// 1. 连接服务端(ip,端口);由于是本机所以不用ip地址或者域名,若是远程服务器,可以使用ip地址或者域名// 解释:连接本机的9999端口,连接成功会返回socketSocket socket = new Socket(InetAddress.getLocalHost(),9999);System.out.println("客户端 socket返回 = " + socket.getClass());//2. 连接上后,生成Socket,通过socket.getOutputStream();// 得到和socket对象关联的输出流对象OutputStream outputStream = socket.getOutputStream();//3. 通过输出流,写入数据到数据通道。outputStream.write("Hello, server!".getBytes());outputStream.close();socket.close();System.out.println("客户端退出了。");}
}
服务器思路分析:
- 在本机的9999端口监听,等待连接;
- 当没有客户端连接9999端口时,程序会被阻塞在此处,等待连接;
- 通过socket.getInputStream()读取客户端写入到数据通道的数据,然后显示。
package com.jiangxian.socket;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** @author JiangXian~* @version 1.0*/
public class SocketTCP01Server {public static void main(String[] args) throws IOException {// 1. 在本机的9999端口监听,等待连接;// 细节:要求本机没有其它服务在监听(占用)9999// 细节:ServerSocket可以通过accept()方法返回多个Socket对象[多个客户端来连接服务器导致的多并发]ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务器,在9999号端口监听,等待连接...");// 2. 当没有客户端连接9999端口时,程序会被阻塞在此处,等待连接;// 若有客户端连接,会返回一个Socket对象Socket socket = serverSocket.accept(); // 未连接时阻塞在此处,即客户端未运行时会在此处等待System.out.println("服务器 socket = " + socket.getClass()); // 未连接时,这句话输出不出来// 3. 通过socket.getInputStream()读取客户端写入到数据通道的数据,然后显示。InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[8];int len = 0;while ((len = inputStream.read(buffer)) != -1) {System.out.print(new String(buffer, 0, len));}inputStream.close();socket.close();serverSocket.close(); // 这个也要关闭System.out.println("服务器退出!");}
}
使用字节流2:(引入结束标记)
- 编写一个服务器端,和一个客户端;
- 服务器端在9999端口监听(仅能监听一次);
- 客户端连接到服务器端,发送"hello, server,设置一个结束标记",然后退出;
- 服务器端接收到 客户端发送的 信息,输出,并发送"hello, client"并退出。
客户端思路:
- 连接服务器(ip, 端口号);
- 通过getOutputStream发送数据;
- 使用getInputStream来接收数据。
package com.jiangxian.socket;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;/*** @author JiangXian~* @version 1.0*/
public class SocketTCP02Client {public static void main(String[] args) throws IOException {//1. 连接服务器(ip, 端口号);Socket socket = new Socket(InetAddress.getLocalHost(), 9999);System.out.println("客户端 socket返回 = " + socket.getClass());//2. 通过getOutputStream发送数据;OutputStream outputStream = socket.getOutputStream();outputStream.write("Hello, Server!".getBytes());// 设置一个结束标记,否则socket不知道到底结束了没有,导致程序一直等待,形成死锁socket.shutdownOutput();// outputStream.close()会导致socket背提前关闭//3. 使用getInputStream来接收数据。InputStream inputStream = socket.getInputStream();byte[] buf = new byte[1024];int readlen = 0;while((readlen = inputStream.read(buf)) != -1) {System.out.println(new String(buf, 0, readlen));}// 一定要记住,退出要写在一起,不然会导致socket提前关闭outputStream.close();inputStream.close();socket.close();System.out.println("客户端退出!");}
}
服务器思路:
- 在本机的9999端口创建监听,等待连接;
- 当没有客户端请求连接时,程序阻塞;
- 收到请求连接后,创建Socket对象,使用getInputStream来接收数据;
- 使用getOutputStream发送数据。
package com.jiangxian.socket;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;/*** @author JiangXian~* @version 1.0*/
public class SocketTCP02Server {public static void main(String[] args) throws IOException {//1. 在本机的9999端口创建监听,等待连接;ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务器,在9999号端口监听,等待连接...");//2. 当没有客户端请求连接时,程序阻塞;Socket socket = serverSocket.accept(); // 等待连接System.out.println("服务器的 socket = " + socket.getClass().getName());//3. 收到请求连接后,创建Socket对象,使用getInputStream来接收数据;InputStream inputStream = socket.getInputStream();byte[] buffer = new byte[1024];int readlen = 0;while((readlen = inputStream.read(buffer)) != -1){System.out.println(new String(buffer, 0 ,readlen));}//4. 使用getOutputStream发送数据。OutputStream outputStream = socket.getOutputStream();outputStream.write("Hello, Client!".getBytes());// 设置一个结束标记,否则socket不知道到底结束了没有socket.shutdownOutput();// 一定要记住,退出要写在一起,不然会导致socket提前关闭inputStream.close();outputStream.close();socket.close();serverSocket.close();System.out.println("服务器退出!");}
}
使用字符流:
客户端:
- 创建连接,连接服务器(ip,端口);
- 使用socket.getOutputStream获得输出流,使用OutputStreamWriter转换流,写入(加入结束标记,可以是socket.shutdownOutput(); 也可以是 BufferedWriter对象的newline()函数,但是要求对面是用readline()接收);
- 使用socket.getInputStream获得输入流,将字节型转换为字符型,使用InputStreamReader转换流,读取文件;
package com.jiangxian.socket;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;/*** @author JiangXian~* @version 1.0*/
public class SocketTCP03Client {public static void main(String[] args) throws IOException {Socket socket = new Socket(InetAddress.getLocalHost(),9999);BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("Hello, Server!\n");bw.newLine();bw.flush();BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = br.readLine();System.out.println(line);// closebw.close();br.close();socket.close();}
}
服务器:
- 创建ServerSocket对象,监听本机的9999端口;
- 当没有连接请求,程序将堵塞在此处,等待连接;
- 当收到连接请求,创建Socket对象,使用socket.getInputStream获得输入流,将字节型转换为字符型,使用InputStreamReader转换流,读取文件;
- 使用socket.getOutputStream获得输出流,使用OutputStreamWriter转换流,写入(加入结束标记,可以是socket.shutdownOutput(); 也可以是 BufferedWriter对象的newline()函数,但是要求对面是用readline()接收)。
package com.jiangxian.socket;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @author JiangXian~* @version 1.0*/public class SocketTCP03Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(9999);Socket socket = serverSocket.accept();BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = br.readLine(); // 这里不能使用循环。System.out.println(line);BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("Hello, Client!");bw.newLine();bw.flush();// closebr.close();bw.close();socket.close();serverSocket.close();}
}
在使用字符流时,使用while((line = br.readline()) != null){sout(line);}时会发生死锁,我还并不理解为什么会发生这样的情况。
上传文件:
- 编写一个服务端和一个客户端;
- 服务端在 8888 端口监听;
- 客户端连接到服务端,发送一张图片;
- 服务器接收到客户端发送的图片,保存到 src 下,发送"收到图片"再退出;
- 客户端接收到服务端发送的"收到图片"再退出。
客户端:
package com.jiangxian.sendfiles;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;/*** @author JiangXian~* @version 1.0*/public class TCPFileCopyClient {public static void main(String[] args) throws IOException {Socket socket = new Socket(InetAddress.getLocalHost(),8888);System.out.println("客户端连接到本机8888端口的服务端");// 需要先将文件写入一个二进制数组中String filePath = "E:\\self_study\\NoteBook\\Java\\mg.png";BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());byte[] buf = new byte[1024];int len;while((len = bis.read(buf)) != -1){bos.write(buf, 0, len);}bos.flush();socket.shutdownOutput();// 接收服务端回送信号:BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line;while((line = br.readLine()) != null){System.out.println(line);}// closebis.close();bos.close();br.close();socket.close();System.out.println("客户端结束工作退出");}
}
服务端:
package com.jiangxian.sendfiles;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;/*** @author JiangXian~* @version 1.0*/public class TCPFileCopyServer {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(8888);System.out.println("服务端在监听8888端口");Socket s = ss.accept();System.out.println("等待客户端连接...");// 开始读取客户端传入的文件,并将其写入 srcString dstFilePath = "src\\txt.png";BufferedInputStream bis = new BufferedInputStream(s.getInputStream());BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dstFilePath));byte[] buf = new byte[1024];int len;while ((len = bis.read(buf)) != -1) {bos.write(buf, 0, len);}bos.flush();// 回送信息:BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));bw.write("收到图片");bw.flush();s.shutdownOutput();// closebis.close();bos.close();s.close();ss.close();}
}
netstat 指令:
- netstat -an:可以查看当前主机网络情况,包括端口监听情况和网络连接情况;
- netstat -an | more:可以分页显示;
- netstat -anb:可以看到是哪个程序在监听端口(需要管理员权限);
- netstat -and|more:可以分页显示;
- 要求在dos控制台下执行(win + r,输入cmd打开控制台)
-
协议 本地地址 外部地址 状态
说明:
- Listening 表示某个端口在监听;
- 若有一个外部程序(客户端)连接到该端口,就会显示一条连接信息;
- 可以输入 ctrl + c来退出指令。
TCP 网络通讯不为人知的秘密:
当客户端连接到服务端后,实际上客户端也是通过一个端口和服务器进行通讯的,这个端口是TCP/IP来分配的,是不确定的,是随机的。
UDP网络通信编程:
基本介绍:
- 类DatagramSocket 和 DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序;
- UDP 数据报通过数据报套接字 DatagramSocket 发送和接受,系统不保证 UDP 数据报一定能够安全送到目的地,也不能确定说明时候抵达;
- DatagramPacket 对象封装了 UDP 数据报,在数据报中包含了发送端的 IP 地址和 端口号以及接收端的 IP地址和端口号;
- UDP 协议中没干过数据报都给出了完整的地址信息,因此无需建立连接。
基本流程:
- 核心的两个类/对象 DatagramSocket 与 DatagramPacket;
- 建立发送端,接收端;
- 建立数据包;
- 调用 DatagramSocket 的放送和接收;
- 关闭 DatagramSocket。
-: | :------: | :–: |
说明:
- Listening 表示某个端口在监听;
- 若有一个外部程序(客户端)连接到该端口,就会显示一条连接信息;
- 可以输入 ctrl + c来退出指令。
TCP 网络通讯不为人知的秘密:
当客户端连接到服务端后,实际上客户端也是通过一个端口和服务器进行通讯的,这个端口是TCP/IP来分配的,是不确定的,是随机的。
UDP网络通信编程:
基本介绍:
- 类DatagramSocket 和 DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序;
- UDP 数据报通过数据报套接字 DatagramSocket 发送和接受,系统不保证 UDP 数据报一定能够安全送到目的地,也不能确定说明时候抵达;
- DatagramPacket 对象封装了 UDP 数据报,在数据报中包含了发送端的 IP 地址和 端口号以及接收端的 IP地址和端口号;
- UDP 协议中没干过数据报都给出了完整的地址信息,因此无需建立连接。
[外链图片转存中…(img-6BoMmdVl-1733666976515)]
基本流程:
- 核心的两个类/对象 DatagramSocket 与 DatagramPacket;
- 建立发送端,接收端;
- 建立数据包;
- 调用 DatagramSocket 的放送和接收;
- 关闭 DatagramSocket。
相关文章:
19、网络编程:
19、网络编程: 网络的相关概念: 网络通讯: 概念:两台设备之间通过网络实现数据传输;网络通讯:将数据通过网络从一台设备传输到另一台设备;java.net包下提供了一系列的类或接口,供…...
[代码随想录11]栈和队列的应用,逆波兰表达式求值 、滑动窗口最大值、前 K 个高频元素
前言 这几个题目都是栈和队列的高频面试题目,主要是考察思路和coding能力,在前面几道题目的基础上进行延伸的。同时还有优先级队列和双端队列的用法 题目链接 150. 逆波兰表达式求值 - 力扣(LeetCode) 239. 滑动窗口最大值 - 力…...
认证插件介绍
本文档是针对 UOS 登录器插件给出开发指南,目的是为了让开发人员了解如何在 UOS 登录器上增加一种自定义认证方式,对插件接口做了详细说明以及实战练习。 文章目录 一、认证插件可以做什么?二、认证流程三、术语说明四、安全性五、可靠性六、…...
ASP.NET Core8.0学习笔记(二十四)——EF Core级联插入与删除
一、EF Core导航关系操作——级联插入 1.级联插入:在含有导航属性的实体(主体实体)中可以对实体进行级联插入。即在创建主体实体时直接把依赖实体进行赋值,此时只需要执行一次插入操作即可将主体实体与依赖实体同时入库。同时&am…...
Docker打包SpringBoot项目
一、项目打成jar包 在进行docker打包之前,先确定一下,项目能够正常的打成JAR包,并且启动之后能够正常的访问。这一步看似是可有可无,但是能避免后期的一些无厘头问题。 二、Dockerfile 项目打包成功之后,需要编写Doc…...
【Linux】WSL:Win运行Linux
WSL2(Windows Subsystem for Linux 2) 是 Microsoft 开发的技术,可在 Windows 系统上运行完整的 Linux 发行版环境。以下是详细的配置教程。 安装与配置 启用 WSL 功能 打开“开始”菜单,搜索 PowerShell,以 管理员身…...
js循环导出多个word表格文档
文章目录 js循环导出多个word表格文档一、文档模板编辑二、安装依赖三、创建导出工具类exportWord.js四、调用五、效果图js循环导出多个word表格文档 结果案例: 一、文档模板编辑 二、安装依赖 // 实现word下载的主要依赖 npm install docxtemplater pizzip --save// 文件操…...
Spring Boot 日志 配置 SLF4J 和 Logback
前言 在开发 Java 应用时,日志记录是不可或缺的一部分。日志可以记录应用的运行状态、错误信息和调试信息,帮助开发者快速定位和解决问题。Spring Boot 项目默认集成了 SLF4J 和 Logback,使得日志配置变得简单而灵活。本文将详细介绍如何在 …...
企业级包管理器:专栏概述 (1)
在当今的前端开发领域,包管理器已经成为了每一位开发者不可或缺的工具。它们就像一个个神奇的工具箱,里面装满了各种各样的工具(即软件包),帮助我们快速搭建项目、实现功能,极大地提高了开发效率。接下来&a…...
【动手学电机驱动】STM32-MBD(1)安装 STM32 硬件支持包
STM32-MBD(1)安装 STM32 硬件支持包 【动手学电机驱动】STM32-MBD(1)安装 STM32 硬件支持包 1. 必须的软硬件条件2. 嵌入式硬件支持包2.1 Embedded Coder2.2 嵌入式硬件支持包2.3 Embedded Coder Support Package for STMicroelec…...
书后习题答案:《Python程序设计基础(第2版)》,电子工业出版社,2020.01
【持续更新】 第3章 from math import *x1 float(input("请输入x1: ")) # print(x1) x2 float(input("请输入x2: ")) y1 float(input("请输入y1: ")) y2 float(input("请输入y2: "))dis sqrt(pow(x1 - x2, 2) pow(y1 - y2, 2))…...
Qt之第三方库QXlsx使用(三)
Qt开发 系列文章 - QXlsx(三) 目录 前言 一、Qt开源库 二、QXlsx 1.QXlsx介绍 2.QXlsx下载 3.QXlsx移植 4.修改项目文件.pro 三、使用技巧 1.添加头文件 2.写入数据 3.读出数据 总结 前言 Qt第三方控件库是指非Qt官方提供的、用于扩展Qt应用…...
Python通过global实现多文件共享全局参数,方法
Python通过global实现多文件共享全局参数 global关键字,全局变量 基础用法 这种用法,不能在其他的py文件中使用, x 6 def func():global x #定义外部的xx 10 func() print (x) #输出10共享参数 新建glo.py文件(全局变量文件)…...
DevOps工程技术价值流:项目构建工具的选择与实践
在快速迭代的软件工程领域,项目构建工具扮演着举足轻重的角色。它们不仅自动化了构建、测试、打包和部署等关键环节,还显著提升了开发效率和质量。本文将深入探讨后端常用的Maven和Gradle,以及前端不可或缺的NPM,并重点对比Maven与…...
【数据库】复习
数据库期中复习——概念填空_在修改数据结构时,为了保证数据库的数据独立性-CSDN博客 选择题 关系数据理论-数据库习题_数据库关系理论考题-CSDN博客 关系、关系模式、关系模型区别和联系 关系:元组的集合,一张表 关系模式:关系的描述 R(…...
CorsConfig前后端数据跨域连接,IDEA右侧Maven窗口消失
前后端数据跨域连接(分页查询并显示) 一、后端添加分页查询 分页查询核心就是:每页需要显示多少条记录(pageSize),当前查看第几页(pageNum);MySQL提供了分页函数limit m,n select * from table limit (pageNum-1)*pageSize, pa…...
Python微博动态爬虫
本文是刘金路的《语言数据获取与分析基础》第十章的扩展,详细解释了如何利用Python进行微博爬虫,爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。 整个过程十分明了,就是用户利用代码模拟Ajax请求,发…...
【设计模式】单例模式 在java中的应用
文章目录 引言什么是单例模式单例模式的应用场景单例模式的优缺点优点缺点 单例模式的基本实现饿汉式单例模式懒汉式单例模式双重检查锁定静态内部类枚举单例 单例模式的线程安全问题多线程环境下的单例模式线程安全的实现方式1. **懒汉式单例模式(线程不安全&#…...
burp suite 8
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
为什么在Java中super与this不能共存于子类构造器中,其中this起什么作用
在 Java 中,super 和 this 是两个关键字,它们在子类的构造器中有特定的用途和限制。 super 关键字: super 用于从父类(超类)访问成员(属性和方法)或者调用父类的构造方法。 在子类的构造器中&…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
