重生之我要精通JAVA--第八周笔记
文章目录
- 多线程
- 线程的状态
- 线程池
- 自定义线程池
- 最大并行数
- 多线程小练习
 
- 网络编程
- BS架构优缺点
- CS架构优缺点
- 三要素
- IP
- 特殊IP
- 常用的CMD命令
 
 
- InetAddress类
- 端口号
- 协议
- UDP协议(重点)
- UDP三种通信方式
 
- TCP协议(重点)
- 三次握手
- 四次挥手
 
 
 
- 反射
- 获取class的三种方式
- 利用反射获取构造方法
- 反射的作用
 
- 动态代理
- 注解
- 自定义注解
- 元注解
- 什么是注解的解析?
- 如何解析注解?
 
多线程
线程的状态

新建状态(NEW)—创建线程对象
就绪状态(RUNNABLE)—start方法
阻塞状态(BLOCKED)—无法获得锁对象
等待状态(WAITING)—wait方法
计时等待(TIMED WAITING)—sleep方法
结束状态(TERMINATED)—全部代码运行完毕
线程池
- 创建一个池子,池子中是空的
- 提交任务时,池子会创建新的线程对象,任务执行完毕,线程归还给池子
 下回再次提交任务时,不需要创建新的线程,直接复用已有的线程即可
- 但是如果提交任务时,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待
Executors:线程池的工具类通过调用方法返回不同类型的线程池对象
| 方法名称 | 说明 | 
|---|---|
| public static ExecutorService newCachedThreadPool() | 创建一个没有上限的线程池 | 
| public static ExecutorService newFixedThreadPool(int nThreads) | 创建有上限的线程池 | 
无上限
public class demo1 {public static void main(String[] args) throws InterruptedException {ExecutorService pool1 = Executors.newCachedThreadPool();pool1.submit(new MyRunable());Thread.sleep(1000);pool1.submit(new MyRunable());Thread.sleep(1000);pool1.submit(new MyRunable());Thread.sleep(1000);pool1.submit(new MyRunable());Thread.sleep(1000);pool1.submit(new MyRunable());pool1.shutdown();}
}
public class MyRunable implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "hhh");有上限
public class demo1 {public static void main(String[] args) throws InterruptedException {ExecutorService pool1 = Executors.newFixedThreadPool(3);pool1.submit(new MyRunable());pool1.submit(new MyRunable());pool1.submit(new MyRunable());pool1.submit(new MyRunable());pool1.submit(new MyRunable());pool1.shutdown();}
}
自定义线程池

| 任务拒绝策略 | 说明 | 
|---|---|
| ThreadPoolExecutor.AbortPolicy | 默认策略:丢弃任务并抛出RejectedExecutionException异常 | 
| ThreadPoolExecutor.DiscardPolicy | 丢弃任务,但是不抛出异常 这是不推荐的做法 | 
| ThreadPoolExecutor.DiscardOldestPolicy | 抛弃队列中等待最久的任务 然后把当前任务加入队列中 | 
| ThreadPoolExecutor.CallerRunsPolicy | 调用任务的run()方法绕过线程池直接执行 | 
| 参数 | 说明 | 要求 | 
|---|---|---|
| corePoolSize | 核心线程数量 | 不能小于0 | 
| maximumPoolSize | 最大线程数量 | 不能小于0,最大数量 >= 核心线程数量 | 
| keepAliveTime | 空闲线程最大存活时间 | 不能小于0 | 
| unit | 时间单位 | 用 TimeUnit指定 | 
| workQueue | 任务队列 | 不能为 null | 
| threadFactory | 创建线程工厂 | 不能为 null | 
| handler | 任务的拒绝策略 | 不能为 null | 
public class demo1 {public static void main(String[] args) {ThreadPoolExecutor pool = new ThreadPoolExecutor(3,6,60,TimeUnit.SECONDS,new ArrayBlockingQueue<>(),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());}
}
最大并行数
public class demo1 {public static void main(String[] args) {System.out.println(Runtime.getRuntime().availableProcessors());}
}

多线程小练习
一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒
 (要求:请用多线程模拟卖票过程并打印剩余电影票的数量)
package practices.a01;public class MyThread extends Thread{static int ticket = 1000;@Overridepublic void run() {while (true){synchronized (MyThread.class) {if (ticket == 0)break;else{ticket--;System.out.println(getName() + "卖出了一张票,还剩" + ticket + "张");}}}}
}
public class demo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("窗口1");t2.setName("窗口2");t1.start();t2.start();}
}
网络编程
在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
- 应用场景:即时通信、网游对战、金融证券、国际贸易、邮件、等等。
 不管是什么场景,都是计算机跟计算机之间通过网络进行数据传输,
- Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序。

BS架构优缺点
- 不需要开发客户端,只需要页面+服务端
- 用户不需要下载,打开浏览器就能使用
- 如果应用过大,用户体验受到影响
CS架构优缺点
- 画面可以做的非常精美,用户体验好
- 需要开发客户端,也需要开发服务端
- 用户需要下载和更新的时候太麻烦
三要素
IP:设备在网络中的地址,是唯一的标识。
端口号:应用程序在设备中唯一的标识。
协议:数据在网络中传输的规则,常见的协议有UDP、TCP、http、https、ftp。
IP
全称:Internet Protocol,是互联网协议地址,也称IP地址。
 是分配给上网设备的数字标签
通俗理解:上网设备在网络中的地址,是唯一的
常见的IP分类为 :IPv4、IPv6

特殊IP
127.0.0.1,也可以是localhost:是回送地址也称本地回环地址,也称本机IP,永远只会寻找当前所在本机。
常用的CMD命令
ipconfig:查看本机IP地址
 ping:检查网络是否连通
InetAddress类
public class MyInetAddressDemo1 {public static void main(String[] args) throws UnknownHostException {//1.获取InetAdderss对象// 获取本地主机的 InetAddress 对象InetAddress address1 = InetAddress.getLocalHost();System.out.println("本地主机信息:" + address1);System.out.println("本地主机名:" + address1.getHostName());System.out.println("本地 IP 地址:" + address1.getHostAddress());// 根据主机名获取 InetAddress 对象InetAddress address2 = InetAddress.getByName("xuanlaptop");System.out.println("指定主机信息:" + address2);System.out.println("主机名:" + address2.getHostName());System.out.println("IP 地址:" + address2.getHostAddress());}
}
端口号
应用程序在设备中唯一的标识。
端口号:由两个字节表示的整数,取值范围:0~65535
 其中0~1023之间的端口号用于一些知名的网络服务或者应用
 我们自己使用1024以上的端口号就可以了
注意:一个端口号只能被一个应用程序使用。
协议
计算机网络中,连接和通信的规则被称为网络通信协议
- OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推广
- TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。


UDP协议(重点)
- 用户数据报协议(User Datagram Protocol)
- UDP是面向无连接通信协议。
 速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据
发送数据
package udpPractices.a01;import java.io.IOException;
import java.net.*;public class demo1 {public static void main(String[] args) throws IOException {//创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket();//打包数据String str = "嘿嘿嘿哈!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//发送数据ds.send(dp);//释放资源ds.close();}
}
接收数据
package udpPractices.a01;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class demo2 {public static void main(String[] args) throws IOException {//创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket(10086);//接收数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ds.receive(dp);//解析数据包byte[] data = dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据:" + new String(data, 0, len) + '\n' + "该数据是从" + address + "这台电脑" + port + "这个端口发出的");//释放资源ds.close();}
}聊天室
-  发送消息 package udpPractices.a01;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;public class demo1 {public static void main(String[] args) throws IOException {//创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket();Scanner sc = new Scanner(System.in);//打包数据while (true) {System.out.print("请输入您要说的话:");String str = sc.nextLine();if ("886".equals(str)) {break;}byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//发送数据ds.send(dp);}//释放资源ds.close();} }
-  接收数据 package udpPractices.a01;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException;public class demo2 {public static void main(String[] args) throws IOException {//创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket(10086);//接收数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);while (true) {ds.receive(dp);//解析数据包byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data, 0, len));}//释放资源}
UDP三种通信方式
-  单播:以前的代码就是单播 
-  组播: 组播地址:224.0.0.0~239.255.255.255其中224.0.0.0~224.0.0.255 为预留的组播地址 
-  广播: 广播地址:255.255.255.255
TCP协议(重点)
- 传输控制协议TCP(Transmission Control Protocol)
- TCP协议是面向连接的通信协议,
 速度慢,没有大小限制,数据安全,

发送
package udpPractices.a02;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {//创建Socket对象Socket socket = new Socket("127.0.0.1", 10000);//从连接通道中获取输出流OutputStream os = socket.getOutputStream();//写出数据os.write("aaa".getBytes());//释放资源os.close();socket.close();}
}
接收
package udpPractices.a02;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {//创建对象ServerSockerServerSocket ss = new ServerSocket(10000);//监听客户端的连接Socket sorket = ss.accept();//从连接通道中获取输入流读取数据InputStream is = sorket.getInputStream();int b;while((b = is.read()) != -1) {System.out.println((char) b);}//释放资源sorket.close();ss.close();}
}
三次握手
确保连接建立

四次挥手
确保连接断开,且数据处理完毕

反射
反射允许对封装类的字段,方法和构造函数的信息进行编程访问

获取class的三种方式
- Class.forName("全类名");
- 类名.class;
- 对象.getclass();
public class demo1 {public static void main(String[] args) throws ClassNotFoundException {//1.全类名:包名 + 类名Class clazz1 = Class.forName("myreflect.a01.Student");//2.Class clazz2 = Student.class;//3.Student s = new Student();Class clazz3 = s.getClass();}
}
利用反射获取构造方法
Class类中用于获取构造方法的方法:
| 方法 | 功能 | 
|---|---|
| Constructor<?>[] getConstructors() | 返回所有公共构造方法对象的数组 | 
| Constructor<?>[]getDeclaredConstructors() | 返回所有构造方法对象的数组 | 
| Constructor<T>getConstructor(Class<?>...parameterTypes) | 返回单个公共构造方法对象 | 
| Constructor<T>getDeclaredConstructor(Class<?>... parameterTypes) | 返回单个构造方法对象 | 
package myreflect.a02;import java.lang.reflect.Constructor;public class demo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//1.过去class字节码文件对象Class clazz = Class.forName("myreflect.a02.Student");//2.获取构造方法(公有)Constructor[] cons1 = clazz.getConstructors();for (Constructor con : cons1) {System.out.println(con);}System.out.println("---------------------------");//(所有)Constructor[] cons2 = clazz.getDeclaredConstructors();for (Constructor con : cons2) {System.out.println(con);}System.out.println("---------------------------");//单个.空参Constructor con3 = clazz.getDeclaredConstructor();System.out.println(con3);System.out.println("---------------------------");//单个.实参Constructor con4 = clazz.getDeclaredConstructor(String.class);System.out.println(con4);int modifiers = con4.getModifiers();System.out.println(modifiers);Parameter[] parameters = con4.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);}}
}
Constructor类中用于创建对象的方法:
| 方法 | 功能 | 
|---|---|
| T newlnstance(Object...initargs) | 根据指定的构造方法创建对象 | 
| setAccessible(boolean flag) | 设置为true,表示取消访问检查 | 
package myreflect.a02;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class demo2 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class clazz = Class.forName("myreflect.a02.Student");Constructor con = clazz.getDeclaredConstructor(String.class, int.class);//表示临时取消权限校验con.setAccessible(true);Student stu = (Student) con.newInstance("张三", 23);System.out.println(stu);}
}
Class类中用于获取成员变量的方法
| 方法 | 说明 | 
|---|---|
| Field[] getFields() | 返回所有公共成员变量对象的数组 | 
| Field[] getDeclaredFields() | 返回所有成员变量对象的数组 | 
| Field getField(String name) | 返回单个公共成员变量对象 | 
| Field getDeclaredField(String name) | 返回单个成员变量对象 | 
Field类中用于创建对象的方法
| 方法 | 说明 | 
|---|---|
| void set(Object obj, Object value) | 赋值 | 
| Object get(Object obj) | 获取值 | 
public class demo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {//1.获取class字节码文件的对象Class clazz = Class.forName("myreflect.a03.Student");//2.获取所有的成员变量Field[] fields = clazz.getDeclaredFields();for(Field field : fields) {System.out.println(field);}//3.获取单个成员变量Field name = clazz.getDeclaredField("name");System.out.println(name);//获取权限修饰符int modifiers = name.getModifiers();System.out.println(modifiers);//获取成员变量的名字String n = name.getName();System.out.println(n);//获取成员变量的数据类型Class<?> type = name.getType();System.out.println(type);//获取成员变量记录的值Student s = new Student("zhangsan", 23, "男");name.setAccessible(true);String value = (String) name.get(s);System.out.println(value);//修改对象里面记录的值name.set(s, "lisi");System.out.println(s);}
}
Class类中用于获取成员方法的方法
| 方法 | 说明 | 
|---|---|
| Method[] getMethods() | 返回所有公共成员方法对象的数组,包括继承的 | 
| Method[] getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 | 
| Method getMethod(String name, Class<?>... parameterTypes) | 返回单个公共成员方法对象 | 
| Method getDeclaredMethod(String name, Class<?>... parameterTypes) | 返回单个成员方法对象 | 
Method类中用于创建对象的方法
| 方法 | 说明 | 
|---|---|
| Object invoke(Object obj, Object... args) | 运行方法 参数一: 用obj对象调用该方法 参数二: 调用方法的传递的参数(如果没有就不写) 返回值: 方法的返回值(如果没有就不写) | 
public class demo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//1.获取class字节码文件对象Class clazz = Class.forName("myreflect.a04.Student");//获取所有方法对象Method[] methods = clazz.getMethods();for (Method method : methods) {System.out.println(method);}//获取指定单一方法Method m = clazz.getDeclaredMethod("eat", String.class, int.class);System.out.println(m);//获取方法的修饰符int modifiers =m.getModifiers();System.out.println(modifiers);//获取方法的名字String name = m.getName();System.out.println(name);//获取方法的形参Parameter[] parameters = m.getParameters();for(Parameter parameter : parameters) {System.out.println(parameter);}//获取方法的抛出的异常Class[] exceptionTypes = m.getExceptionTypes();for(Class exceptionType : exceptionTypes){System.out.println(exceptionType);}//方法运行Student s = new Student();m.setAccessible(true);String result = (String) m.invoke(s, "111", 11);System.out.println(result);}
}
反射的作用
- 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
- 结合配置文件,动态的创建对象并调用方法
动态代理
特点:无侵入式的给代码增加额外的功能
- 为什么需要代理?
 代理可以无侵入式的给对象增强其他的功能
 调用者->代理->对象
- 代理长什么样?
 代理里面就是对象要被代理的方法
- Java通过什么来保证代理的样子?
 通过接口保证,后面的对象和代理需要实现同一个接口
 接口中就是被代理的所有方法
注解
- 就是java代码里的特殊标记,比如:@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。
- 注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。
自定义注解
- 自己定义注解
public @interface 注解名称 {public 属性类型 属性名() default 默认值;
}
- 注解本质是一个接口,Java中所有注解都是继承了Annotation接口的。
- @注解(…):其实就是一个实现类对象,实现了该注解以及Annotation接口。
元注解
- 指的是:修饰注解的注解。


什么是注解的解析?
- 就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来
如何解析注解?
- 指导思想:要解析谁上面的注解,就应该先拿到谁。
- 比如要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析其上面的注解。
- 比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解。
- Class、 Method、Field,Constructor、都实现了AnnotatedElement接口,它们都拥有解析注解的能力。
| 构造方法 | 说明 | 
|---|---|
| public Annotation[] getDeclaredAnnotations() | 获取当前对象上面的注解 | 
| public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass) | 获取指定的注解对象 | 
| public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) | 判断当前对象上是否存在某个注解 | 
已经到底啦!!
相关文章:
 
重生之我要精通JAVA--第八周笔记
文章目录 多线程线程的状态线程池自定义线程池最大并行数多线程小练习 网络编程BS架构优缺点CS架构优缺点三要素IP特殊IP常用的CMD命令 InetAddress类端口号协议UDP协议(重点)UDP三种通信方式 TCP协议(重点)三次握手四次挥手 反射…...
 
51单片机独立按键控制LED灯,按键按一次亮,再按一次灭
1、功能描述 独立按键控制LED灯,按键按一次亮,再按一次灭 2、实验原理 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动米实现接通和断开;…...
 
【上海大学计算机组成原理实验报告】七、程序转移机制
一、实验目的 学习实现程序转移的硬件机制。 掌握堆栈寄存器的使用。 二、实验原理 根据实验指导书的相关内容,实验箱系统的程序转移硬件机制在于,当LDPC有效时,如果此时DUBS上的值就是转移的目标地址,则此目标地址被打入PC&am…...
 
LLVM Cpu0 新后端7 第一部分 DAG调试 dot文件 Machine Pass
想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章: LLVM 后端实践笔记 代码在这里(还没来得及准备,先用网盘暂存一下): 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…...
修复www服务trace漏洞
验证方式:curl -v -X TRACE ip:port,或使用其他接口调试工具如Postman 响应:状态行405 Method Not Allowed且响应体无内容 方案一:使用过滤器 若webserver是tomcat, 添加过滤器的方式有很多 Component public class TraceHttpMe…...
 
算法:101. 对称二叉树
对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false提示: 树中节…...
wordpress 使用api发布文章
1.安装插件 在/wp-content/plugins/目录执行以下命令 $ sudo git clone https://github.com/WP-API/Basic-Auth.git 2.Python脚本 import requestsurl http://www.ziyuanwang.online/wp-json/wp/v2/postsuser adminpassword xxxxxheaders {Content-Type: application/j…...
 
《Brave New Words 》2.2 阅读理解的未来,让文字生动起来!
Part II: Giving Voice to the Social Sciences 第二部分:为社会科学发声 The Future of Reading Comprehension, Where Literature Comes Alive! 阅读理解的未来,让文字生动起来! Saanvi, a ninth grader in India who attends Khan World S…...
 
基于Java的超市进销存管理系统
开头语: 你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言: Java 数据库: MySQL 技术: Java JSP Servlet JavaBean 工具: IDEA/Eclipse、…...
Oracle 日志挖掘
oracle 11g 日志挖掘测试 需要开启补充日志 alter database add supplemental log data; SELECT SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;在用户下执行一些删除,插入等操作 SQL> create table zxy( …...
翻转二叉树-力扣
翻转二叉树,通过前序遍历的顺序,从根节点开始,将节点的左右子节点一次进行交换即可。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), …...
 
办公风云颜值背后的职场正能量
办公风云:颜值背后的职场正能量当我们提到职场,脑海中浮现的往往是严肃的面孔、忙碌的身影和堆积如山的文件。但在这个看似单调的舞台上,总有一些人,用他们的颜值和才华,为我们上演了一场场别开生面的“大戏”。今天&a…...
ffmpeg将一个视频中的音频合并到另一个视频
ffmpeg -i input1.mp4 -i input2.mp4 -map 1:v -map 0:a -c:v copy -c:a aac -strict experimental output.mp4解释如下: -i input1.mp4:指定第一个输入文件input1.mp4,这是你要提取音频的文件。-i input2.mp4:指定第二个输入文件…...
Web前端管理系统项目:深度解析与实现之道
Web前端管理系统项目:深度解析与实现之道 在当今数字化时代,Web前端管理系统项目已成为企业信息化建设的核心组成部分。这类项目不仅涉及技术的深度和广度,更考验开发者的综合素质和创新能力。本文将从四个方面、五个方面、六个方面和七个方…...
 
C语言最终讲:预处理详解
C语言最终讲:预处理详解 1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏和函数的对比6.1宏的优势6.1.1\符号 6.2宏的劣势 7.#和##7.1#运算符7.2##运算符 8.命名约定9.#undef10.命令行定义11.条件编译12.头文件的包含12.1本地…...
 
Mysql的底层实现逻辑
Mysql5.x和Mysql8性能的差异 整体性能有所提高, 在非高并发场景下,他们2这使用区别不大,性能没有明显的区别。 只有高并发时,mysql8才体现他的优势。 2. Mysql数据存储结构Innodb逻辑结构 数据选用B树结构存储数据࿰…...
 
Node安装配置
一、下载 Node官网下载地址:https://nodejs.org/en/ 二、安装 双击上面的msi扩展安装包开始安装,基本一路Next就行了 推荐安装目录自定义,最好不要放在C盘 检查安装是否成功 Win R 快捷键,输入 cmd 打开命令窗口输…...
 
Django里的ModelForm组件
ModelForm组件 自动生成HTML标签 自动读取关联数据表单验证 保留之前提交的数据 错误提示数据库进行:新建,修改 步骤如下: 创建类 # 在 views.py 文件里# 创建一个类 class AssetModelForm(forms.ModelForm):class Meta:model models.…...
 
深入理解C语言:main函数的奥秘
在C语言中,main函数是每个程序的入口点,起着至关重要的作用。本文将深入探讨main函数的工作原理,包括其参数、返回值、以及如何从main启动程序的执行。通过实际代码示例,读者将更深入地理解main函数在C语言编程中的核心地位。 第一…...
 
selenium自动化测试入门 —— Alert/Confirm/Prompt 弹出窗口处理!
一、Alert/Confirm/Prompt弹出窗口特征说明 Alert弹出窗口: 提示用户信息只有确认按钮,无法通过页面元素定位,不关闭窗口无法在页面上做其他操作。 Confirm 弹出窗口: 有确认和取消按钮,该弹出窗口无法用页面元素定…...
 
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
 
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
 
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
 
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
 
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
 
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
