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

重学java 71.网络编程

人生不是坐等暴风雨过去,而是学会在雨中起舞

                                                                —— 24.6.14

一、网络编程的基础概念

1.概述:

        在网络通信协议下,不同计算机上运行的程序,进行数据传输

                比如:通信、视频通话、网络、邮件

                只要是计算机之间通过网络进行数据传输,就有网络编程的存在

2.软件结构

        C/S结构

                Client/Server结构(需要安装客户端),指客户端和服务器结构,常见程序有QQ、红蜘蛛等软件

                好处:不用把数据全部存放在服务端,一些数据存放在客户端        坏处:不易维护,需要开发客户端和服务端两个程序

        B/S结构

                Browser/Server结构,指浏览器和服务端结构,常见浏览器有IE、谷歌、火狐等

                好处:便于迭代,不用单独维护客户端,因为维护服务器会自动同步到客户端

                坏处:所有的数据都在服务端,会造成服务器的压力

        两种架构各有优势,但是无论哪种架构,都离不开网络的支持。网络编程,就是在一定的协议下,实现两台计算机的通信的程序。

3.服务器概念

        1.概述:安装了服务器软件的计算机

        2.最开始学习的服务器软件:tomcat

        网络通信协议:两台计算机在做数据交互时要遵守的规则,协议会对数据的格式,速率等进行规定,只有都遵守了这个协议,才能完成数据交互,两台计算机想完成数据交互,需要遵守网络通信协议

4.通信三要素

        [IP地址]:

            计算机的唯一标识,用于两台计算机之间的连接
                a.概述:指互联网协议地址(Internet Protocol Address),俗称IP计算机的唯一标识
                b.作用:可用于计算机和计算机之间的连接
                c.IPV4
                        32位的二进制数,通常被分为4个字节,表示成a.b.c.d 的形式,例如192.168.65.100 。其中a、b、c、d都是0~255之间的十进制整数,那么最多可以表示42亿个。
                IPV6
                        为了扩大地址空间,拟通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,表示成ABCD:EFO1:2345:6789:ABCD:EF01:2345:6789
                d.查看ip的命令:ipconfig
                        测试是否能连接其他计算机的命令:ping ip地址
                e:特殊的网址:代表的是本机地址,到了哪里都不会变,代表自己127.0.0.1 —> 固定不变

                        localhost

        [协议]:

                TCP:面向连接协议

                        需要先确认连接,才能进行数据交互

                        三次握手:(连接之前的反复确认)

                                ① 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
                                ② 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
                                ③ 第三次握手,客户端再次向服务器端发送确认信息,确认连接。

                        好处:数据安全,能给数据的传输提供一个安全的传输坏境

                        坏处:效率低

                UDP:面向无连接协议

                        好处:效率高

                        坏处:传输的数据不安全,容易丢失数据包

        [端口号]

                每一个应用程序的唯一标识

                用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。

5.TCP协议中的三次握手和四次挥手

    三次握手:

        第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
        第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
        第三次握手,客户端再次向服务器端发送确认信息,确认连接。

    四次挥手:

        第一次挥手:客户端向服务器端提出结束连接,让服务器做最后的准备工作。此时,客户端处于半关闭状态,即表示不再向服务器发送数据了,但是还可以接受数据
        第二次挥手:服务器接收到客户端释放连接的请求后,会将最后的数据发给客户端。并告知上层的应用进程不再接收数据。
        第三次挥手:服务器发送完数据后,会给客户端发送一个释放连接的报文。那么客户端接收后就知道可以正式释放连接了。
        第四次挥手:客户端接收到服务器最后的释放连接报文后,要回复一个彻底断开的报文。这样服务器收到后才会彻底释放连接。这里客户端,发送完最后的报文后,会等待2MSL,因为有可能服务器没有收到最后的报文,那么服务器迟迟没收到,就会再次给客户端发送释放连接的报文,此时客户端在等待时间范围内接收到,会重新发送最后的报文,并重新计时。如果等待2MSL后,没有收到,那么彻底断开。

二、UDP协议编程

1.DatagramSocket —> 好比寄快递找的快递公司

2.DatagramPacket —> 好比快递公司打包

1.客户端(发送端)

1.创建Datagramsocket对象(快递公司)

        a.空参:端口号从可用的端口号中随机一个使用
        b.有参:自己指定

2.创建DatagramPacket对象,将数据进行打包

        a.要发送的数据 —> byte[]
        b.指定接收端的IP
        c.指定接收端的端口号

3.发送数据

4.释放资源

package S102Internet;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class Demo287UDP_Sent {public static void main(String[] args) throws Exception {
//        1.创建Datagramsocket对象(快递公司)
//            a.空参:端口号从可用的端口号中随机一个使用
//            b.有参:自己指定DatagramSocket Socket = new DatagramSocket();//        2.创建DatagramPacket对象,将数据进行打包
//            a.要发送的数据 —> byte[]
//            b.指定接收端的IP
//            c.指定接收端的端口号byte[] buf = "我一直相信".getBytes();InetAddress IP = InetAddress.getByName("127.0.0.1");int port = 6666;DatagramPacket dp = new DatagramPacket(buf, buf.length, IP, port);
//        3.发送数据Socket.send(dp);
//        4.释放资源Socket.close();}
}

        直接执行发现,发送端在没有接收端的情况下,不会报错,因为UDP协议是面向无连接协议,不管有没有接收端,照发不误

2.服务端(接收端)

        1.创建DatagramSocket对象,指定服务端的端口号

        2.接收数据包

        3.解析数据包

        4.释放资源

package S102Internet;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class Demo288UDP_Receive {public static void main(String[] args) throws Exception {// 1.创建DatagramSocket对象,指定服务端的端口号DatagramSocket socket = new DatagramSocket(6666);// 2.接收数据包byte[] bytes = new byte[1024]; // 用于保存接收过来的数据DatagramPacket dp = new DatagramPacket(bytes, bytes.length);socket.receive(dp);// 3.解析数据包byte[] data = dp.getData(); // 接收的资源int len = dp.getLength(); // 从数据包中获取多少数据InetAddress address = dp.getAddress(); // 获取发送端的主机int port = dp.getPort(); // 发送端的端口号System.out.println(new String(data, 0, len));System.out.println(address+"……"+port);// 4.释放资源socket.close();}
}

三、TCP协议编程

1.客户端和服务端的交互过程

2.编写客户端

        1.创建socket对象,指明服务端的ip以及端口号

        2.调用socket中的getoutputstream,往服务端发送请求

        3.调用socket中的getInputstream,读取服务端响应回来的数据

        4.关流

package S102Internet;import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class Demo289TCP_Client {public static void main(String[] args) throws Exception {// 1.创建socket对象,指明服务端的ip以及端口号Socket socket = new Socket("127.0.0.1", 6666);// 2.调用socket中的getOutputStream,往服务端发送请求OutputStream os = socket.getOutputStream();os.write("一切都会好的".getBytes());// 3.调用socket中的getInputStream,读取服务端响应回来的数据InputStream is = socket.getInputStream();byte[] bytes = new byte[1024];int len = is.read(bytes);System.out.println(new String(bytes, 0, len));// 4.关流is.close();os.close();socket.close();}
}

3.编写服务端

        1.创建Serversocket对象,设置端口号

        2.调用Serversocket中的accept方法,等待客户端连接,返同Socket对象

        3.调用socket中的getInputStream,用于读取客户端发送过来的数据

        4.调用socket中的getOutputStream,用于给客户响应数据

        5.关闭资源

package S102Internet;import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class Demo289TCP_Client {public static void main(String[] args) throws Exception {// 1.创建socket对象,指明服务端的ip以及端口号Socket socket = new Socket("127.0.0.1", 6666);// 2.调用socket中的getOutputStream,往服务端发送请求OutputStream os = socket.getOutputStream();os.write("一切都会好的".getBytes());// 3.调用socket中的getInputStream,读取服务端响应回来的数据InputStream is = socket.getInputStream();byte[] bytes = new byte[1024];int len = is.read(bytes);System.out.println(new String(bytes, 0, len));// 4.关流is.close();os.close();socket.close();}
}

package S102Internet;import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Demo290TCP_Server {public static void main(String[] args) throws Exception {// 1.创建Serversocket对象,设置端口号ServerSocket ss = new ServerSocket(6666);// 2.调用Serversocket中的accept方法,等待客户端连接,返同Socket对象Socket socket = ss.accept();// 3.调用socket中的getInputstream,用于读取客户端发送过来的数据InputStream is = socket.getInputStream();byte[] bytes = new byte[1024];int len = is.read(bytes);System.out.println(new String(bytes, 0, len));// 4.调用socket中的getoutputstream,用于给客户响应数据OutputStream os = socket.getOutputStream();os.write("我一直相信".getBytes());// 5.关闭资源is.close();os.close();socket.close();ss.close();}
}

四、文件上传

经过一个客户端、一个服务端,将一个文件上传到另一个设备上面,用普通IO流操作硬盘上的文件

1.文件上传客户端以及服务端实现

客户端

package S103InternetFileUpload;import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class Demo291Client {public static void main(String[] args) throws Exception {// 1.创建Socket对象Socket socket = new Socket("127.0.0.1",6666);// 2.创建FileInputStream,用于读取本地上的图片FileInputStream fis = new FileInputStream("D:\\2LFE\\Desktop\\前端三剑客\\css\\CSS.day4\\综合案例-抖音解决方案.jpg");// 3.调用getOutputStream,用于将读取过来的图片写给服务端OutputStream os = socket.getOutputStream();// 4.边读边写byte[] bytes = new byte[1024];int len = 0;while ((len = fis.read(bytes)) != -1) {os.write(bytes, 0, len);}// 给服务端写一个结束标记socket.shutdownOutput();System.out.println("以下代码是读取响应的结果");// 5.调用getInputStream,读取响应结果InputStream is = socket.getInputStream();byte[] bytes1 = new byte[1024];int len1 = is.read(bytes1);System.out.println(new String(bytes1, 0, len1));// 6.关流is.close();os.close();fis.close();socket.close();}
}
import java.util.UUID;public class Demo293UUID {public static void main(String[] args) {String s = UUID.randomUUID().toString();UUID.randomUUID().toString();System.out.println("UUID: " + s);}
}

服务端

package S103InternetFileUpload;import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;public class Demo292Server {public static void main(String[] args) throws Exception {// 1.创建ServerSocket对象ServerSocket ss = new ServerSocket(6666);// 2.调用accept等待客户端的连接Socket s = ss.accept();// 3.调用socket中的getInputStream,读取客户端发送过来的图片InputStream is = s.getInputStream();//UUID调用randomUUID(),再去调用ToString转成字符串String string = UUID.randomUUID().toString();// 生成一个十六进制的数据String name = string + System.currentTimeMillis();// 4.创建FileOutputStram,将读取过来的图片写在硬盘上FileOutputStream fos = new FileOutputStream("AllWillBest_Java/src/S103InternetFileUpload/"+name+".jpg");// 5.边读边写byte[] bytes = new byte[1024];int len = 0;while ((len = is.read(bytes)) != -1) {fos.write(bytes, 0, len);}// 6.调用socket中的getOutputStream,给客户端响应结果System.out.println("以下代码是给客户端的响应结果");OutputStream os = s.getOutputStream();os.write("上传成功".getBytes());// 7.关流os.close();is.close();fos.close();s.close();ss.close();}
}

2.文件上传服务端实现(多线程)

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;public class Demo294ServerThread {public static void main(String[] args) throws Exception {// 1.创建ServerSocket对象ServerSocket ss = new ServerSocket(6666);while (true) {// 2.调用accept等待客户端的连接Socket s = ss.accept();new Thread(new Runnable() {@Overridepublic void run() {InputStream is = null;FileOutputStream fos = null;OutputStream os = null;try{// 3.调用socket中的getInputStream,读取客户端发送过来的图片is = s.getInputStream();//UUID调用randomUUID(),再去调用ToString转成字符串String string = UUID.randomUUID().toString();// 生成一个十六进制的数据String name = string + System.currentTimeMillis();// 4.创建FileOutputStram,将读取过来的图片写在硬盘上fos = new FileOutputStream("AllWillBest_Java/src/S103InternetFileUpload/"+name+".jpg");// 5.边读边写byte[] bytes = new byte[1024];int len = 0;while ((len = is.read(bytes)) != -1) {fos.write(bytes, 0, len);}// 6.调用socket中的getOutputStream,给客户端响应结果System.out.println("以下代码是给客户端的响应结果");os = s.getOutputStream();os.write("上传成功".getBytes());}catch(Exception e){e.printStackTrace();}finally {// 7.关流Demo295CloseUtils.closeQ(s,fos,is,os);}}}).start();}}
}
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class Demo295CloseUtils {private Demo295CloseUtils() {}public static void closeQ(Socket socket, FileOutputStream fos, InputStream is, OutputStream os){if(os!=null){try {os.close();} catch (IOException e) {throw new RuntimeException(e);}}if(is!=null){try {is.close();} catch (IOException e) {throw new RuntimeException(e);}}if(fos!=null){try {fos.close();} catch (IOException e) {throw new RuntimeException(e);}}if (socket!=null){try {socket.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}

3.整体代码实现

① 随机数取名UUID方法

import java.util.UUID;public class Demo293UUID {public static void main(String[] args) {String s = UUID.randomUUID().toString();UUID.randomUUID().toString();System.out.println("UUID: " + s);}
}

② 客户端

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class Demo291Client {public static void main(String[] args) throws Exception {// 1.创建Socket对象Socket socket = new Socket("127.0.0.1",6666);// 2.创建FileInputStream,用于读取本地上的图片FileInputStream fis = new FileInputStream("D:\\2LFE\\Desktop\\前端三剑客\\css\\CSS.day4\\综合案例-抖音解决方案.jpg");// 3.调用getOutputStream,用于将读取过来的图片写给服务端OutputStream os = socket.getOutputStream();// 4.边读边写byte[] bytes = new byte[1024];int len = 0;while ((len = fis.read(bytes)) != -1) {os.write(bytes, 0, len);}// 给服务端写一个结束标记socket.shutdownOutput();System.out.println("以下代码是读取响应的结果");// 5.调用getInputStream,读取响应结果InputStream is = socket.getInputStream();byte[] bytes1 = new byte[1024];int len1 = is.read(bytes1);System.out.println(new String(bytes1, 0, len1));// 6.关流is.close();os.close();fis.close();socket.close();}
}

③ 服务端常规实现

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;public class Demo292Server {public static void main(String[] args) throws Exception {// 1.创建ServerSocket对象ServerSocket ss = new ServerSocket(6666);// 2.调用accept等待客户端的连接Socket s = ss.accept();// 3.调用socket中的getInputStream,读取客户端发送过来的图片InputStream is = s.getInputStream();//UUID调用randomUUID(),再去调用ToString转成字符串String string = UUID.randomUUID().toString();String name = string + System.currentTimeMillis();// 4.创建FileOutputStram,将读取过来的图片写在硬盘上FileOutputStream fos = new FileOutputStream("AllWillBest_Java/src/S103InternetFileUpload/"+name+".jpg");// 5.边读边写byte[] bytes = new byte[1024];int len = 0;while ((len = is.read(bytes)) != -1) {fos.write(bytes, 0, len);}// 6.调用socket中的getOutputStream,给客户端响应结果System.out.println("以下代码是给客户端的响应结果");OutputStream os = s.getOutputStream();os.write("上传成功".getBytes());// 7.关流os.close();is.close();fos.close();s.close();ss.close();}
}

④ 服务端多线程实现关闭文件释放资源方法

package S103InternetFileUpload;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class Demo295CloseUtils {private Demo295CloseUtils() {}public static void closeQ(Socket socket, FileOutputStream fos, InputStream is, OutputStream os){if(os!=null){try {os.close();} catch (IOException e) {throw new RuntimeException(e);}}if(is!=null){try {is.close();} catch (IOException e) {throw new RuntimeException(e);}}if(fos!=null){try {fos.close();} catch (IOException e) {throw new RuntimeException(e);}}if (socket!=null){try {socket.close();} catch (IOException e) {throw new RuntimeException(e);}}}
}

⑤ 服务端多线程实现

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;public class Demo294ServerThread {public static void main(String[] args) throws Exception {// 1.创建ServerSocket对象ServerSocket ss = new ServerSocket(6666);while (true) {// 2.调用accept等待客户端的连接Socket s = ss.accept();new Thread(new Runnable() {@Overridepublic void run() {InputStream is = null;FileOutputStream fos = null;OutputStream os = null;try{// 3.调用socket中的getInputStream,读取客户端发送过来的图片is = s.getInputStream();//UUID调用randomUUID(),再去调用ToString转成字符串String string = UUID.randomUUID().toString();// 生成一个十六进制的数据String name = string + System.currentTimeMillis();// 4.创建FileOutputStram,将读取过来的图片写在硬盘上fos = new FileOutputStream("AllWillBest_Java/src/S103InternetFileUpload/"+name+".jpg");// 5.边读边写byte[] bytes = new byte[1024];int len = 0;while ((len = is.read(bytes)) != -1) {fos.write(bytes, 0, len);}// 6.调用socket中的getOutputStream,给客户端响应结果System.out.println("以下代码是给客户端的响应结果");os = s.getOutputStream();os.write("上传成功".getBytes());}catch(Exception e){e.printStackTrace();}finally {// 7.关流Demo295CloseUtils.closeQ(s,fos,is,os);}}}).start();}}
}

补充:服务端线程池方式实现

相关文章:

重学java 71.网络编程

人生不是坐等暴风雨过去,而是学会在雨中起舞 —— 24.6.14 一、网络编程的基础概念 1.概述: 在网络通信协议下,不同计算机上运行的程序,进行数据传输 比如:通信、视频通话、网络、邮件 只要是计算机之间通过网络进行数据传输,就有…...

Linux驱动面试题

1.导出符号表的原理? 2.字符设备驱动的框架流程 open read wirte close 是系统调用(从用户空间进入内核空间的唯一的方法)会产生swi软中断《也会存在软中断号》(从User模式切换到SVC(管理模式)下因为在…...

git 如何强制下拉某个分支

要强制下拉Git仓库中的某个分支&#xff0c;可以使用以下命令&#xff1a; 第一步&#xff1a; git reset --hard HEAD第二步 git pull origin <分支名> git reset --hard HEAD 是一个 Git 命令&#xff0c;它的作用是将当前分支的头部重置为当前提交&#xff08;HEAD…...

linux-touch指令

目录 语法 选项 示例 touch 是一个在 Linux 系统中常用的命令&#xff0c;它用于创建空文件&#xff0c;或者如果文件已经存在&#xff0c;则更新文件的访问和修改时间戳。下面是 touch 命令的完整使用说明&#xff1a; 语法 touch [选项]... 文件... 选项 -a 或 --time…...

海外仓系统有哪些?主流海外仓系统类型、优缺点,不同海外仓如何选择

作为海外仓的经营者&#xff0c;不管海外仓大小&#xff0c;你都应该知道海外仓系统对提升仓库管理效率有多重要。 不过现在市场上的海外仓系统确实种类太多了&#xff0c;想选到一个适合自己海外仓&#xff0c;性价比又比较高的wms海外仓系统也不是一件容易的事情。 本文会详…...

05-5.4.1 树的存储结构

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…...

Spring事务管理与Spring AOP详解

Spring事务管理与Spring AOP详解 一、引言 在企业级应用开发中&#xff0c;事务管理和面向切面编程&#xff08;AOP&#xff09;是两个至关重要的概念。Spring框架作为Java企业级应用的首选框架之一&#xff0c;为事务管理和AOP提供了强大的支持。本文将详细解析Spring的事务…...

LaTeX 的使用

文章目录 TeX 编辑器文档类型中文编译文档结构preamble 导言区&#xff08;不能放正文内容&#xff09;document body 正文区 正文内容目录段落列表无序列表有序列表 图片表格交叉引用段落图片表格 转义符 数学公式数学符号行内公式行间公式有公式计数器无公式计数器 公式包含文…...

Text2SQL之Vanna优化

文章目录 前言一、优化方向二、干就完了一次性生成多个Question-SQL对先生成一个问题,再根据DDL和业务数据生成SQL总结前言 前阵子写了篇Text2SQL的简单介绍,发现其也是RAG只会,写下了Text2SQL之不装了,我也是RAG 最近也一直在做Text2SQL的优化,于是把自己的一些心得,总…...

船舶行业信息安全解决方案介绍

船舶行业信息安全背景&#xff1a; 近年来随着经济复苏、疫情与国际形势影响国内外船舶海运业务蓬勃发展&#xff0c;在业务量激增的背景下出现多类信息安全事件。其中2017年&#xff0c;马士基集团遭到勒索软件攻击&#xff0c;内部业务系统和码头操作系统均受到严重影响&…...

Typora—适用于 Mac 和 Win 系统的优秀 Markdown 文本编辑器

Typora 是一款适用于 Mac 和 Win 系统的优秀 Markdown 文本编辑器&#xff0c;它以其简洁易用的界面和强大的功能受到了众多用户的喜爱。 首先&#xff0c;Typora 的界面设计非常简洁直观&#xff0c;没有过多繁杂的菜单和按钮&#xff0c;让用户能够专注于写作本身。它采用实时…...

产品经理的未来在哪里?

【同学聚会】 医生说&#xff1a;你生病的话可以找我。 老师说&#xff1a;你孩子成绩不好时找你辅导。 律师说&#xff1a;你遇上官司时我帮你。 程序员说&#xff1a;你电脑坏了时我帮你修理。 产品经理说&#xff1a;我……好像无一技之长。&#xff08;瞬间开始怀疑人…...

火车头采集怎么使用GPT等AI原创文章

火车头采集官方并没有GPT、百度文心一言AI、阿里通义千问AI、Kimi大模型等AI功能&#xff0c;但支持接入插件&#xff0c;可以编写相应人工智能AI原创文章插件&#xff08;火车头采集支持PHP和c#这2种语言的插件编写&#xff09;&#xff0c;或者导入第三方封装好的GPT等AI原创…...

多元多项式的特征列与零点的关系定理

下面这个定理来自《计算机代数》6.1三角列与特征列&#xff08;王东明、夏壁灿著&#xff09; 【定理】 设 C [ C 1 , … , C r ] \mathbb{C }\left\lbrack C_{1},\ldots,C_{r} \right\rbrack C[C1​,…,Cr​]为多项式组 P ⊂ K [ x ] \mathbb{P \subset}\mathcal{K\lbrack}\…...

git - LFS 使用方法

安装Git LFS 访问 Git LFS官网 下载适用于您操作系统的版本。 Linux用户&#xff0c;解压缩下载的.tar.gz文件&#xff0c;并通过终端运行安装脚本。 tar -xvf git-lfs-linux-amd64-vX.Y.Z.tar.gz cd git-lfs-X.Y.Z sudo ./install.sh 初始化Git LFS # 全局启用 git lfs i…...

提高磁盘可靠性的技术:保障数据安全的四大方法

目录 1. 第一级容错技术 磁盘镜像&#xff08;Mirroring&#xff09; 工作原理 RAID 1 工作原理 优点 缺点 适用场景 示例 2. 第二级容错技术 概述 RAID 5 RAID 6 优点 缺点 适用场景 3. 基于集群系统的容错技术 概述 Hadoop HDFS Ceph 优点 缺点 适用场…...

CesiumJS【Basic】- #006 浏览器控制台查看位置角度

文章目录 浏览器控制台查看位置角度1 目标 浏览器控制台查看位置角度 1 目标 浏览器控制台查看位置角度...

Mac 终端报错 zsh: command not found: brew 解决方案

Homebrew安装 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装成功后&#xff0c;在终端输入下面命令 brew -v如果成功输出brew版本&#xff0c;则安装成功 关闭终端重新打开终端&#xff0c;报错zsh: comm…...

详解 HBase 的常用 API

一、环境准备 创建一个 Maven 工程并引入依赖 <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-server</artifactId><version>1.3.1</version> </dependency> <dependency><groupId>org.apach…...

JSR303校验

校验的需求 前端请求后端接口传输参数&#xff0c;需要校验参数。 在controller中需要校验参数的合法性&#xff0c;包括&#xff1a;必填项校验、数据格式校验等在service中需要校验业务规则&#xff0c;比如&#xff1a;课程已经审核过了&#xff0c;所以提交失败。 servi…...

04 远程访问及控制

1、SSH远程管理 SSH是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程复制等功能。 SSH协议对通信双方的数据传输进行了加密处理&#xff08;包括用户登陆时输入得用户口令&#xff09;。 终端&#xff1a;接收用户的指令 TTY终端不能远程&#xff0c;它…...

[晕事]今天做了件晕事38 shell里的source 点号

今天碰到一个问题脚本里使用点号引入某个文件形式如下&#xff1a; . /tmp/abc但是脚本运行出现错误&#xff0c;一开始还以为是/tmp没有可执行权限&#xff08;https://mzhan017.blog.csdn.net/article/details/112178736#t16&#xff09;&#xff0c;导致abc运行不了。 后来…...

java如何分割字符串

java要实现对字符串的分割&#xff0c;需要用到split语句 语法格式是 str.split(分隔符) 其中 str是字符串 示例代码如下 public class Stringsplit {public static void main(String[] args) {String a"蒸羊羔&#xff0c;蒸熊掌&#xff0c;蒸鹿尾&#xff0c;烧花…...

胡说八道(24.6.12)——数字电子技术以及Modelsim

上回书说到数电中的最常用的表达式——逻辑表达式(由布尔代数组成)以及常用的两种图表——真值表(真值表表示的是所有的输入可能的线性组合以及输出)和卡诺图(卡诺图则是一种化简工具&#xff0c;排除冗余项&#xff0c;合并可合并项)。 今天&#xff0c;先来看看昨天说的基本逻…...

【Android面试八股文】AsyncTask中的任务是串行的还是并行的

文章目录 串行执行并行执行示例代码串行执行(默认)并行执行总结AsyncTask 的任务执行方式可以是串行的,也可以是并行的,这取决于使用的执行器 ( Executor)。 串行执行 默认情况下,AsyncTask 使用的是 SERIAL_EXECUTOR,即任务按顺序一个接一个地执行。这意味着下一个任务…...

无人机RTMP推流EasyDSS直播平台推流成功,不显示直播按钮是什么原因?

互联网视频云平台/视频点播直播/视频推拉流EasyDSS支持HTTP、HLS、RTMP等播出协议&#xff0c;并且兼容多终端&#xff0c;如Windows、Android、iOS、Mac等。为了便于用户集成与二次开发&#xff0c;我们也提供了API接口供用户调用和集成。在无人机场景上&#xff0c;可以通过E…...

经验分享,xps格式转成pdf格式

XPS 是一种电子文档格式、后台打印文件格式和页面描述语言。有时候微软默认打印机保存的是xps格式&#xff0c;我们如何转换为pdf格式呢&#xff0c;这里分享一个免费好用的网站&#xff0c;可以实现。 网站&#xff1a;https://xpstopdf.com/zh/ 截图&#xff1a;...

基于51单片机的音乐彩灯设计

基于51单片机的音乐彩灯设计 &#xff08;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 由STC单片机ADC0809模块LM386功放模块喇叭音频接口发光二极管电源构成 1.通过音频线输入可以播放电脑、手机、MP3里面的音乐。 2.AD对音频…...

API接口设计的艺术:如何提升用户体验和系统性能

在数字时代&#xff0c;API接口的设计对于用户体验和系统性能有着至关重要的影响。良好的设计可以显著提升应用程序的响应速度、可靠性和易用性。以下是几个关键点&#xff0c;帮助改善API接口的设计&#xff1a; 1. 理解并定义清晰的要求 用户研究&#xff1a;与最终用户进行…...

韩兴国/姜勇团队在《Trends in Plant Science》发表植物根系氮素再分配的观点文章!

氮素是陆地生态系统中的关键限制性营养元素&#xff0c;通过生物固氮和土壤氮供应通常远低高等植物的氮需求。当土壤氮素供应无法充分满足植物茎叶生长需求时&#xff0c;植物会通过自身营养器官&#xff08;如根或根茎&#xff09;再分配来实现氮的内部循环和再利用。尽管植物…...

房地产怎么做网站推广/自己创建个人免费网站

Linux是一个多用户的操作系统。每个用户登录系统后&#xff0c;都会有一个专用的运行环境。通常每个用户默认的环境都是相同的&#xff0c;这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制&#xff0c;其方法就是修改相应的系统环境变量。什么是环…...

网站建设第三方平台/百度网盘资源搜索入口

今天主要学了爬虫技术&#xff0c;爬取mp4格式&#xff0c;爬取豆瓣电影。一、爬虫原理 1.什么是互联网? 指的是由一堆网络设备&#xff0c;把一台台的计算机互联网到一起称之为互联网。 2.互联网建立的目的? 互联网建立的目的是为了数据的传递以及数据的…...

wordpress的根目录/关键词规划师工具

工作以来&#xff08;除了刚开头用过几个月Java&#xff09;一直走在微软.NET路线上&#xff0c;可惜至今也没能做出一点小小成就来。尤其发现了博客园以后&#xff0c;觉得天下高手何其多。虽然今年的工作重点可能不再是.NET开发&#xff0c;但不愿意就此放弃.NET。以前在项目…...

口碑好的网站开发公司电话/深圳网络营销推广招聘网

1. 问题描述&#xff1a; 假设现在有两个自然数 A 和 B&#xff0c;S 是 A ^ B 的所有约数之和。请你求出 S mod 9901 的值是多少。 输入格式 在一行中输入用空格隔开的两个整数 A 和 B。 输出格式 输出一个整数&#xff0c;代表 S mod 9901 的值。 数据范围 0 ≤ A&…...

昆明官方网站建设/福州百度推广电话

ExecutorService是java中的一个异步执行的框架&#xff0c;通过使用ExecutorService可以方便的创建多线程执行环境。 本文将会详细的讲解ExecutorService的具体使用。 创建ExecutorService 通常来说有两种方法来创建ExecutorService。 第一种方式是使用Executors中的工厂类…...

集团公司网站设计/1688官网入口

本人用入栈出栈来模拟递归的过程&#xff0c;下面是栈的结构和递归代码和非递归&#xff1a;typedef struct{int *base;int top;}Stack;void Nonrec_QuickSort(SqList &L,int low,int high)//非递归的快速排序{if(low>high)return;int left;int right;int pivot;Stack S…...