Java两周半速成之路(第十六天)

一、网络编程

1.概述:

                 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换

2.网络模型

 

3.网络参考模型图 

 

4.网络通信三要素

 

4.1IP地址 

InetAddress类的使用:

注意:通过API查看,此类没有构造方法,如果想要创建该类的对象,只能借助于其静态成员方法,因为其静态成员方法的返回值为InetAddress类的对象。

public static InetAddress getByName(String host)         

 确定主机名称的IP地址,传入的是ip地址,将ip地址封装成一个InetAddress对象

public String getHostName()                                            获取此IP地址的主机名

public String getHostAddress()                                        返回文本显示中的IP地址字符串

演示:

import java.net.InetAddress;/*网络编程的三要素:ip地址 端口号 协议*/
public class InetAddressDemo {public static void main(String[] args) throws Exception {// public static InetAddress getByName(String host) 确定主机名称的IP地址。//传入的是ip地址,将ip地址封装成一个InetAddress对象InetAddress inetAddress = InetAddress.getByName("192.168.1.13");System.out.println(inetAddress);     //public String getHostName()获取此IP地址的主机名。System.out.println(inetAddress.getHostName());//public String getHostAddress()返回文本显示中的IP地址字符串。System.out.println(inetAddress.getHostAddress());}
}

 

4.2端口号

 

4.3协议UDP和TCP 

 

4.4Socket 

 

 

4.5Socket机制图解

 5.UDP传输

 (1) UDP传输-发送端思路:

 

UDP传输-发送端代码演示:

package com.shujia.day18.udpdemo;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*1:建立udp的socket服务2:将要发送的数据封装成数据包3:通过udp的socket服务,将数据包发送出4:关闭资源从键盘录入数据进行发送,如果输入的是886那么客户端就结束输入数据。*/
public class SendDemo1 {public static void main(String[] args) throws Exception {//1:建立udp的socket服务//public DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口。DatagramSocket ds = new DatagramSocket();//2:将要发送的数据封装成数据包 DatagramPacket//DatagramPacket(byte[] buf, int length, InetAddress address, int port)//构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。//byte[] buf  要发送的数据的字节数组表现形式byte[] bytes = "我陈平安,唯有一剑,可搬山,倒海......".getBytes();//int length  要发送数据字节数组的长度int length = bytes.length;//InetAddress address  目标发送的ip地址的InetAddress形式对象InetAddress inetAddress = InetAddress.getByName("192.168.1.13");//int port 目标机器上应用程序的端口号int port = 12345;//创建数据包DatagramPacket dp = new DatagramPacket(bytes, length, inetAddress, port);//3:通过udp的socket服务,将数据包发送出//public void send(DatagramPacket p) 从此套接字发送数据报包。//将上面创建好的数据包进行发送ds.send(dp);//4:关闭资源ds.close();}
}

(2)UDP传输-接收端思路

UDP传输-接收端代码演示:

import java.lang.String;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*1:建立udp的socket服务.2:通过receive方法接收数据3:将收到的数据存储到数据包对象中4:通过数据包对象的功能来完成对接收到数据进行解析.5:可以对资源进行关闭*/
public class ReceiveDemo1 {public static void main(String[] args) throws Exception {//public DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。//创建Socket对象并绑定一个端口号DatagramSocket ds = new DatagramSocket(10086);//接收端需要创建一个空的数据包,接收过来的数据//DatagramPacket(byte[] buf, int length)//构造一个 DatagramPacket用于接收长度的数据包 length 。//byte[] buf 将来用于接收数据的字节数组byte[] bytes = new byte[1024];int length = bytes.length;       //int length  所准备的字节数组的长度DatagramPacket dp = new DatagramPacket(bytes, length);//2:通过receive方法接收数据//receive(DatagramPacket p)//程序走到这一步,会发生阻塞等待数据过来ds.receive(dp);//3:将收到的数据存储到数据包对象中//4:通过数据包对象的功能来完成对接收到数据进行解析.byte[] data = dp.getData(); // 用于解析数据包中接收到的数据int dataLength = dp.getLength(); // 获取真正接收到字节数组长度//将接收到的字节数组转字符串String info = new String(data, 0, dataLength);InetAddress inetAddress = dp.getAddress();String ip = inetAddress.getHostAddress();//获取发送段的ip地址String hostName = inetAddress.getHostName();//获取发送端的主机名System.out.println("===================================");System.out.println(hostName + " ip地址为:" + ip + ", 发来数据:" + info);System.out.println("===================================");//5:可以对资源进行关闭ds.close();}
}

注意:先执行接收端代码在执行输出端代码~

效果演示:

(3)练习:

      从键盘录入数据进行发送,如果输入的是886那么发送端就结束输入数据

发送端:


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;/*1:建立udp的socket服务2:将要发送的数据封装成数据包3:通过udp的socket服务,将数据包发送出4:关闭资源从键盘录入数据进行发送,如果输入的是886那么客户端就结束输入数据。*/
public class SendDemo1 {public static void main(String[] args) throws Exception{//1:建立udp的socket服务//public DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口。DatagramSocket ds = new DatagramSocket();//创建键盘录入对象Scanner sc = new Scanner(System.in);while (true){System.out.print("请输入要发送的数据: ");String info = sc.next();//2:将要发送的数据封装成数据包 DatagramPacket//DatagramPacket(byte[] buf, int length, InetAddress address, int port)//构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。//byte[] buf  要发送的数据的字节数组表现形式byte[] bytes = info.getBytes();//int length  要发送数据字节数组的长度int length = bytes.length;//InetAddress address  目标发送的ip地址的InetAddress形式对象InetAddress inetAddress = InetAddress.getByName("192.168.1.43");//int port 目标机器上应用程序的端口号int port = 12345;//创建数据包DatagramPacket datagramPacket = new DatagramPacket(bytes, length, inetAddress, port);//3:通过udp的socket服务,将数据包发送出//public void send(DatagramPacket p) 从此套接字发送数据报包。//将上面创建好的数据包进行发送ds.send(datagramPacket);if("886".equals(info)){break;}}//4:关闭资源ds.close();}
}

 

接收端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;/*1:建立udp的socket服务.2:通过receive方法接收数据3:将收到的数据存储到数据包对象中4:通过数据包对象的功能来完成对接收到数据进行解析.5:可以对资源进行关闭*/
public class ReceiveDemo1 {public static void main(String[] args) throws Exception {//public DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。//创建Socket对象并绑定一个端口号DatagramSocket ds = new DatagramSocket(12345);//接收端需要创建一个空的数据包,接收过来的数据//DatagramPacket(byte[] buf, int length)//构造一个 DatagramPacket用于接收长度的数据包 length 。//byte[] buf 将来用于接收数据的字节数组byte[] bytes = new byte[1024];//int length  所准备的字节数组的长度int length = bytes.length;DatagramPacket dp = new DatagramPacket(bytes, length);while (true){//2:通过receive方法接收数据//receive(DatagramPacket p)//程序走到这一步,会发生阻塞等待数据过来ds.receive(dp); //3:将收到的数据存储到数据包对象中//4:通过数据包对象的功能来完成对接收到数据进行解析.byte[] data = dp.getData(); // 用于解析数据包中接收到的数据int dataLength = dp.getLength(); // 获取真正接收到字节数组长度//将接收到的字节数组转字符串String info = new String(data, 0, dataLength);InetAddress inetAddress = dp.getAddress();String ip = inetAddress.getHostAddress(); //获取发送段的ip地址String hostName = inetAddress.getHostName(); //获取发送端的主机名String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());System.out.println("================="+time+"=================");if("886".equals(info)){System.out.println("******"+hostName + " ip地址为:" + ip + "发送端停止发送了!!!!!!!******");
//                break;}else {System.out.println(hostName + " ip地址为:" + ip + ", 发来数据:" + info);}}//5:可以对资源进行关闭
//        ds.close();}
}

 

6.TCP传输

 (1)TCP传输-客户端思路

TCP传输-客户端思路代码演示:


import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;/*1:建立客户端的Socket服务,并明确要连接的服务器。2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.3:通过Socket对象的方法,可以获取这两个流4:通过流的对象可以对数据进行传输5:如果传输数据完毕,关闭资源*/import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;/*1:建立客户端的Socket服务,并明确要连接的服务器。2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.3:通过Socket对象的方法,可以获取这两个流4:通过流的对象可以对数据进行传输5:如果传输数据完毕,关闭资源*/
public class ClientDemo1 {public static void main(String[] args) throws Exception {//1:建立客户端的Socket服务,并明确要连接的服务器。//构造方法:要传输服务器目标的ip地址和端口号//Socket(InetAddress address, int port) 创建流套接字并将其连接到指定IP地址的指定端口号。//InetAddress address 服务器的ip地址的InetAddress表现形式
//        InetAddress inetAddress = InetAddress.getByName("192.168.1.43");
//        //int port 服务器程序所占用的端口号
//        int port = 10086;
//        Socket socket = new Socket(inetAddress, port);//Socket(String host, int port)//创建流套接字并将其连接到指定主机上的指定端口号。//该Socket对象如果成功创建,就说明已经与服务器建立连接成功!Socket socket = new Socket("192.168.1.13", 10086);System.out.println("与服务器段连接成功!" + socket);//3:通过Socket对象的方法,可以获取这两个流OutputStream outputStream = socket.getOutputStream();//4:通过流的对象可以对数据进行传输outputStream.write("真相只有一个".getBytes());//告诉服务器没有数据socket.shutdownOutput();//获取通道中的输入流对象InputStream inputStream = socket.getInputStream();byte[] bytes = new byte[1024];int length = inputStream.read(bytes);String info = new String(bytes, 0, length);System.out.println("服务器给我的反馈是:" + info);//5:如果传输数据完毕,关闭资源socket.close();}
}

(2) TCP传输-服务器端思路

 TCP传输-服务器端思路代码演示:


import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;/*1:建立服务器端的socket服务(ServerSocket),需要一个端口2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信3:通过客户端的获取流对象的方法,读取数据或者写入数据4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的*/
public class ServerDemo1 {public static void main(String[] args) throws Exception{//1:创建服务器段的Socket对象,//ServerSocket(int port) 创建绑定到指定端口的服务器套接字。ServerSocket ss = new ServerSocket(10086);//2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信//程序运行到这一步的时候,发生阻塞,会监听客户端的连接//返回的Socket对象,实际上可以理解为是与某一个客户端的连接通道//将来可以使用Socket对象中的输入流获取客户端发送的信息,或者使用输出流向客户端发送反馈Socket socket = ss.accept();//获取通道中的输入流对象InputStream is = socket.getInputStream();InetAddress inetAddress = socket.getInetAddress();String hostName = inetAddress.getHostName();String hostAddress = inetAddress.getHostAddress();byte[] bytes = new byte[1024];int length = 0;while ((length = is.read(bytes))!=-1){String info = new String(bytes, 0, length);System.out.println(hostName + " ip地址为:" + hostAddress + ", 发来数据:" + info);}//获取通道中的输出流对象OutputStream outputStream = socket.getOutputStream();outputStream.write("服务器已收到! ".getBytes());socket.close();ss.close();}
}

 

(3)练习:

使用多台客户端与服务端建立联系,从键盘录入数据进行发送,如果输入的是886那么发送端就结束输入数据 (使用多线程)

客户端:

import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;/*1:建立客户端的Socket服务,并明确要连接的服务器。2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.3:通过Socket对象的方法,可以获取这两个流4:通过流的对象可以对数据进行传输5:如果传输数据完毕,关闭资源*/
public class ClientDemo1 {public static void main(String[] args) throws Exception{//1:建立客户端的Socket服务,并明确要连接的服务器。//构造方法:要传输服务器目标的ip地址和端口号//Socket(InetAddress address, int port) 创建流套接字并将其连接到指定IP地址的指定端口号。//InetAddress address 服务器的ip地址的InetAddress表现形式
//        InetAddress inetAddress = InetAddress.getByName("192.168.1.13");
//        //int port 服务器程序所占用的端口号
//        int port = 10086;
//        Socket socket = new Socket(inetAddress, port);//Socket(String host, int port)//创建流套接字并将其连接到指定主机上的指定端口号。//该Socket对象如果成功创建,就说明已经与服务器建立连接成功!Socket socket = new Socket("192.168.1.13", 10086);System.out.println("与服务器段连接成功!" + socket);//创建键盘录入对象Scanner sc = new Scanner(System.in);//3:通过Socket对象的方法,可以获取这两个流OutputStream outputStream = socket.getOutputStream();while (true){System.out.println("请输入要发送的数据: ");String info = sc.next();//4:通过流的对象可以对数据进行传输outputStream.write(info.getBytes());if("886".equals(info)){break;}}//5:如果传输数据完毕,关闭资源socket.close();}
}

 

服务端:


import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;/*1:建立服务器端的socket服务(ServerSocket),需要一个端口2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信3:通过客户端的获取流对象的方法,读取数据或者写入数据4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的*/
public class ServerDemo1 {public static void main(String[] args) throws Exception{//1:创建服务器段的Socket对象,//ServerSocket(int port) 创建绑定到指定端口的服务器套接字。ServerSocket ss = new ServerSocket(10086);//死循环监听客户端的连接,将每个客户端封装成一个线程运行while (true){Socket socket = ss.accept();new OneClient(socket).start();}}
}class OneClient extends Thread{private Socket socket;private String hostName;private String hostAddress;OneClient(Socket socket){this.socket = socket;}@Overridepublic void run() {try {//获取通道中的输入流对象InputStream is = socket.getInputStream();InetAddress inetAddress = socket.getInetAddress();hostName = inetAddress.getHostName();hostAddress = inetAddress.getHostAddress();System.out.println("=====用户: "+hostName+"已上线!====");byte[] bytes = new byte[1024];int length = 0;while ((length = is.read(bytes))!=-1){String info = new String(bytes, 0, length);if("886".equals(info)){System.out.println("=====用户: "+hostName+"已离线!====");}else {String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());System.out.println(time);System.out.println(hostName + " ip地址为:" + hostAddress + ", 发来数据:" + info);}}}catch (Exception e){System.out.println("--------------------------------------------");System.out.println(hostName + " ip地址为:" + hostAddress + "异常下线............");System.out.println("--------------------------------------------");}}
}

 

 二.类加载器

1.类的加载

 

2.类初始化时机 

 

3.类加载器概述

 

4.类加载器的作用 

 

 三.反射的基本使用

1.概述:

 

2.通过反射获取构造方法并使用

演示:


import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;class Student {public int id;private int age;String name;public Student() {}Student(int age) {this.age = age;}private Student(String name) {this.name = name;}public void fun1() {System.out.println("这是公共的成员方法");}private void fun1(String name) {System.out.println("这是私有的成员方法" + name);}@Overridepublic String toString() {return "Student{" +"id=" + id +", age=" + age +", name='" + name + '\'' +'}';}
}public class StudentDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//如何获取一个类对用的Class对象//1、在有对象的前提下,使用getClass()方法获取Student student = new Student();Class<? extends Student> studentClass1 = student.getClass();//2、没有对象,只有类,通过类的属性进行获取Class<Student> studentClass2 = Student.class;//3、最常用的方式,Class类中有一个静态方法//public static Class<?> forName(String className) 返回与给定字符串名称的类或接口相关联的类对象。Class<?> studentClass = Class.forName("com.shujia.day18.FanShe.Student");System.out.println("===============================================================================");/*
一个类中有三种成员:1、成员变量 Field2、构造方法 Constructor3、成员方法 Method
*///TODO:通过反射获取构造方法并使用//Class类中有一个getConstructor方法//public Constructor<T> getConstructor(Class<?>... parameterTypes)//返回一个Constructor对象,该对象反映Constructor对象表示的类的指定的公共类函数。Constructor<?> c1 = studentClass.getConstructor();        //表示获取Student类中的无参构造方法System.out.println(c1);//获取Student类中的有参构造方法//获取不是public修饰的构造方法//getDeclaredConstructor()     可以获取所有权限构造方法Constructor<?> c2 = studentClass.getDeclaredConstructor(int.class);System.out.println(c2);/*如何使用将获取到的构造方法来创建对象呢?Constructor中有一个newInstance方法:newInstance(Object... initargs)使用由此Constructor对象表示的构造函数,使用指定的初始化参数创建和初始化构造函数的声明类的新实例。*/Object o1 = c1.newInstance();System.out.println(o1);        //Student{id=0, age=0, name='null'}Constructor<?> c3 = studentClass.getDeclaredConstructor(String.class);//c3的构造方法是被private修饰的所以无法直接访问,所以要使用暴力访问,绕过检测机制c3.setAccessible(true);       //暴力访问,绕过检测机制Object  o3 = c3.newInstance("小明");System.out.println(o3);}
}

 

 3.通过反射获取成员变量并使用

演示:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Arrays;public class StudentDemo1 {public static void main(String[] args) throws Exception {Class<?> studentClass = Class.forName("com.shujia.day18.FanShe.Student");//TODO:通过反射获取成员变量并使用//Class类中的getField方法          根据属性的名字获取对应的被public修饰的成员变量的对象Field id = studentClass.getField("id");System.out.println(id);//getDeclaredField 获取所有权限的成员变量Field name = studentClass.getDeclaredField("name");System.out.println(name);//getFields获取类中所有的被public修饰的成员变量Field[] fields = studentClass.getFields();System.out.println(Arrays.toString(fields));//        //使用获取到的成员变量Constructor<?> c1 = studentClass.getDeclaredConstructor();      //表示获取Student类中的无参构造方法Object o = c1.newInstance();System.out.println(o);           //Student{id=0, age=0, name='null'}//需求:给对象o中的成员变量name进行赋值
//        public void set(Object obj, Object value)//将指定对象参数上的此Field对象表示的字段设置为指定的新值。name.set(o, "小明");System.out.println(o);       //Student{id=0, age=0, name='小明'}//如果要访问被private修饰的成员变量,依旧是暴力访问id.setAccessible(true);id.set(o,1001);System.out.println(o);       //Student{id=18, age=0, name='小明'}Field age = studentClass.getDeclaredField("age");age.setAccessible(true);age.set(o,18);System.out.println(o);}
}

 

4.通过反射获取成员方法并使用 

演示:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class StudentDemo2 {public static void main(String[] args) throws Exception {//TODO:通过反射获取成员方法并使用//public Method getMethod(String name, Class<?>... parameterTypes)//获取类中被public所修饰的成员方法//根据方法的名字和参数类型获取Class<?> studentClass = Class.forName("com.shujia.day18.FanShe.Student");Method fun1 = studentClass.getMethod("fun1");System.out.println(fun1);//getDeclaredMethod获取任意一个成员方法,包括私有的Method fun11 = studentClass.getDeclaredMethod("fun1", String.class);System.out.println(fun11);System.out.println("==================================================");//getMethods可以获取类中及其直接父类中的所有被public修饰的成员方法Method[] methods = studentClass.getMethods();for (Method method : methods) {System.out.println(method);}System.out.println("==================================================");//getDeclaredMethods可以获取本类中的所有的成员方法,包括私有的Method[] declaredMethods = studentClass.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {System.out.println(declaredMethod);}System.out.println("========================================");//如何调用获取到的成员方法Constructor<?> c1 = studentClass.getConstructor();        //表示获取Student类中的无参构造方法Object o = c1.newInstance();//public Object invoke(Object obj, Object... args)//在具有指定参数的方法对象上调用此方法对象表示的基础方法fun1.invoke(o);//如果是调用私有的方法,则需要暴力访问fun11.setAccessible(true);fun11.invoke(o, "张三");}
}

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

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

相关文章

Docker 哲学 - 容器操作

容器&#xff1a; 创建 停止 删除 强制删除&#xff08;正在运行&#xff09; run stop rm rm -f 列出本地容器&#xff1a; docker ps / docker container ls 镜像&#xff1a; search pull run &#xff1a; …

第十四届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A \mathrm{A} A : 特殊日期试题 B: 与或异或试题 C : \mathrm{C}: C: 平均试题 D: 棋盘试题 E : \mathrm{E}: E: 互质数的个数试题 F: 阶乘的和试题 G: 小蓝的旅行计划试题 H: 太阳试题 I: 高塔试题 J \mathrm{J} J : 反异或 01 串 发现…

代码随想录 Day45 动态规划(背包问题)

对背包问题有了更深刻的理解&#xff0c;物品的遍历是背包可能要装的物品的遍历&#xff0c;跟多少数量有关系&#xff0c;而背包的遍历则跟物品的重量&#xff0c;背包的容量&#xff0c;以及价值有关。

C语言数据结构易错知识点(3)(堆)

1.堆的本质&#xff1a;完全二叉树 堆在物理结构上是顺序结构&#xff0c;实现方式类似于顺序表&#xff08;数组&#xff09;&#xff1b;但在逻辑结构上是树形结构&#xff0c;准确来说堆是一棵完全二叉树。因为堆的实现在代码上和顺序表有很高的相似度&#xff0c;所以在写…

关于用max,min函数超时的情况—算法小Tips

今天在做这道题的时候&#xff0c;有了一点对一些题max函数min函数就会超时的思考&#xff0c;不是每道题都这样&#xff0c;但也可以是个做题小tips&#xff1b; 题目连接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目很简单&#xff0c;用个前缀和暴力一下就行&…

【Preprocessing数据预处理】之Scaler

在机器学习中&#xff0c;特征缩放是训练模型前数据预处理阶段的一个关键步骤。不同的缩放器被用来规范化或标准化特征。这里简要概述了您提到的几种缩放器&#xff1a; StandardScaler StandardScaler 通过去除均值并缩放至单位方差来标准化特征。这种缩放器假设特征分布是正…

C语言从入门到熟悉------第四阶段

指针 地址和指针的概念 要明白什么是指针&#xff0c;必须先要弄清楚数据在内存中是如何存储的&#xff0c;又是如何被读取的。如果在程序中定义了一个变量&#xff0c;在对程序进行编译时&#xff0c;系统就会为这个变量分配内存单元。编译系统根据程序中定义的变量类型分配…

深度学习 精选笔记(11)深度学习计算相关:GPU、参数、读写、块

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

C++ 入门篇

目录 1、了解C 2、C关键字 2、命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C输入与输出 4.缺省参数 4.1 缺省参数的概念 4.2 缺省参数的分类 5. 函数重载 5.1 函数重载的概念 5.2 C中支持函数重载的原理--名字修饰 6. 引用 6.1 引用概念 6.2 引用…

HTML案例-2.标签综合练习

目录 效果 知识点 1.图像标签 2.链接标签 3.锚点定位 4.base标签 源码 页面1 页面2 效果 知识点 1.图像标签 <img src="图像URL" /> 单标签 属性 属性值 描述 src URL 图像的路径 alt 文本

Linux使用Docker部署Registry结合内网穿透实现公网远程拉取推送镜像

文章目录 1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址 Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)…

0G联合创始人MICHAEL HEINRICH确认出席Hack.Summit() 2024区块链开发者大会

随着区块链技术的不断发展和应用&#xff0c;全球开发者瞩目的Hack.Summit() 2024区块链开发者大会即将于2024年4月9日至10日在香港数码港盛大举行。此次大会由Hack VC主办&#xff0c;并得到AltLayer和Berachain的协办&#xff0c;同时汇聚了Solana、The Graph、Blockchain Ac…

路由和流量控制

项目拓扑与项目需求 项目需求:某政务网络拥有两个园区&#xff0c;园区A和园区B之间通过物理专线相连。IP地址如图所示。现在需要实现以下需求&#xff1a; 要求A园区无法访问B园区的vlan 30 网络&#xff0c;要求使用路由过滤的方式实现。 配置步骤 设备IP地址的规划 设备名…

从0开始回顾MySQL---事务四大特性

事务概述 事务是一个最小的工作单元。在数据库当中&#xff0c;事务表示一件完整的事儿。一个业务的完成可能需要多条DML语句共同配合才能完成&#xff0c;例如转账业务&#xff0c;需要执行两条DML语句&#xff0c;先更新张三账户的余额&#xff0c;再更新李四账户的余额&…

螺旋阵思维与代码

1.思维 56789419202110318252211217242312116151413观察上面的螺旋阵,你就会发现数字从小到大,按照贝壳的螺旋形依次排列. 走到头就要换一个方向. 看到螺旋数组可以让人想象到贪吃蛇,拿出一个字符串设置为方向,碰到头方向改变,这样循环模拟,直到格子里的数>行和列数(n) .…

c++ 常用函数 集锦 整理中

c 常用函数集锦 目录 c 常用函数集锦 1、string和wstring之间转换 2、经纬度转 xyz 值 互转 3 、获取 根目录下的文件地址 1、string和wstring之间转换 std::string convertWStringToString(std::wstring wstr) {std::string str;if (!wstr.empty()){std::wstring_convert<…

51-31 VastGaussian,3D高斯大型场景重建

2024 年 2 月&#xff0c;清华大学、华为和中科院联合发布的 VastGaussian 模型&#xff0c;实现了基于 3D Gaussian Splatting 进行大型场景高保真重建和实时渲染。 Abstract 现有基于NeRF大型场景重建方法&#xff0c;往往在视觉质量和渲染速度方面存在局限性。虽然最近 3D…

pycharm @NotNull parameter ‘module‘ of ...

下载了最新pycharm &#xff0c;无法启动运行 pycharm或者idea中Run/Debug Python项目报错 Argument for NotNull parameter ‘module‘ of … 解决方案 删除项目根目录的 idea 文件夹 随后重启&#xff0c;重新配置即可

图论(蓝桥杯 C++ 题目 代码 注解)

目录 迪杰斯特拉模板&#xff08;用来求一个点出发到其它点的最短距离&#xff09;&#xff1a; 克鲁斯卡尔模板&#xff08;用来求最小生成树&#xff09;&#xff1a; 题目一&#xff08;蓝桥王国&#xff09;&#xff1a; 题目二&#xff08;随机数据下的最短路径&#…

C++实验 面向对象编程

一、实验目的&#xff1a; 掌握类中静态成员的定义方法&#xff0c;初始化方法&#xff0c;使用方法&#xff1b; 掌握类的友元说明方法&#xff0c;理解友元的使用特点 二、实验内容&#xff1a; 1、编写程序&#xff0c;统计某旅馆住宿客人的总数&#xff0c;要求输入客人…