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

Java网络编程(JavaWeb的基础)

Java网络编程(JavaWeb的基础)

文章目录

    • Java网络编程(JavaWeb的基础)
    • 前言
    • 一、网络编程概述
      • 1.1 软件架构&网络基础
      • 1.2 网络通信要素:IP/端口/通信协议
      • 1.3 传输层协议:tcp/udp
    • 二、网络编程API
      • 2.1 InetAddress类
      • 2.2 Socket类&相关API
    • 三、网络编程实现
      • 3.1 TCP网络编程
      • 3.2 UDP网络编程
      • 3.3 URL编程
    • 四、企业真题


前言

  • 区分网络中的不能主机:唯一的IP地址
  • 常用的网络应用程序模型:客户端-服务器。
    • 服务器:是一个为其客户端提供某种特定服务的硬件或软件。
    • 客户机是一个用户应用程序,用于访问某台服务器提供的服务。端口号是对一个服务的访问场所,它用于区分同一物理计算机上的多个服务。套接字用于连接客户端和服务器,客户端和服务器之间的每个通信会话使用一个不同的套接字。TCP协议用于实现面向连接的会话。
  • Java 中有关网络方面的功能都定义在 java.net 程序包中。Java 用 InetAddress 对象表示 IP 地址,该对象里有两个字段:主机名(String) 和 IP 地址(int)。
  • 类 Socket 和 ServerSocket 实现了基于TCP协议的客户端-服务器程序。Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道,这是因为 TCP 协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。
  • 类 URL 和 URLConnection 提供了最高级网络应用。URL 的网络资源的位置来同一表示 Internet 上各种网络资源。通过URL对象可以创建当前应用程序和 URL 表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。

一、网络编程概述

1.1 软件架构&网络基础

1、Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,能开发常见的网络应用程序。
Java提供的网络类库,调用相关API即可实现通信。联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境
2、软件架构
C/S架构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、美团app、360安全卫士等软件。
B/S架构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有IE、谷歌、火狐等。

3、计算机网络:
把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。

4、网络编程的目的:直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
网络编程中有三个主要的问题:——如何实现网络中的主机相互通信?

  • 问题1:如何准确地定位网络上一台或多台主机——IP地址
  • 问题2:如何定位主机上的特定的应用——端口号
  • 问题3:找到主机后,如何可靠、高效地进行数据传输——tcp连接(流量控制、拥塞控制、确认、重试)

1.2 网络通信要素:IP/端口/通信协议

网络的通信本质上是两个进程(应用程序)的通信。
1、通信双方的地址,即网络通信要素:

  • IP:唯一标识网络中的设备,即网络地址,可以动态分配。全称是互联网协议地址(Internet Protocol Address)。与MAC区别:MAC唯一标识计算机的物理地址,不可变。
  • 端口号:唯一标识设备中的进程(应用程序)
  • 网络通信协议:不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则

2、Internet上的主机地址表示方式:
域名(hostName):www.atguigu.com
IP地址(hostAddress):2.2.108.35.210

DNS:域名——》IP地址,DNS查找IP地址的查询过程可以是递归、迭代
DNS分类:本地、权威、顶级、根
DNS查找IP过程
3、IP地址分类一:IPv4、IPv6

  • IPv4:32位二进制数,即4个字节,表示方式:点分十进制,范围0~255。最多42亿个(30亿在北美,亚洲4亿,中国2.9亿,11年用尽)。
    • 网络地址:标识计算机或网络设备所在的网段
    • 主机地址:标识特定主机或网络设备
  • IPv6:128位二进制,即16个字节,8个无符号整数,冒分16进制。比如:“ABCD:EF01:2345:6789:ABCD:EF01:2345:6789”。
    额外优点:端到端IP连接、服务质量(QoS)、安全性、多播、移动性、即插即用等。
    IPv4地址分类

IP地址分类二:

  • 公网地址( 万维网使用)
  • 私有地址( 局域网使用):192.168.开头,范围即为192.168.0.0–192.168.255.255,专门为组织机构内部使用。
  • 特殊的:本地回环地址(hostAddress):127.0.0.1、主机名(hostName):localhost

如何查看IP地址

# 查看本机IP地址
ipconfig
# 检查网络是否连通
ping 空格 IP地址
ping 220.181.57.216

4、端口号:唯一标识设备中的进程(应用程序)。16位二进制,即2个字节,取值范围是0~65535。

  • 公认端口:0~1023。被预先定义的服务通信占用,如:HTTP(80),FTP(21),Telnet(23)
  • 注册端口:1024~49151。分配给用户进程或应用程序。如:Tomcat(8080),MySQL(3306),Oracle(1521)。
  • 动态/ 私有端口:49152~65535。

说明:如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败。

5、网络通信协议:在计算机网络中,连接和通信的规则,它规定了数据的传输格式、传输速率、传输步骤、出错控制等,通信双方必须同时遵守才能完成数据交换。

计算机网络通信涉及内容:比如指定源地址和目标地址,加密解密,压缩解压缩,差错控制,流量控制,路由控制,如何实现如此复杂的网络协议呢?
答:采用通信协议分层思想。同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。

  • OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
  • TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。
    • TCP/IP协议:传输控制协议/因特网互联协议( Transmission Control Protocol/Internet Protocol),是Internet最基本、最广泛的协议。

OSI-TCP/IP网络模型
6、TCP/IP协议中的四层介绍:

  • 应用层:决定了向用户提供应用服务时通信的活动。主要协议有:HTTP协议、FTP协议、SNMP(简单网络管理协议)、SMTP(简单邮件传输协议)和POP3(Post Office Protocol 3的简称,即邮局协议的第3个版)等。
  • 传输层:主要使网络程序进行通信,可以采用TCP协议、UDP协议。
    • TCP(Transmission Control Protocol)协议,即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
      确认、重试机制、流量控制(滑动窗口)、拥塞控制(慢开始和拥塞避免)
    • UDP(User Datagram Protocol,用户数据报协议):是一个无连接的传输层协议、提供面向事务的简单不可靠的信息传送服务。
  • 网络层:支持网间互连的数据通信。它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
    • IP(internet protocal)又称为互联网协议,网络层非常重要的一种协议。作用:把数据从源传送到目的地。它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。
  • 物理+数据链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
    TCP/IP网络模型的各层协议

1.3 传输层协议:tcp/udp

1、UDP协议:用户数据报协议(User Datagram Protocol)
适用于发送端、接收端2个应用进程,无需建立连接,无论对方是否准备好,接收方收到也不确认,不能保证数据的完整性,因此是不可靠的。发送接收时无需释放资源,开销小,通信效率高。
传输的基本单位:数据、源、目的封装成数据包,大小限制64k。
适用场景:音频、视频和普通数据的传输。例如视频会议
例如生活中的发送短信、发电报

2、TCP协议:传输控制协议 (Transmission Control Protocol)
必须先"三次握手"建立连接,形成基于字节流的传输数据通道,点对点通信,可靠的。传输结束需要释放连接,效率低。通信双方:客户端、服务端。
保证可靠性:重发、确认机制、流量控制
例如下载文件、浏览网页等。
例如生活中的场景:打电话。

(1)三次握手:在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

  • 第一次握手,客户端向服务器端发起TCP连接的请求
  • 第二次握手,服务器端发送针对客户端TCP连接请求的确认
  • 第三次握手,客户端发送确认的确认
    TCP的三次握手

step1:客户端会随机一个初始序列号seq=x,设置SYN=1 ,表示这是SYN握手报文。向服务端发起连接,之后客户端处于同步已发送状态。
step2:服务端收到客户端的 SYN 报文后,也随机一个初始序列号(seq=y),设置ack=x+1,表示收到了客户端的x之前的数据,希望客户端下次发送的数据从x+1开始。SYN=1 和 ACK=1:表示SYN握手和ACK确认应答报文,把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于同步已接收状态。
step3:客户端收到服务端报文后,向服务端回应最后一个应答报文(ACK=1,ack=y+1 ,表示收到了服务器的y之前的数据,希望服务器下次发送的数据从y+1开始。)。把报文发送给服务端,这次报文可以携带数据,之后客户端处于 连接已建立 状态。服务器收到客户端的应答报文后,也进入连接已建立状态。
握手报文——》确认应答报文——》应答报文

(2)四次挥手:在发送数据结束后,释放连接时需要经过四次挥手。

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

1、客户端打算断开连接,向服务器发送FIN报文(FIN标记位被设置为1,1表示为FIN,0表示不是),FIN报文中会指定一个序列号,之后客户端进入FIN_WAIT_1状态。也就是客户端发出连接释放报文段(FIN报文),指定序列号seq = u,主动关闭TCP连接,等待服务器的确认。
2、服务器收到连接释放报文段(FIN报文)后,就向客户端发送ACK应答报文,以客户端的FIN报文的序列号 seq+1 作为ACK应答报文段的确认序列号ack = seq+1 = u + 1。接着服务器进入CLOSE_WAIT(等待关闭)状态,此时的TCP处于半关闭状态(下面会说什么是半关闭状态),客户端到服务器的连接释放。客户端收到来自服务器的ACK应答报文段后,进入FIN_WAIT_2状态。
3、服务器也打算断开连接,向客户端发送连接释放(FIN)报文段,之后服务器进入LASK_ACK(最后确认)状态,等待客户端的确认。服务器的连接释放(FIN)报文段的FIN=1,ACK=1,序列号seq=m,确认序列号ack=u+1。
4、客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送一个ACK应答报文段,以连接释放(FIN)报文段的确认序号 ack 作为ACK应答报文段的序列号 seq,以连接释放(FIN)报文段的序列号 seq+1作为确认序号ack。
之后客户端进入TIME_WAIT(时间等待)状态,服务器收到ACK应答报文段后,服务器就进入CLOSE(关闭)状态,到此服务器的连接已经完成关闭。客户端处于TIME_WAIT状态时,此时的TCP还未释放掉,需要等待2MSL后,客户端才进入CLOSE状态。

二、网络编程API

java.net 包中包含的类和接口,它们提供低层次的通信细节。可以直接使用这些类和接口,来专注于网络程序开发,而不用考虑通信的细节。
提供了两种常见的网络协议的支持:UDP、TCP
网络编程:需要ip地址、建立tcp/udp连接

2.1 InetAddress类

1、InetAddress类:实例代表一个具体的ip地址——万事万物皆对象。
两个子类:Inet4Address、Inet6Address。

获取InetAddress 实例方法,没有提供公共的构造器;InetAddress的常用方法

/** 获取InetAddress实例
*/
//法1: 获取指定IP对应的InetAddress的实例, "127.0.0.1"也是表示本地
InetAddress inet1 = InetAddress.getByName("192.168.23.31");///192.168.23.31
InetAddress inet2 = InetAddress.getByName("www.atguigu.com");//www.atquiqu.com/122.228.95.175//法2: 获取本机IP地址对应额InetAddress实例
InetAddress inet3 = InetAddress.getLocalHost();//DESKTOP-QCP2QPI/192.168.21.107//法3: public static InetAddress getByAddress(byte[] addr)/** InetAddress常用的方法
*/
String hostAddress = inet1.getHostAddress();//获取IP地址
String hostName = inet1.getHostName();//获取主机名, 没有就显示域名
boolean bol = inet1.isReachable(int timeout);//测试是否可以达到该地址

2.2 Socket类&相关API

1、套接字Socket:IP+端口号=唯一能识别的标识符套接字(Socket)。
建立TCP连接的两端就是套接字。网络通信其实就是Socket间的通信。

  • 通信的两端都要有Socket,是两台机器间通信的端点。
  • Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
  • 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。

2、Socket分类:

  • 流套接字(stream socket):使用TCP提供可依赖的字节流服务
    • ServerSocket:此类实现TCP服务器套接字。服务器套接字等待请求通过网络传入。
    • Socket:此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
  • 数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务
    • DatagramSocket:此类表示用来发送和接收UDP数据报包的套接字。

三、网络编程实现

TCP:ServerSocket、Socket
UDP:DatagramSocket、DatagramPacket

  • 客户端:自定义、浏览器(browser — server)
  • 服务端:自定义、Tomcat服务器

3.1 TCP网络编程

1、TCP通信模型:
基于TCP的Socket通信
2、开发整体步骤:Java语言的基于套接字TCP编程分为服务端编程和客户端编程。

  • 客户端程序 :
    • Step1:创建 Socket :服务端的 IP+端口号构造 Socket 类对象(套接字)。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
    • Step2:打开连接到 Socket 的输入/ 出流: 使用 getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流,进行数据传输。
    • Step3:按照一定的协议对 Socket 进行读/ 写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线路。
    • Step4:关闭 Socket :断开客户端到服务器的连接,释放线路
  • 服务器端程序:
    • Step1:创建服务端套接字,并绑定到指定端口上,用于监听客户端的请求:调用 ServerSocket(int port)
    • Step2:监听客户端连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象:调用 accept()
    • Step3:获取输出流和输入流,开始网络数据的发送和接收:调用 该Socket 类对象的 getOutputStream() 和 getInputStream ()
    • Step4:关闭Socket 对象:客户端访问结束,关闭通信套接字。

注意点:如果客户端发送完数据没有关闭,服务端会认为他还要发送就不会将数据输出。

TCP提供可依赖的字节流服务:ServerSocket、Socket

1、ServerSocket类
(1)构造方法:
ServerSocket(int port) :创建绑定到特定端口的服务器套接字。(2)常用方法:
Socket accept():侦听并接受到此套接字的连接。2、Socket类
(1)常用构造方法:
- public Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
- public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。(2)常用方法:——可以发送、接收数据
- public InputStream getInputStream():返回此套接字的输入流,可以用于接收消息
- public OutputStream getOutputStream():返回此套接字的输出流,可以用于发送消息
- public InetAddress getInetAddress():此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null。
- public InetAddress getLocalAddress():获取套接字绑定的本地地址。
- public int getPort():此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。
- public int getLocalPort():返回此套接字绑定到的本地端口。如果尚未绑定套接字,则返回 -1。
- public void close():关闭此套接字。套接字被关闭后,无法重新连接/绑定,对应的输入/输出流也会被关闭。 
- public void shutdownInput():从套接字输入流读取内容,将返回 EOF(文件结束符)。 即不能在从此套接字的输入流中接收任何数据。
- public void shutdownOutput():可以理解为客户端不再继续发送数据。注意:先后调用Socket的shutdownInput()和shutdownOutput()方法,仅仅关闭了输入流和输出流,并不等于调用Socket的close()方法。在通信结束后,仍然要调用Scoket的close()方法,因为只有该方法才会释放Socket占用的资源,比如占用的本地端口号等。

题目1:客户端连接服务器,连接成功后给服务发送“lalala”,服务器收到消息后,给客户端返回“欢迎登录”,客户端接收消息后,断开连接
以下两个分别是服务端、客户端代码

package com.atguigu.tcp.one;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {public static void main(String[] args)throws Exception {//1、准备一个ServerSocket对象,并绑定8888端口ServerSocket server =  new ServerSocket(8888);System.out.println("等待连接....");//2、在8888端口监听客户端的连接,该方法是个阻塞的方法,如果没有客户端连接,将一直等待Socket socket = server.accept();InetAddress inetAddress = socket.getInetAddress();System.out.println(inetAddress.getHostAddress() + "客户端连接成功!!");//3、获取输入流,用来接收该客户端发送给服务器的数据InputStream input = socket.getInputStream();//接收数据byte[] data = new byte[1024];StringBuilder s = new StringBuilder();int len;while ((len = input.read(data)) != -1) {s.append(new String(data, 0, len));}System.out.println(inetAddress.getHostAddress() + "客户端发送的消息是:" + s);//4、获取输出流,用来发送数据给该客户端OutputStream out = socket.getOutputStream();//发送数据out.write("欢迎登录".getBytes());out.flush();//5、关闭socket,不再与该客户端通信//socket关闭,意味着InputStream和OutputStream也关闭了socket.close();//6、如果不再接收任何客户端通信,可以关闭ServerSocketserver.close();}
}
package com.atguigu.tcp.one;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {public static void main(String[] args) throws Exception {// 1、准备Socket,连接服务器,需要指定服务器的IP地址和端口号Socket socket = new Socket("127.0.0.1", 8888);// 2、获取输出流,用来发送数据给服务器OutputStream out = socket.getOutputStream();// 发送数据out.write("lalala".getBytes());//会在流末尾写入一个“流的末尾”标记,对方才能读到-1,否则对方的读取方法会一致阻塞socket.shutdownOutput();//3、获取输入流,用来接收服务器发送给该客户端的数据InputStream input = socket.getInputStream();// 接收数据byte[] data = new byte[1024];StringBuilder s = new StringBuilder();int len;while ((len = input.read(data)) != -1) {s.append(new String(data, 0, len));}System.out.println("服务器返回的消息是:" + s);//4、关闭socket,不再与服务器通信,即断开与服务器的连接//socket关闭,意味着InputStream和OutputStream也关闭了socket.close();}
}

聊天室的模型

聊天室的实现:ServerSocket充当接收数据、将数据分发目标给对象。Socket客户端有几个人聊天就是几个,服务端只负责接收、分发。
客户端可以发送也可以接受——两个线程
服务端:主线程接收,针对每个客户端开启分线程处理数据

package com.atguigu.tcp;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;public class TestChatServer {//这个集合用来存储所有在线的客户端static ArrayList<Socket> online = new  ArrayList<Socket>();public static void main(String[] args)throws Exception {//1、启动服务器,绑定端口号ServerSocket server = new ServerSocket(8989);//2、接收n多的客户端同时连接while(true){Socket accept = server.accept();online.add(accept);//把新连接的客户端添加到online列表中MessageHandler mh = new MessageHandler(accept);mh.start();//}}static class MessageHandler extends Thread{private Socket socket;private String ip;public MessageHandler(Socket socket) {super();this.socket = socket;}public void run(){try {ip = socket.getInetAddress().getHostAddress();//插入:给其他客户端转发“我上线了”sendToOther(ip+"上线了");//(1)接收该客户端的发送的消息InputStream input = socket.getInputStream();InputStreamReader reader = new InputStreamReader(input);BufferedReader br = new BufferedReader(reader);String str;while((str = br.readLine())!=null){//(2)给其他在线客户端转发sendToOther(ip+":"+str);}sendToOther(ip+"下线了");} catch (IOException e) {try {sendToOther(ip+"掉线了");} catch (IOException e1) {e1.printStackTrace();}}finally{//从在线人员中移除我online.remove(socket);}}//封装一个方法:给其他客户端转发xxx消息public void sendToOther(String message) throws IOException{//遍历所有的在线客户端,一一转发for (Socket on : online) {OutputStream every = on.getOutputStream();//为什么用PrintStream?目的用它的println方法,按行打印PrintStream ps = new PrintStream(every);ps.println(message);}}}
}
package com.atguigu.tcp;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;public class TestChatClient {public static void main(String[] args)throws Exception {//1、连接服务器Socket socket = new Socket("127.0.0.1",8989);//2、开启两个线程//(1)一个线程负责看别人聊,即接收服务器转发的消息Receive receive = new Receive(socket);receive.start();//(2)一个线程负责发送自己的话Send send = new Send(socket);send.start();send.join();//等我发送线程结束了,才结束整个程序socket.close();}
}
class Send extends Thread{private Socket socket;public Send(Socket socket) {super();this.socket = socket;}public void run(){try {OutputStream outputStream = socket.getOutputStream();//按行打印PrintStream ps = new PrintStream(outputStream);Scanner input = new Scanner(System.in);//从键盘不断的输入自己的话,给服务器发送,由服务器给其他人转发while(true){System.out.print("自己的话:");String str = input.nextLine();if("bye".equals(str)){break;}ps.println(str);}input.close();} catch (IOException e) {e.printStackTrace();}}}
class Receive extends Thread{private Socket socket;public Receive(Socket socket) {super();this.socket = socket;}public void run(){try {InputStream inputStream = socket.getInputStream();Scanner input = new Scanner(inputStream);while(input.hasNextLine()){String line = input.nextLine();System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
}

3.2 UDP网络编程

1、UDP通信模型
定义:UDP(User Datagram Protocol,用户数据报协议):是一个无连接的传输层协议、提供面向事务的简单不可靠的信息传送服务,类似于短信。

  • 面向非连接的协议,尽最大努力交付,不保证可靠交付,即不管对方状态直接发送,发送完也不管对方是否可以接收到。好处:快、节省内存空间、流量,因为维护连接需要大量的数据结构。没有TCP的确认、重传机制。
  • UDP协议是面向数据报文的信息传送服务。UDP在发送端没有缓冲区,对于应用层交付下来的报文在添加了首部之后就直接交付于ip层,不会进行合并,也不会进行拆分,而是一次交付一个完整的报文。
  • UDP协议没有拥塞控制,所以当网络出现的拥塞不会导致主机发送数据的速率降低。虽然UDP的接收端有缓冲区,但是这个缓冲区只负责接收,并不会保证UDP报文的到达顺序是否和发送的顺序一致。因为网络传输的时候,由于网络拥塞的存在是很大的可能导致先发的报文比后发的报文晚到达。如果此时缓冲区满了,后面到达的报文将直接被丢弃。这个对实时应用来说很重要,比如:视频通话、直播等应用。
  • 因此UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境,数据报大小限制在64K以下。
    UDP通信模型
    2、开发步骤
  • 发送端:
    • 创建DatagramSocket :默认使用系统随机分配端口号。
    • 创建DatagramPacket数据报文:将要发送的数据用字节数组表示,并指定要发送的数据长度,接收方的IP地址和端口号。
    • 调用 该DatagramSocket 类对象的 send方法 :发送数据报DatagramPacket对象。
    • 关闭DatagramSocket 对象:发送端程序结束,关闭通信套接字。
  • 接收端:
    • 创建DatagramSocket :指定监听的端口号。
    • 创建DatagramPacket:指定接收数据用的字节数组,起到临时数据缓冲区的效果,并指定最大可以接收的数据长度。
    • 调用 该DatagramSocket 类对象的receive方法 :接收数据报DatagramPacket对象。。
    • 关闭DatagramSocket :接收端程序结束,关闭通信套接字。

UDP提供“尽力而为”的数据报服务:DatagramSocket、DatagramPacket
DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送、接收的数据报。

1、DatagramSocket类——常用方法
- public DatagramSocket(int port)创建数据报套接字并将其绑定到本地主机上的指定端口。套接字将被绑定到通配符地址,IP 地址由内核来选择。
- public DatagramSocket(int port,InetAddress laddr)创建数据报套接字,将其绑定到指定的本地地址。本地端口必须在 0 到 65535 之间(包括两者)。如果 IP 地址为 0.0.0.0,套接字将被绑定到通配符地址,IP 地址由内核选择。 
- public void close()关闭此数据报套接字。 
- public void send(DatagramPacket p)从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。 
- public void receive(DatagramPacket p)从此套接字接收数据报包。当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据。数据报包也包含发送方的 IP 地址和发送方机器上的端口号。 此方法在接收到数据报前一直阻塞。数据报包对象的 length 字段包含所接收信息的长度。如果信息比包的长度长,该信息将被截短。 
- public InetAddress getLocalAddress()获取套接字绑定的本地地址。
- public int getLocalPort()返回此套接字绑定的本地主机上的端口号。 
- public InetAddress getInetAddress()返回此套接字连接的地址。如果套接字未连接,则返回 null。
- public int getPort()返回此套接字的端口。如果套接字未连接,则返回 -1。2、DatagramPacket类——常用方法
- public DatagramPacket(byte[] buf,int length)构造 DatagramPacket,用来接收长度为 length 的数据包。 length 参数必须小于等于 buf.length。
- public DatagramPacket(byte[] buf,int length,InetAddress address,int port)构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。
- public InetAddress getAddress()返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
- public int getPort()返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
- `public byte[] getData()`返回数据缓冲区。接收到的或将要发送的数据从缓冲区中的偏移量 offset 处开始,持续 length 长度。
- `public int getLength()`返回将要发送或接收到的数据的长度。

基于UDP协议的网络编程仍然需要在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送、接收数据报的对象。

package com.atguigu.udp;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.ArrayList;public class Send {public static void main(String[] args)throws Exception {
//		1、建立发送端的DatagramSocketDatagramSocket ds = new DatagramSocket();//要发送的数据ArrayList<String> all = new ArrayList<String>();all.add("尚硅谷让天下没有难学的技术!");all.add("学高端前沿的IT技术来尚硅谷!");all.add("尚硅谷让你的梦想变得更具体!");all.add("尚硅谷让你的努力更有价值!");//接收方的IP地址InetAddress ip = InetAddress.getByName("127.0.0.1");//接收方的监听端口号int port = 9999;//发送多个数据报for (int i = 0; i < all.size(); i++) {
//			2、建立数据包DatagramPacketbyte[] data = all.get(i).getBytes();DatagramPacket dp = new DatagramPacket(data, 0, data.length, ip, port);
//			3、调用Socket的发送方法ds.send(dp);}
//		4、关闭Socketds.close();}
}
package com.atguigu.udp;import java.net.DatagramPacket;
import java.net.DatagramSocket;public class Receive {public static void main(String[] args) throws Exception {
//		1、建立接收端的DatagramSocket,需要指定本端的监听端口号DatagramSocket ds = new DatagramSocket(9999);//一直监听数据while(true){//2、建立数据包DatagramPacketbyte[] buffer = new byte[1024*64];DatagramPacket dp = new DatagramPacket(buffer,buffer.length);//3、调用Socket的接收方法ds.receive(dp);//4、拆封数据String str = new String(dp.getData(),0,dp.getLength());System.out.println(str);}
//        ds.close();}
}

3.3 URL编程

1、URL:统一资源定位符,表示Internet上某一资源的地址。
应用层协议的组成

<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表   ---> "万事万物皆对象"

2、java.net.url类:表示URL,通过这个可以初始化一个URL对象。

3、URL类的构造器
注意:URL类的构造器都声明抛出非运行时异常,必须要对这一异常进行处理,通常是用 try-catch 语句进行捕获。

  • public URL (String spec):通过一个表示URL地址的字符串可以构造一个URL对象。例如:
  • public URL(URL context, String spec):通过基 URL 和相对 URL 构造一个 URL 对象。例如:
  • public URL(String protocol, String host, String file); 例如:
  • public URL(String protocol, String host, int port, String file); 例如:

4、URL中的常用方法:一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的方法来获取这些属性

  • public String getProtocol( ) 获取该URL的协议名
  • public String getHost( ) 获取该URL的主机名
  • public String getPort( ) 获取该URL的端口号
  • public String getPath( ) 获取该URL的文件路径
  • public String getFile( ) 获取该URL的文件名
  • public String getQuery( ) 获取该URL的查询名
  • URL的方法 openStream():能从网络上读取数据
/** 构造方法
*/
URL url = new URL("http://www. atguigu.com/"); 
URL downloadUrl = new URL(url, “download.html")
URL url = new URL("http", "www.atguigu.com", “download. html");
URL gamelan = new URL("http", "www.atguigu.com", 80, “download.html");
/** 常用方法
*/
URL url = new URL("http://localhost:8080/examples/myTest.txt");
System.out.println("getProtocol() :"+url.getProtocol());
System.out.println("getHost() :"+url.getHost());
System.out.println("getPort() :"+url.getPort());
System.out.println("getPath() :"+url.getPath());
System.out.println("getFile() :"+url.getFile());
System.out.println("getQuery() :"+url.getQuery());

5、针对HTTP协议的URLConnection类
建立URL连接:客户端(请求端)输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一些数据。必须先与URL建立连接,然后才能对其进行读写。

  • URLConnection:表示到URL所引用的远程对象的连接。通过URLConnection对象获取的输入流和输出流,即可以与现有的CGI程序进行交互。
    • 获取URLConnection对象:即与一个URL建立连接,URL对象的openConnection()。如果连接过程失败,将产生IOException.
    • public Object getContent( ) throws IOException
    • public int getContentLength( )
    • public String getContentType( )
    • public long getDate( )
    • public long getLastModified( )
    • public InputStream getInputStream ( ) throws IOException
    • public OutputSteram getOutputStream( )throws IOException

生成URL对象,建立URL连接

public void testl(){try{//1. 获取url实例URL url = new URL("http://127.0.0.1:8080/examples/abcd.jpg");//得到URL对象//2. 建立与服务器端的连接HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();//生成URLConnection对象,建立URL连接//3. 获取输入流\创建输出流InputStream is =urlConnection.getInputStream();File file = new File("dest.jpg");File0utputStream fos =new File0utputStream(file);//4. 读写数据: 读到内存再从内存写出去bytel] buffer = new byte[1024];int len;while((len = is.read(buffer))!=-1){fos.write(buffer, 0,len);}System.out.println("文件读写完成!");}catch(IOException e){e.printStackTrace();}finally{//5. 关闭连接try{if(fos != null)fos.close();}catch(IOException e){e.printStackTrace();}try{if(is != null)is.close();}catch(IOException e){e.printStackTrace();}if(urlConnection != null)urlConnection.disconnext();}}

四、企业真题

1、TCP协议和UDP协议的区别
TCP可靠:三次握手+四次挥手;确认+重传机制;流量控制、拥塞控制
UDP:使用数据报传输(限制64kb以内),不保证数据是否能被接收到

2、简单说说TCP协议的三次握手与四次挥手机制

相关文章:

Java网络编程(JavaWeb的基础)

Java网络编程&#xff08;JavaWeb的基础&#xff09; 文章目录 Java网络编程&#xff08;JavaWeb的基础&#xff09;前言一、网络编程概述1.1 软件架构&网络基础1.2 网络通信要素:IP/端口/通信协议1.3 传输层协议:tcp/udp 二、网络编程API2.1 InetAddress类2.2 Socket类&am…...

鸿蒙Harmony开发实战案例:使用OpenGL绘制3D图形

XComponent控件常用于相机预览流的显示和游戏画面的绘制,在OpenHarmony上&#xff0c;可以配合Native Window创建OpenGL开发环境&#xff0c;并最终将OpenGL绘制的图形显示到XComponent控件。本文将采用"Native C"模板&#xff0c;调用OpenGL ES图形库绘制3D图形&…...

DM达梦数据库存储过程

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

【python】OpenCV—Color Correction

文章目录 cv2.aruco 介绍imutils.perspective.four_point_transform 介绍skimage.exposure.match_histograms 介绍牛刀小试遇到的问题 参考学习来自 OpenCV基础&#xff08;18&#xff09;使用 OpenCV 和 Python 进行自动色彩校正 cv2.aruco 介绍 一、cv2.aruco模块概述 cv2.…...

Java基础知识整理笔记

目录 1.关于Java概念 1.1 谈谈对Java的理解&#xff1f; 1.2 Java的基础数据类型&#xff1f; 1.3 关于面向对象的设计理解 1.3.1 面向对象的特性有哪些&#xff1f; 1.3.2 重写和重载的区别&#xff1f; 1.3.3 面向对象的设计原则是什么&#xff1f; 1.4 关于变量与方…...

知识图谱——Neo4j数据库实战

数据与代码链接见文末 1.Neo4j数据库安装 JDK 安装:https://www.oracle.com/java/technologies/javase-downloads.html Neo4j 安装:https://neo4j.com/download-center/ 配置好 JDK 和 Neo4j 的环境变量...

第十一次Javaweb作业

4.登录校验 4.1会话 --用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪&#xff1a;一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请求…...

人工智能AI风口已开:如何赋予UI设计与视频剪辑新生命

随着科技的浪潮不断向前推进&#xff0c;人工智能&#xff08;AI&#xff09;正以惊人的速度重塑着我们的世界&#xff0c;特别是在创意产业的核心领域——UI设计与视频剪辑中&#xff0c;AI正逐步成为驱动行业创新与变革的关键力量。在这个AI技术全面开花的新时代&#xff0c;…...

计算机专业课面试常见问题-编程语言篇

目录 1. 程序的编译执行流程&#xff1f; 2. C浅拷贝和深拷贝的区别&#xff1f; 3. C虚函数&#xff1f; …...

CSS|05 继承性与优先级

继承性 一、继承性的特点&#xff1a; 1.外层元素身上的样式会被内层元素所继承 2.如果内层元素与外层元素身上的演示相同时&#xff0c;外层元素的样式会被内层元素所覆盖 二、关于继承性的问题 是不是所有样式都能被继承&#xff1f; 答&#xff1a;并不是所有样式能被继承…...

KVM性能优化之内存优化(宿主机)

linux系统自带了一技术叫透明巨型页&#xff08;transparent huge page&#xff09;&#xff0c;它允许所有的空余内存被用作缓存以提高性能&#xff0c;而且这个设置是默认开启的&#xff0c;我们不需要手动去操作。 Centos下&#xff0c;我们用cat /sys/kernel/mm/transpare…...

【Linux杂货铺】Linux学习之路:期末总结篇1

第一章 什么是Linux? Linux 是 UNIX 操作系统的一个克隆&#xff1b;它由林纳斯 本纳第克特 托瓦兹从零开始编写&#xff0c;并在网络上众多松散的黑客团队的帮助下得以发展和完善&#xff1b;它遵从可移植操作系统接口&#xff08;POSIX&#xff09;标准和单一 UNIX 规范…...

GPT-5的到来:智能飞跃与未来畅想

IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂确认了GPT-5的发布计划&#xff0c;预计将在一年半后推出。穆拉蒂形象地将GPT-4到GPT-5的飞跃比作高中生到博士生的成长。这一飞跃将给我们带来哪些变化&#xff1f;GPT-5的…...

gin中间件

在web应用服务中&#xff0c;完整的业务处理在技术上包含客户端操作&#xff0c;服务端处理&#xff0c;返回处理结果给客户端三个步骤。但是在在更负责的业务和需求场景。一个完整的系统可能要包含鉴权认证&#xff0c;权限管理&#xff0c;安全检查&#xff0c;日志记录等多维…...

swagger常用注解

最近查看接口文档的时候发现&#xff0c;POST方法中的query没法在swagger中显示&#xff0c;查了才发现这是因为Swagger或OpenAPI规范默认将HTTP POST请求的参数识别为请求体&#xff08;body&#xff09;参数&#xff0c;而不是查询字符串&#xff08;query&#xff09;参数。…...

【Flink metric(1)】Flink指标系统的系统性知识:获取metric以及注册自己的metric

文章目录 一. Registering metrics&#xff1a;向flink注册新自己的metrics1. 注册metrics2. Metric types:指标类型2.1. Counter2.2. Gauge2.3. Histogram(ing)2.4. Meter 二. Scope:指标作用域1. User Scope2. System Scope ing3. User Variables 三. Reporter ing四. System…...

命令模式(Command Pattern)

命令模式&#xff08;Command Pattern&#xff09; 定义 命令模式是对命令的封装&#xff0c;每一个命令都是一个操作&#xff1a;请求的一方发出请求要求执行一个操作&#xff1b;接收的一方收到请求&#xff0c;并执行操作。 命令模式解耦了请求方和接收方&#xff0c;请求…...

掌握Symfony的模板继承:构建强大且灵活的Web界面

掌握Symfony的模板继承&#xff1a;构建强大且灵活的Web界面 在Symfony框架中&#xff0c;模板继承是一个强大的功能&#xff0c;它允许开发者创建可重用的布局模板&#xff0c;并通过扩展这些模板来构建具体的页面。这种机制不仅提高了代码的可维护性&#xff0c;还使得页面结…...

uboot基本使用网络命令和从服务器端下载linux内核启动

网络命令ip地址设置: setenv gmac_debug 0; setenv mdio_intf rgmii; setenv bootdelay 1; setenv ethaddr 00:xxxx:81:70; // mac地址 setenv ipaddr xxx; //开发板 IP 地址 setenv netmask 255.255.255.0; setenv gatewayip xxx.1; setenv serverip xxxx; //服…...

解决ArcGIS导出的svg格式的图片插入Word后的字体问题

背景 在ArcGIS中设置字体为Times New Roman&#xff0c;但导入Word后字体转为等线。 ArcGIS中的Layout 导入Word​​​​​​ 原因分析 Word无法识别嵌入进SVG格式文件中的字体。 解决方案 在Export Layer窗口中&#xff0c;将Embed fonts取消勾选&#xff0c;Convert cha…...

如何确保 Puppet 配置在复杂网络环境中的可靠分发和同步?

在复杂网络环境中确保 Puppet 配置的可靠分发和同步可以采取以下措施&#xff1a; 网络拓扑规划&#xff1a;在复杂网络环境中&#xff0c;首先需要进行网络拓扑规划&#xff0c;确保网络结构合理&#xff0c;并能够支持可靠的分发和同步机制。 Puppet Master 多节点部署&…...

2024最新!将mysql的数据导入到Solr

Solr导入mysql的数据 如何安装导入数据前准备配置Solr的Jar包以及Mysql驱动包1.1、将solr-8.11.3\dist下的两个包进行移动1.2、将mysql-connect包也移动到该位置1.3、重启Solr项目 配置xml2.1、第一步我们需要创建核心2.2、第二步修改xml(这里是结合19年的教程)2.3、 创建data-…...

Python数据分析第二课:conda的基础命令

Python数据分析第二课&#xff1a;conda的基础命令 1.conda是什么? conda是一个开源的包管理系统&#xff0c;可以帮助我们进行管理多个不同版本的软件包&#xff0c;还可以帮助我们建立虚拟环境&#xff0c;以便对不同的项目进行隔离。 简单来说&#xff0c;conda是一个软…...

LayoutInflater加载流程

简介 LayoutInflater在日常的Android开发中是经常使用的类&#xff0c;常常用于XML中View的加载相关流程。本文主要总结一些其常见api的源码流程。 获取LayoutInflater 我们一般会在Activity的onCreate方法中会通过setContentView方法设置自己的布局layoutId&#xff0c;Act…...

PLC数据采集案例

--------天津三石峰科技案例分享 项目介绍 项目背景 本项目为天津某钢铁集团下数字化改造项目&#xff0c;主要解决天津大型钢厂加氢站数字化改造过程中遇到的数据采集需求。项目难点PLC已经在运行了&#xff0c;需要采集里面数据&#xff0c;不修改程序&#xff0c;不影响P…...

基于单片机和LabVIEW 的远程矿井水位监控系统设计

摘要 &#xff1a; 针 对 现 有 矿 井 水 位 监 控 系 统 存 在 结 构 复 杂 和 不 能 远 程 监 控 的 问 题 &#xff0c; 设计了基于单片机和&#xff2c;&#xff41;&#xff42;&#xff36;&#xff29;&#xff25;&#xff37; 的远程矿井水位监控系统 &#xff0c; 详…...

element 表格嵌套表单验证指定行

elementui表格嵌套动态表单&#xff0c;单独验证某一行输入项是否符合校验规则&#xff1b; input动态绑定校验 :prop"imgTable. scope.$index .bxName" <el-form :model"formTable" ref"formTable" inline size"small"><…...

CORE Mobility Errorr的调试

在运行CORE tutorial 3中的mobility示例时&#xff0c;出现如下错误&#xff1a; 当看到这个问题的时候&#xff0c;并没有仔细去分析日志和现象&#xff0c;在core-daemon的进程打印界面只看了一下最后的出错堆栈&#xff1a; 2024-06-27 10:43:48,614 - ERROR - _server:_ca…...

基于weixin小程序乡村旅游系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;旅游景点管理&#xff0c;景点类型管理&#xff0c;景点路线管理&#xff0c;系统管理 商家帐号账号功能包括&#xff1a;系统首页&#xff0c;旅游景点管理&…...

详解三种常用标准化 Batch Norm Layer Norm RMSNorm

参考&#xff1a; BN究竟起了什么作用&#xff1f;一个闭门造车的分析《动手学深度学习》7.5 节 深度学习中&#xff0c;归一化是常用的稳定训练的手段&#xff0c;CV 中常用 Batch Norm&#xff1b; Transformer 类模型中常用 layer norm&#xff0c;而 RMSNorm 是近期很流行…...

云计算运维工程师面试

1. 云计算运维工程师的角色和职责是什么? 回答: 云计算运维工程师负责确保云计算环境(包括硬件和软件系统)的高可用性和稳定性。他们的主要职责包括: 监测系统和应用程序的性能,确保它们正常运行。故障排除,快速响应并解决系统或应用程序中出现的问题。容量规划,根据…...

聚观早报 | iPhone 16核心硬件曝光;三星Galaxy全球新品发布会

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月28日消息 iPhone 16核心硬件曝光 三星Galaxy全球新品发布会 苹果正多方下注布局AI商店 黄仁勋2024年薪酬3400…...

web前端之文档流、浮动、定位详解

目录 一、文档流 二、浮动 1.添加浮动 2.清除浮动 三、定位 1.相对定位 2.绝对定位 一、文档流 什么是文档流&#xff1f; ● 文档流指的是文档中的标签在排列时所占用的位置。 将窗体自上而下分成一行行 &#xff0c;并在每 行中按从左至右的顺序排放标签&#xff0c…...

[JS]节点操作

DOM节点 DOM树中的所有内容都是节点, 我们重点关注元素节点 作用 使开发者可以根据节点的关系获取元素, 而不是只能依赖选择器, 提高了编码的灵活性 节点分类 元素节点: 所有的标签都是元素节点, html是根节点属性节点: 所有的属性都是属性节点, 比如href文本节点: 所有的文…...

基于SpringBoot+Vue的论坛网站系统(带1w+文档)

基于SpringBootVue的论坛网站系统(带1w文档) 对于之前论坛网站的管理&#xff0c;大部分都是使用传统的人工方式去管理&#xff0c;这样导致了管理效率低下、出错频率高。而且&#xff0c;时间一长的话&#xff0c;积累下来的数据信息不容易保存&#xff0c;对于查询、更新还有…...

03逻辑门电路

分立门电路&#xff1a; 集成门电路&#xff1a; TTL门电路 MOS门电路&#xff1a;NMOS门电路、PMOS门电路、CMOS门电路 BICMOS门电路&#xff1a;CMOS的高输入阻抗和TTL的高放大倍数的结合 向更低功耗、更高速度发展 MOS管的Rdson在可变电阻区的阻值也一般会小于1000欧姆 …...

2毛钱的SOT23-5封装28V、1.5A、1.2MHz DCDC转换器用于LCD偏置电源和白光LED驱动等MT3540升压芯片

前言 之前发了一个TI的BOOST升压芯片&#xff0c;用于LCD偏置电压或LED驱动&#xff0c;请访问以下链接。 6毛钱SOT-23封装28V、400mA 开关升压转换器&#xff0c;LCD偏置电源和白光LED应用芯片TPS61040 国产半导体厂家发展迅猛&#xff0c;今天推荐一个公司带“航天”的升压…...

Zookeeper部署

Zookeeper部署 下载安装包Linux解压安装包修改配置文件编辑zoo.cf配置 启动服务停止服务常用zookeeper指令查看namespace列表创建namespace删除namespace 注意&#xff1a;该文章为简单部署操作&#xff0c;没有复杂的配置内容&#xff0c;用的是3.7.2版本。 下载安装包 进入z…...

2.x86游戏实战-跨进程读取血量

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 接下来会写C/C代码&#xff0c;C/C代码不是很难&#xff0c;然后为了快速掌握逆向这个技能&#xff0c;我…...

element-plus 日期选择添加确定按钮

需求&#xff1a;选择日期后&#xff0c;点击确定按钮关闭面板 思路&#xff1a; 使用shortcuts自定义确定和取消按钮选择日期后使用handleOpen()强制开启面板点击确定后使用handleClose()关闭面板 <template><el-date-pickerref"pickerRef"v-model"…...

Redis优化之持久化

目录 1.Redis高可用 2.Redis持久化 2.1 RDB持久化 2.1.1 触发条件 2.1.2 执行流程 2.1.3 启动时加载 2.2 AOF持久化 2.2.1 开启AOF 2.2.2 执行流程 2.2.3 文件重写触发方式 2.2.4 文件重写的流程 2.2.5 启动时加载 2.3 RDB和AOF的优缺点 3.Redis性能管理 3.1 查看…...

ubuntu22.04 编译安装libcurl C++ library

1. 安装必须的依赖项 sudo apt update #sudo apt install build-essential autoconf libtool pkg-config libssl-dev libz-dev 2. 下载及编译前准备 cd /opt mkdir curl && cd curl mkdir build && mkdir install git clone https://github.com/curl/curl.git…...

js函数闭包解析

闭包是JavaScript中非常重要的概念&#xff0c;理解闭包对于编写高质量的代码是至关重要的。本文将详细解析闭包的概念&#xff0c;并提供一些代码示例来帮助读者更好地理解闭包的使用。 什么是闭包&#xff1f; 闭包是指在一个函数内部定义的函数&#xff0c;该函数可以访问包…...

查看Oracle、MySQL、PostGreSQL中的依赖关系

查看Oracle、MySQL、PostGreSQL中的依赖关系 在有些程序员开发习惯中&#xff0c;喜欢为了应用代码的简洁或复用&#xff0c;而在数据库创建一个复杂关连查询的VIEW&#xff0c;甚至是VIEW套VIEW嵌套使用&#xff0c; 这里就有个问题如果上线后如发现依赖的表字段类型或长度不…...

多线程(基础)

前言&#x1f440;~ 上一章我们介绍了什么是进程&#xff0c;对于进程就了解那么多即可&#xff0c;我们作为java程序员更关注线程&#xff0c;线程内容比较多&#xff0c;所以我们要分好几部分才能讲完 目录 进程的缺点 多线程&#xff08;重要&#xff09; 进程和线程的区…...

BUG cn.bing.com 重定向的次数过多,无法搜索内容

BUG cn.bing.com 重定向的次数过多&#xff0c;无法搜索内容 环境 windows 11 edge浏览器详情 使用Microsoft Edge 必应搜索显示"cn.bing.com"重定向次数过多&#xff0c;无法进行正常的检索功能 解决办法 检查是否开启某些科_学_上_网&#xff08;翻_墙&#xf…...

【数据科学】学习资源汇总(不定时更新)

好书推荐&#xff1a;BooksPDF/数据科学/Python数据科学手册.pdf at master zhixingchou/BooksPDF GitHub...

完美解决ValueError: column index (256) not an int in range(256)的正确解决方法,亲测有效!!!

完美解决ValueError: column index (256) not an int in range(256)的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 完美解决ValueError: column index (256) not an int in range(256)的正确解决方法&#xff0c;亲测有效&#xff01;&…...

# 音频处理4_傅里叶变换

1.离散傅里叶变换 对于离散时域信号 x[n]使用离散傅里叶变换&#xff08;Discrete Fourier Transform, DFT&#xff09;进行频域分析。 DFT 将离散信号 x[n] 变换为其频谱表示 X[k]&#xff0c;定义如下&#xff1a; X [ k ] ∑ n 0 N − 1 x [ n ] e − j 2 π k n N X[k]…...

提升网络速度的几种有效方法

在数字化时代&#xff0c;网络速度对于我们的日常生活和工作至关重要。无论是观看高清视频、在线游戏&#xff0c;还是进行视频会议&#xff0c;快速稳定的网络连接都是不可或缺的。如果你发现自己当前的网络速度不尽如人意&#xff0c;那么不妨尝试以下几种方法来提升它。 升…...