目录
Socket
Socket套接字:
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别标识符套接字。
Socket原理机制:
通信的两端都有Socket。
网络通信其实就算Socket间的通信。
数据在两个Socket间通过IO传输。
=================================================================
UDP协议
将数据源和目的封装成数据包中,不需要建立连接;每个数据包的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快。
UDP协议发送数据
1、建立发送端的Socket对象
2、创建数据,并将数据打包,设置端口号
3、通过调用Socket的发送方法将数据包发出去
4、释放资源,关闭Socket
UDP接收端接收数据:
1、创建接收端的Socket对象
2、创建一个接收包(接收数据容器)
3、调用Socket的接收方法接收数据 receive()
4、解析数据包,获取数据,显示在控制台
5、释放资源,关闭Socket
多次运行接收端程序:
java.net.BindException: Address already in use: Cannot bind
端口被占用异常
==================================================================
TCP协议
建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低。
TCP协议传输发送数据端
1、创建客户端的Socket对象
指定服务器的IP和端口,内部自动建立连接,一旦建立连接成功,说明与服务IO通道形成。
2、获取输出流,往IO通道写数据
3、释放资源
还未启动服务器就启动客户端报错:
java.net.ConnectException: Connection refused: connect
连接被拒绝
TCP协议一定要先启动服务器
TCP协议接收数据服务器端
1、创建服务器端的Socket对象 ServerSocket
2、监听客户端连接,返回一个对应的客户端的Socket对象
3、获取输入流对象,读取数据,显示在控制台上
4、释放资源
============================================================
类的加载器和反射
类的加载
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
加载:就是将class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象。
连接: 验证 是否有正确的内部结构,并和其他类协调一致
准备 负责为类的静态成员分配内存,并设置默认初始化值
解析 将类的二进制数据中的符号引用替换为直接引用
初始化 :就是我们以前讲过的初始化步骤。
反射:就是通过class文件对象去使用该文件中的成员变量,构造方法,成员方法
当没有现成的java文件,只拿到一个class文件怎么办呢?
就算你是用java文件去创建对象,底层依旧是需要一个class文件,也就是说想要创建对象,就必须要得到一个class文件,也就是获取该class的文件对象。
class类:
成员变量:Fields
构造方法:Constructor
成员方法:Method
1、怎么获取到class文件对象呢?
1)通过Object中的getClass()方法获取,返回该Object的运行时类
2)通过类名获取静态属性class
3)Class类中获取静态方法
public static 类 forName(String className) 返回与给定字符串名称的类或接口相关联的类对象。
方式一:通过Object中的getClass()方法获取,返回该Object的运行时类
方式二:通过类名获取静态属性class Person.class
方式三:Class类中静态方法(开发中最常用方式)
public static 类 forName(String className) 返回与给定字符串名称的类或者接口相关联的类对象。
注意:这里需要写该类在本项目中的完整路径。
通过反射获取class文件对象来创建该类的对象
获取class文件中的构造方法
public Constructor[] getConstructors() 返回一个包含Constructor对象的数组。
反映由此Constructor对象表示的类的所有公共类函数。(不包括获取私有的,默认的修饰构造方法)
public Constructor[] getDeclaredConstructors() 返回反映Constructor对象表示的类声明的所有Constructor对象的数组类 。
获取所有的构造方法,包括私有,该方法,打破了原先私有构造方法不能创建对象的隔阂
获取单个的构造方法
public Constructor getConstructor(Class... parameterTypes)
返回一个Constructor对象,该对象反映Constructor对象表示的类的指定的公共类函数。
public Constructor getDeclaredConstructor(类... parameterTypes)
返回一个Constructor对象,该对象反映Constructor对象表示的类或接口的指定类函数
获取构造方法的目的是创建对象
public T newInstance(Object... initargs)
对象表示的构造函数,使用指定的初始化参数创建和初始化构造函数的声明类的新实例。
在通过使用获取到私有的构造方法创建对象的时候,报错了,非法访问异常
java.lang.IllegalAccessException
暴力访问
declaredConstructor.setAccessible(true);
Object o1 = declaredConstructor.newInstance("小花");
经过测试发现,只有访问私有的才会出现该异常