【详细】Java网络通信 TCP、UDP、InetAddress

一、网络程序设计基础

1.局域网与因特网

为了实现两台计算机的通信,必须用一个网络线路连接两台计算机(服务器<-->网络<-->客户机)。

服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序。网络用于连接服务器与客户机,实现两者间的相互通信。但有时在某个网络中很难将服务器与客户机区分开。我们通常所说的局域区(Local Area Network,LAN)就是一群通过一定形式连接起来的计算机。它可以由两台计算机组成,也可以由同一区域内的上午台计算机组成。将LAN延伸到更大的范围,这样的网络称为广域网(Wide Area Network,WAN)。我们熟悉的因特网(Internet)就是由无数的LAN和WAN组成的。

2.网络协议

网络协议规定了计算机之间连接的物理、机械(网线与网卡的连接规定)、气(有效的电平范围)等特征,计算机之间的相互寻址规则,数据发送冲突解决方式,长数据如何分段传送与接收等内容。就像不同的国家有不同法律一样,目前网络协议也有多种。
常用网络协议:

(1) IP协议:

IP是Intemet Protocol的简称,是一种网络协议。Internet网络采用的协议是TCP/IP协议,其全称是Tinsmission ctiol Protocol Internet Protocol.Interet 依靠TCP/IP协议,在全球范围内实现了不同硬件结构、不同操作系统、不同网络系统间的互联。在Interet网络上存在着数以亿计的主机,每台主机都用网络为其分配的Internet地址代表自己,这个地址就是IP地址。到目前为止,IP地址用4个字节(byte),也就是32位的二进制数来表示,称为 IPv4。为了便于使用,通常取每个字节的+进制数,(不包含符号位,所以 最小为0,最大佳为255(是))并且每个字节之间用圆隔开表示IP地址,如192.168.1.1。现在人们正在试验使用16个字节来表示IP地址,这就是IPv6,但IPV6还没有投入使用。
TCP/IP 模式是一种层次结构,共分为4层,分别为应用层传输层互联网层网络层。各层实现特定的功能,提供特定的服务和访问接口,并具有相对独立性。

(2)TCP与UDP协议:

在TCP/IP协议栈中,有两个高级协议是网络应用程序编写者应该了解的,即传输控制协议-TCP(Transmission ControlProtocol)与用户数据报协议-UDP(User Datagram
Protocol)。

TCP协议是一种以固按连线为基础的协议,它提供两台计算机间可靠的数据传送。TCP可以保证从一端数据送至连接的另一端时,数据能够确实送达,而且抵达的数据的排列顺序和送出时的顺序相同。因此,TCP协议适合可靠性要求比较高的场合。就像拨打电话,必须先拨号给对方,等两端确定连接后,相互才能听到对方说话,也知道对我回应的是什么。

HTTP(超文本传输协议)、FTP(文本传输协议)和Telnet(Telnet协议)等都需要使用可靠的通信频道。例如,HTTP从某个URL(标准资源地址)读取数据时,如果收到的数据顺序与发送时不相同,可能就会出现一个混乱的HTML文件或是一些无效的信息。

UDP协议无连接通信协议,不保证数据的可靠传输,但能够向若干个目标发送数据,或抗收来自若干个源的数据。UDP以独立发送数据包的方式进行。这种方式就像邮递员送信给收信人,可以寄出多个信给同一个人,且每一封信都是相对独立的,各封信送达的顺序并不重要,收信人接收信件的顺序也不能保证与寄出售件的顺序相同

UDP协议适合于一些对数据准确性要求不高,但对传输速度和时效性要求非常高的网站,如网络聊天室、在线影片等。这是由于TCP协议在认证上存在额外耗费,可能使传输速度减慢,而VDP协议即使有一小部分数据包遗失或传送顺序有所不同,也不会严重危害该项通信。

一些防火墙和路由器会设置成不允许UDP数据包传输,因此若遇到UDP连接方面的问题,应先确定所在网络是否允许UDP协议。

3.端口和套接字

一般而言,一台计算机只有单一的连到网络的物理连接(Physica Connection)所有的数据都通过此连接对内、对外送达特定的计算机,这就是端口。 网络程序设计中的端口(port)并非真实的物理存在,而是一个假想的连场装置。端口被规定为一个0~65535之间的整数(2^(16)-1)。HTTP服务一般使用80端口FTP服务使用21端口。假如一台计算机提供了HTTP、FTP等多种服务,那么客户机会通过不同的端口来确定连接到服务器的哪项服务上。如图1。

通常,0~1023(2^(10)-1)之间的端口数用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用 1024以上的端口数,以避免端口号与另一个应用或系统服务所用端口冲突。

网络程序中的套接字(Socket)用于将应用程序与端口连接起来。套接字是一个假想的连接装置,就像插座一样可连接电器与电线,如图2。

Java将套接字抽象化为类,程序设计者只需创建Socket类对象,即可使用套接字。

二、TCP程序设计基础 

TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序两者的功能和编写方法大不一样

服务器端与客户端的交互过程如图。

 ①服务器程序创建一个ServerSocket(服务器套接字),调用accept()方法等待客户机来连核。  客户端程序创建一个 Socket,请求与服务器建立连接。   服务器接收客户的连接请求,同时创建一个新的Socket与客户机建立连接。随后服务器继续等待新的请求。

1.InetAddress类

java.net包中的InetAddress类是与IP地址相关的类,利用该类可以获取IP地址 、主机地址等信息。

常用方法:

静态 getByName(Sting host) :获取与Host相对应的InetAddress对象;返回值为InetAddress。(例:主机名 DESKTOP-2TJS791 => InetAddress ia= DESKTOP-2TJS791/127.0.0.1; 地址 12.34.56.78 => InetAddress ia=/12.34.56.78 ;8998 => InetAddress ia=/0.0.35.38)

静态 getLocal Host() :返回本地主机的 InetAddress对象;返回值为InetAddress

非静态 get HostAddress() :获取InetAddress对象所包含的IP地址;返回值为String

非静态 getHostName() :获取此 IP地址的主机名;返回值为String

例:

public class Test {

	public static void main(String[] args) {
		
		try {
			
			InetAddress ip = InetAddress.getLocalHost();
			// ip=DESKTOP-2TJS791/192.168.5.13
			
			String hostName=ip.getHostName();
			//hostName=DESKTOP-2TJS791
			
			String hostAddress=ip.getHostAddress();
			//hostAddress=192.168.5.13
			
			InetAddress inetAddress=InetAddress.getByName(hostName);
			//inetAddress=DESKTOP-2TJS791/192.168.5.13
			
			
			System.out.println("InetAddress对象(本地主机):"+ip);
			System.out.println("主机名:"+hostName);
			System.out.println("主机地址:"+hostAddress);
			System.out.println("InetAddress对象(依靠主机名生成):"+inetAddress);
			/*
			 * 输出结果为:
			 * 
			 * InetAddress对象(本地主机):DESKTOP-2TJS791/192.168.5.13
			 * 主机名:DESKTOP-2TJS791
			 * 主机地址:192.168.5.13
			 * InetAddress对象(依靠主机名生成):DESKTOP-2TJS791/192.168.5.13
			*/
			
			
		} catch (UnknownHostException e) {
			//InetAddress类的方法会抛出UnknownHostException异常,所以必须进行异常处理。这个异常在主机不存在或网络连接错误时发生。
			e.printStackTrace();
		}
		
	}

}

2.ServerSocket类

java.net包中的 Senersocket类用于表示 服务器套接字,其主要功能是等待来自网络上的“请求”,它可通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连按。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入列队中,然后从中取出一个套接字,与服务器新建的套接字连接起来。若请求数大于最大容纳数,则多出的连接请求被拒绝。队列的默认大小是50

(1)ServerSocket构造方法(通常会抛出IOException异常):

Serversocket()  创建非绑定服务器套接字
Server socket (int port)   创建绑定到特定端口的服务器套接字,(等待连接的队列长度为默认的50)
Server Socket(int port ,int backlog)  利用指定的backlog(等待连接的队列最大长度,不写默认50)创建服务器套接字,并将其绑到指定的本地端口上
ServerSocket (int port,int backlog, InetAddress bindAddress)
使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。
这种情况适用于计算机上有多块网卡和多个IP地址的情况,用户可以明确规定ServerSocket在哪块网卡或哪个IP地址上等待客户机的连接请求。

(2)ServerSocket类常用方法:

accept()  等待客户机的连书。若进接,则创建一个套接字。返回值为 Socket 。
isBound()  判断 ServerSocket的绑定状态。返回值为 Boolean 。
getInetAddress()  返回此服务器套接字的本地地址。返回值为 InetAddress 。
isClosed()  返回服务器套按字的关闭状态。返回值为 Boolean 。
closel()  关闭服务器套按字。返回值为 void 。
bind (SocketAddress endpoint)  将ServerSocket 绑定到特定地址上(IP地址和端口号)。返回值为 void 。

getLocalPort() 返回此套接字在其上侦听的端口。返回值为 int 。

调用Serverfocket类的accept()方法,会返回一个和客户端 Socket对象相连接的Socket对象。服务器端的Socket对象使用 getOutputStream()方法获得的输出流,将指向客户端Socket 对象使用 getInputStream()方法获得的输入流;同样,服务器端的Socket 对象 使用 getInputscream()方法获得输入流,将指向客户端的Socket对象使用 getOutputstream()方法获得的那个输出流。也就是说,当服务器向输出流写入信息时,客户端通过相应的输入流就能读取,反之亦然。 

accept()方法会阻塞线程的继续执行,直到接收到客户的呼叫。语句如果没有客户请求accept()方法没有发生阻塞,肯定是程序出现了问题。通常是使用了一个被其它程序占用的端口号,ServerSocket绑定没有成功。

3.TCP网络程序

明白了TCP程序工作的过程,就可以编写TCP服务器程序了。在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户机发送消息,称为单向通信。客户机套接字和服务器套接字连接成功后,客户机通过输出流发送数据,服务器则通过输入流接收数据。

(1)例.服务器:

public class Test {
	public static void main(String[] args) {
		//启动服务器
		new MyTCPServer().startServer();	
	}
}


//服务器
class MyTCPServer{
	private BufferedReader reader;
	private ServerSocket server;
	private Socket socket;
	
	void startServer() {
		try {
			
            //创建服务器套接字
			server=new ServerSocket(8998);
			System.out.println("服务器套接字已经创建成功");

			while(true) {
				System.out.println("等待客户机的连接");
                
                //等待客户机连接,在有客户机连接前会一直阻塞
				socket=server.accept();
                
                //连接成功后根据套接字获取输入流
				reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
				
				getClientMessage();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	private void getClientMessage() {
		try {
			
			while(true) {
				//获取输入流内容
				String str=reader.readLine();
				
				if(str!=null) {
					System.out.println("客户机:"+str);
				}
				else if(str==null) {
                    //输入流中断-输入结束
					break;
				}
				
			}
				
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		try {
			
			if(reader!=null) {
				reader.close();
				reader=null;
			}
			if(socket!=null) {
				socket.close();
				socket=null;
			}
				
		}catch(Exception e) {
			e.printStackTrace();
		}

	}
}

(2)例.客户机:

public class Test {
	public static void main(String args[]) {
        //启动客户机
		new MyTCPClient().startClient();
	}
}

//客户机
class MyTCPClient{
	private PrintWriter writer; //输入流的一种,使用println()输出
	
	void startClient() {
		System.out.println("尝试连接");
		
		try {
			
            //创建用于连接目标服务器的套接字
			Socket socket=new Socket("127.0.0.1",8998);

            //根据套接字生成输入流(会产生阻塞;未连接到服务器会一直阻塞)
			writer=new PrintWriter(socket.getOutputStream(),true);
			
			System.out.println("连接成功");
			
			putMessage();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	private void putMessage() {
        //获取来自控制台的输入流
		BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
		while(true) {
			try {
                //读取输入流内容
				String str = reader.readLine();

				if(str!=null) {
                    //像输出流中输出
					writer.println(str);
				}
				else {
                    //输入流断开-输入结束
					break;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
}

三、UDP程序设计基础

用户数据报协议(UDP)是网络信息传输的另一种形式。基于UDP的通信和基于TCP的通信不同,基于UDP的信息传递更快,但不提供可靠的保证。使用UDP传递数据时,用户无法知道数据能否正确地到达主机,也不能确定到达目的地的顺序是否和发送的顺序相同。虽然VDP是一种不可靠的协议,但如果需要较快地传输信息,并能容忍小的含案,可以考虑使用UDP。

基于UDP通信的基本模式如下:
将数据打包(称为数据包),然后将数据包发往目的地。
按收别人发来的数据包,然后查看数据包

发送数据包步骤如下:
(1) 使用 DatagramSocket()创建一个数据包套接字。
(2) 使用 DatagramPacket(byte[] buf, int length,EnecAuldress ddres, int port)创建要发送的数据包。
(3) 使用 DatagramPacket类的 send()方法发送数据包。

接收数据包步骤如下:
(1)使用 Datagram Socket(int port)创建数据包套按字,绑定到指定的端口。
(2)使用 Dacagramlacket(byter] buf,int length)创建字节数组来接收数据包。
(3)使用 DatagramPacket类的 receive()方法 接收UDP包。

1.DatagramPacket类

java.net包的 DatagramPacket类用来表示数据包。DatagramPacket类的构造函数有:
DatagramPacket(byte[] buf , int length)
DatagramPacket(byte[] buf, int length,InetAddress address,int port)

第一种构造函数在创建DatagromPadket对象时,指定了数据包的关第二种构造函数不仅指定了数据包的内存空间和大小,还指定了数据包的目标地址和端口。在发送数据时必须指定接收方的 Socket的InetAddress地址和端口号,因此使用第二种构造函数可创建发送数据的DatagramPacket对象。

2.DatagramSocket类

java.net包中的DatagramSocket类用于表示发送和接收数据包的套接字。该类构造函数有:DatagramSocket()
DatagramSocket( int port)
DatagramSocket (int port,InetAddress addr)

第一种构造函数创建DatagramSocket对象,构造数据报套接字,并将其绑定在本地主机任何可用的端口上。第二种构造函数创建DatagramSocket对象,创建数据报套接字,并将其绑定在本地主机的指定端口上。第三种构造函数创建DatagramSocket对象,创建数据报套接字,并将其绑定到指定的本地地址上。第三种构造函数适用于有多块网卡和多个IP地址的情况。
在接收程序时必须指定一个端口等,不允许系统随机产生,此时可以使用第二种构造函数。比如有个朋友要你给他写信,那他的地址就必须确定。在发送程序时通常使用第一种构造函数,不指定端口号,而是系统为我们分配一个端口号,就像寄信不需要到指定的邮局一样。

3.UDP网络程序

根据前面所讲的网络编程的基本知识,以及UDP网络编程的特点,下面创建一个广播数据报程序。广播数据报是一项较新的技术,其原理类似于电台广播。广播电台需要在指定的波段和频率上广播信息,收听者也要将收音机调到指定的波和频半上广播信息,收听者也要将收视调到指定的波段、率,才可以收叫广播内容。

例.主机不断地重复播出节目预报,到加入到同一组内的主机随时可接收到广播信息。接收者将正在接收的信息放在一个文本城中,并将接收的信息放在另一个文本城中,

(1)广播主机程序不断向外播出信息:

public class Test {
	public static void main(String[] args) {
		//启动UDP发送端
		new MyUDP_Send().startUDPSend();
	}
}

class MyUDP_Send{
	private String sendMessage="发送的信息";
	private int port=9898;  //发送端口号(发送方可无固定端口号)
	private InetAddress group=null;  //广播组InetAddress(广播地址应默认为224.255.10.0)
	private MulticastSocket multicastSocket=null; //广播套接字,用于UDP广播(群发)的发送与接收
	//如果不使用MulticstSocket,而使用DatagramSocket,除不能加入广播组以外无不同
	
	void startUDPSend() {
		try {
			
			//广播组地址、广播地址
			group=InetAddress.getByName("224.255.10.0");
			
			//或使用 new MulticastSocket(); 即不使用指定端口号,由系统随机分配。
			//或使用 new DatagramSocket();  即不进行广播及加入广播组
			multicastSocket=new MulticastSocket(port);
			
			//设置广播组套接字发出的数据报包的存活时间(毫秒)
			multicastSocket.setTimeToLive(1);
			
			//加入广播组
			//将MulticastSocket加入同一个IntentAddress组成的group;任何MulticastSocket向这个group发送消息,其他group成员都可以收到消息
			multicastSocket.joinGroup(group);
			
			sendDatagramPacket();
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void sendDatagramPacket() {
		Thread thread=new Thread() {
			public void run() {
				
				while(true) {
					
					DatagramPacket packet=null;
					
					//创建数据的字节数组
					byte data[]=sendMessage.getBytes();
					
					//创建数据报包-参数为:用于发送的字节数组;数组长度;目标地址(或广播地址);目标端口号
					//DatagramPacket当目标地址为广播组InetAddress时,广播组中所有的MulticastSocket(目标端口)都会收到信息包
					packet=new DatagramPacket(data,data.length,inetAddress,port);
					
					try {
						//发送数据报包
						multicastSocket.send(packet);
					} catch (IOException e) {
						e.printStackTrace();
					}
					
					try {
						//每2秒重发一次
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
			}
		};
		thread.start();
	}
}

MulticastSocket(广播套接字),用于UDP广播(群发);如果不使用MulticstSocket,而使用DatagramSocket,除不能加入广播组以外无不同。

将MulticastSocket加入同一个IntentAddress组成的group;任何MulticastSocket向这个group发送消息,其他group成员都可以收到消息。

创建数据报包的参数为:用于发送的字节数组;数组长度;目标地址(或广播地址);目标端口号。 

DatagramPacket当目标地址为广播组InetAddress时,广播组中所有的MulticastSocket(目标端口)都会收到信息包。

(2)接收主机发出的数据包:

public class Test {
	public static void main(String[] args) {
		//启动UDP接收端
		new MyUDP_Receive().startUDPReceive();
	}
}

class MyUDP_Receive{
	private MulticastSocket multicastSocket;  //广播套接字,用于UDP广播(群发)的发送与接收
	//如果不使用MulticstSocket,而使用DatagramSocket,除不能加入广播组以外无不同
	private InetAddress group; //广播组InetAddress(广播地址应默认为224.255.10.0)
	private int port=9898;//接收端口号(接收方必须有固定端口号)
	
	void startUDPReceive() {
		try {
			
			//广播组地址、广播地址
			group=InetAddress.getByName("224.255.10.0");
			
			//创建接收用广播套接字-接收方必须有端口号
			multicastSocket=new MulticastSocket(port);
			
			//加入广播组
			multicastSocket.joinGroup(group);
			
			receiveDatagramPacket();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void receiveDatagramPacket() {
		
		while(true) {
			
			//存储用字节数组
			byte buff[]=new byte[1024];
			
			//创建接受用数据包-参数为:用于接收的字节数组,字节数组长度
			DatagramPacket packet=new DatagramPacket(buff,buff.length);
			
			//广播套接字接收数据包
			try {
				multicastSocket.receive(packet);
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			//解析获取到的数据
			byte data[]=packet.getData();
			
			System.out.println("接收:"+new String(data));
			
		}
		
	}
}

接收用广播套接字-接收方必须有端口号。

创建接受用数据包的参数为:用于接收的字节数组,字节数组长度。

packet.getData();获取数据包的信息,返回值为字节数组。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ResNet34的花朵分类

一.数据集准备 新建一个项目文件夹ResNet&#xff0c;并在里面建立data_set文件夹用来保存数据集&#xff0c;在data_set文件夹下创建新文件夹"flower_data"&#xff0c;点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/example_i…

北京筑龙发声炼化企业大会,助力央国企采购供应链数字化转型

10月25日&#xff0c;以“科技创新引领高质量发展&#xff0c;夯实炼化自立自强根基”为主题的第四届炼化企业创新发展大会暨新技术与解决方案交流会”在浙江省宁波市盛大召开。北京筑龙智能化业务部高级咨询顾问王良受邀出席&#xff0c;带来主题为“智能物料——企业采购供应…

【Python】基于非侵入式负荷检测与分解的电力数据挖掘

文章目录 前言一、案例背景二、分析目标三、分析过程四、数据准备4.1 数据探索4.2 缺失值处理 五、属性构造5.1 设备数据5.2 周波数据 六、模型训练七、性能度量文末送书&#xff1a;《Python数据挖掘&#xff1a;入门、进阶与实用案例分析》 前言 本案例将根据已收集到的电力…

windows模拟触摸

安装EcoTUIODriver驱动 . 安装完后电脑属性显示笔和触控为为20点触摸点提供笔和触控支持。 在另一台电脑上运行tuio模块器是一个jar文件,TuioSimulator默认是给本机的3333端口发送TUIO消息&#xff0c;可通过-host指定远端主机&#xff0c;-port指定端口号 执行命令: java …

jvm垃圾回收算法有哪些及原理

目录 垃圾回收器1 Serial收集器2 Parallel收集器3 ParNew收集器4 CMS收集器5 G1回收器三色标记算法标记算法的过程三色标记算法缺陷多标漏标 垃圾回收器 垃圾回收机制&#xff0c;我们已经知道什么样的对象会成为垃圾。对象回收经历了什么——垃圾回收算法。那么谁来负责回收垃…

NPDP产品经理证书是什么行业的证书?

NPDP是一个跨行业的证书&#xff0c;它适用于各种不同类型和规模的组织。无论是制造业、服务业还是科技领域&#xff0c;都可以从NPDP认证中获益。 1. 制造业&#xff1a; 制造业涉及大量的产品开发和创新活动。从汽车制造到电子设备制造&#xff0c;从家居用品到航天航空&…

当数据库遇上深度学习:AI DataLoader 助力因子管理模型训练全流程

深度学习模型有能力自动发现变量之间的关系&#xff0c;而这些关系通常是不可见的&#xff0c;这使得深度学习可以挖掘新的因子和规律&#xff0c;为量化投资策略提供更多可能性。在传统的量化策略开发流程中&#xff0c;通常会使用 Python 或第三方工具生成因子&#xff0c;并…

JVM | 命令行诊断与调优 jhsdb jmap jstat jps

目录 jmap 查看堆使用情况 查看类列表&#xff0c;包含实例数、占用内存大小 生成jvm的堆转储快照dump文件 jstat 查看gc的信息&#xff0c;查看gc的次数&#xff0c;及时间 查看VM内存中三代&#xff08;young/old/perm&#xff09;对象的使用和占用大小 查看元数据空…

为“数字盲道”修“护栏”,隐语YACL护航无障碍数字服务隐私安全

“隐语”是开源的可信隐私计算框架&#xff0c;内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择&#xff0c;提供丰富的联邦学习算法和差分隐私机制 开源项目&#xff1a;github.com/secretflowgitee.com/secretflow 10月19日&#xff0c;杭州第4届亚洲残疾人运动会火炬…

安装好cuda后解决torch.cuda.device_count() == 0

更新显卡驱动可以安装高版本的cuda 可以通过打开cmd输入nvidia-smi来查看 所以说不高于12.3的版本都可以安装 cuda版本匹配pytorch版本 打开网址&#xff1a;https://pytorch.org/ 验证完后&#xff0c;就可以吭哧吭哧的去下载安装了 搞完后还是发型代码跑出来GPU 0 不要…

Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构、部署实例

Zookeeper、Kafka集群与FilebeatKafkaELK架构、部署实例 一、Zookeeper1.1、Zookeeper 定义1.2、Zookeeper 工作机制1.3、Zookeeper 特点1.4、Zookeeper 数据结构1.5、Zookeeper 应用场景1.5、Zookeeper 选举机制1.5.1、 第一次启动选举机制1.5.2、 非第一次启动选举机制 二、Z…

SpringMVC系列-5 消息转换器

背景 SpringMVC系列的第五篇介绍消息转换器&#xff0c;本文讨论的消息转换指代调用Controller接口后&#xff0c;对结果进行转换处理的过程。 内容包括介绍自定义消息转换器、SpringMVC常见的消息转换器、Spring消息转换器工作原理等三部分。 本文以 SpringMVC系列-2 HTTP请求…

基于机器学习与大数据的糖尿病预测 计算机竞赛

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE&#xff08;递归特征消除法&#xff09;4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

Mac风扇控制电脑降温软件Macs Fan Control Pro 简体中文

Macs Fan Control Pro是一款功能强大的Mac风扇控制软件&#xff0c;旨在帮助用户更好地管理和控制Mac电脑的风扇速度和温度传感器。以下是该软件的主要特色介绍&#xff1a; 监测和调整Mac电脑的风扇速度和温度传感器&#xff0c;帮助用户控制设备温度&#xff0c;提高电脑性能…

PyTorch基础(18)-- torch.stack()方法

一、方法详解 首先&#xff0c;看一下stack的直观解释&#xff0c;动词可以简单理解为&#xff1a;把……放成一堆、把……放成一摞。 有了对stack方法的直观感受&#xff0c;接下来&#xff0c;我们正式解析torch.stack方法。 PyTorch torch.stack() method joins (concaten…

每日汇评:黄金形态确认牛市,再次尝试上行2000美元

金价挑战1988美元的关键阻力位&#xff0c;向2000美元进发&#xff1b; 在避险情绪中&#xff0c;美元随着美债收益率扩大复苏&#xff1b; 黄金价格在日线图上确认了一个多头标志&#xff0c;RSI指数仍然指向更多的上涨&#xff1b; 随着中东紧张局势再次引起人们的关注&#…

《动手学深度学习 Pytorch版》 10.1 注意力提示

10.1.1 生物学中的注意力提示 “美国心理学之父” 威廉詹姆斯提出的双组件&#xff08;two-component&#xff09;框架&#xff1a; 非自主性提示&#xff1a;基于环境中物体的突出性和易见性 自主性提示&#xff1a;受到了认知和意识的控制 10.1.2 查询、键和值 注意力机制…

个人记账理财软件 Money Pro mac中文版软件介绍

Money Pro for mac是一款综合性高的理财工具&#xff0c;Money Pro是一套能够协同工作的工具&#xff0c;可用来追踪账户、管理账单以及制作预算&#xff0c;您可以为每个时间段设置不同的预算限值。财务一切尽在掌控之中。 Money Pro for mac软件介绍 Money Pro for mac提供一…

【QT】对象树

一、QT对象树的概念 先来看一下 QObject 的构造函数&#xff1a; 通过帮助文档我们可以看到&#xff0c;QObject 的构造函数中会传入一个 Parent 父对象指针&#xff0c;children() 函数返回 QObjectList。即每一个 QObject 对象有且仅有一个父对象&#xff0c;但可以有很多个…

【JavaSE语法】数据类型与变量

一、字面常量 常量即程序运行期间&#xff0c;固定不变,不可修改的量称为常量 public class Demo {public static void main(String[] args) {System.out.println("hello World!");System.out.println(100);System.out.println(3.14);System.out.println(A);System…