重学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();}}
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL3.3_C++_Windows(11)

git submodule项目子模块 Git Submodule (子模块的代码并不直接存储在父仓库中,而是通过一个指针来维护)克隆含有子模块的仓库时,使用git管理Git Clone (复制一份完整的Git仓库到本地)若仓库包含子模块&am…

vivado PIN

描述 引脚是基元或层次单元上的逻辑连接点。引脚允许 要抽象掉单元格的内容,并简化逻辑以便于使用。引脚可以 是标量的,包含单个连接,或者可以定义为对多个进行分组的总线引脚 信号在一起。 相关对象 引脚连接到一个单元,并且可以…

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

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

Docker部署Nginx下载站点服务

1、下载镜像 由于docker官方镜像站点被封了,所以我把镜像上传到阿里云镜像仓库了 docker pull registry.cn-hangzhou.aliyuncs.com/qinzt-tools/file-nginx:1.18.02、运行容器实例 运行变量解释: 变量名称默认值解释USERhyadmin访问下载站点的认证用…

第2章 Rust初体验4/8:提供标准库之外功能的Library Crate:简化包管理和依赖管理:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.4 故事2: 生成点数之和的随机答案 又是新的一天,大家的培训课又开始了哦!现在,我们的学员们开始用三种语言来实现故事2,加油! 2.4.1 Rust版故事2 2.4.1.1 提供标准库之外功能的Library Crate:简化包管理和依赖管理 贾克强:“我们的故事…

中电金信:银行业数据中心何去何从

20多年前,计算机走进国内大众视野,计算机行业迎来在国内的高速发展时代。银行业是最早使用计算机的行业之一,也是计算机技术应用最广泛、最深入的行业之一。近年来,随着银行竞争加剧,科技如何引领业务、金融科技如何发…

26 岁的“天才少年”,带队面壁打通高效大模型之路

每一轮技术浪潮出现时,冲在最前面的都是朝气蓬勃的年轻人。 当大模型代表的人工智能浪潮席卷全球,作为移动互联网“原住民”的年轻开发者,可以说是最活跃的群体。他们的脸庞还有些稚嫩,但在技术和方向上有着自己的想法&#xff0…

一些激活函数

一些激活函数 摘要激活函数分类sigmoidTanhSoftsignSoftmaxReLUSoftplusNoisy ReLULeaky ReLUPReluELUSELUSwishGELUGLUGEGLUMishMaxout 摘要 本篇博客对一些激活函数进行总结,以便加深理解和记忆 激活函数分类 饱和激活函数:sigmoid、tanh… 非饱和激…

Anritsu 安立 MS2720T 手持式频谱分析仪

Anritsu 安立 MS2720T 手持式频谱分析仪 频谱分析仪功能特点 频率范围: 9 kHz ~ 9 GHz、13 GHz 和 20 GHz测量: 占用的带宽、信道功率、ACPR、C/I、发射波罩、杂散发射、场强适用于 LTE(FDD & TDD)、CDMA、W-CDMA、WiMAX、GSM 和 TD-SCDMA 的 3G 和…

代码随想录算法训练营第二十六天|39. 组合总和、 40.组合总和II、 131.分割回文串

39. 组合总和 题目链接:39. 组合总和 文档讲解:代码随想录 状态:卡了一会儿 思路:先排序,方便剪枝。允许数字重复使用,因此递归调用时传入当前索引i。 题解: public class Solution {// 用于存…

深度学习训练——batch_size参数设置过大反而训练更耗时的原因分析

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇: 📝《图像去噪》 📝《超分辨率重建》 📝《语义分割》 📝《风格迁移》 📝《目标检测》 📝《暗光增强》 &a…

长短期记忆神经网络(LSTM)的回归预测(免费完整源代码)【MATLAB】

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊类型的递归神经网络(RNN),专门用于处理和预测基于时间序列的数据。与传统RNN相比,LSTM在处理长期依赖问题时具有显著优势。 LSTM的基本…

FFmpeg中内存分配和释放相关的源码:av_malloc函数、av_mallocz函数、av_free函数和av_freep函数分析

一、av_malloc函数分析 (一)av_malloc函数的声明 av_malloc函数的声明放在在FFmpeg源码(本文演示用的FFmpeg源码版本为5.0.3,该ffmpeg在CentOS 7.5上通过10.2.1版本的gcc编译)的头文件libavutil/mem.h中:…

Ubuntu网络管理命令:ifconfig

安装Ubuntu桌面系统(虚拟机)_虚拟机安装ubuntu桌面版-CSDN博客 关于ifconfig命令,在11.1节已经介绍过了。通过该命令可以查看和配置网络接口。ifconfig是一个比较古老的命令,在Ubuntu 22以及其他的许多发行版中,已经不…

【前端项目笔记】2 主页布局

主页布局 element-ui提供的组件名称就是它的类名 ☆☆ CSS选择器: (1)基本选择器 类型选择器 p/span/div…… 类选择器 (.classname) ID选择器 (#idname) 通配选择器 ( * ) (2)属性选择器 选择具有特定属性或属性值的…

最新下载:CrossOver 2024【软件附加安装教程】

CrossOver不像Parallels或VMware的模拟器,而是实实在在Mac OS X系统上运行的一个软件。CrossOvers能够直接在Mac上运行Windows软件与游戏,而不需虚拟机。它为Windows软件提供所需的资源,以达到在Mac OS X系统上运行Windows程序的目的。 安 装…

【网络安全学习】使用Kali做渗透情报收集-01-<域名信息主机信息>

1.收集开源情报 开源情报(Open Source Intelligence,OSINT)是指从各种公开的渠道中寻找和获取有价值的信息 如:互联网、媒体、社交网络、公共数据库等开源情报具有以下特点: - 丰富性:开源情报涵盖了各种类型和领域的信息 - 可…

linux centos consul1.15.2一键安装部署

consul原理、作用、安装相关内容 一、理论部分二、安装下载版本地址三、安装consul服务 一、理论部分 1、consul的原理 Consul的原理及作用可以归纳为以下几点: ①、基于Gossip协议的通信:Consul使用了基于Gossip协议的Serf实现来进行通信。 Gossip协议…

矩阵乘法的直觉

矩阵乘法是什么意思? 一种常见的观点是矩阵乘法缩放/旋转/倾斜几何平面: NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜…

分数限制下,选好专业还是选好学校?

目录 分数限制下,选好专业还是选好学校? 方向一:专业解析 1. 专业选择的重要性 2. 不同专业的优势与挑战 3. 个人专业选择经验分享 4. 实际场景下的“专业VS学校”选择方案 方向二:名校效应分析 1. 名校声誉与品牌效应 2…