网络编程、反射

网络编程 C/S

直接或间接地通过网络协议与其它计算机进行通讯,实现数据交换,资源共享

  • ip地址 cmd ipconfig

  • port端口号 0--65535,0--1023被服务器占用

  • Socket套接字

  • start()方法,真正实现了多线程运行,run()方法只是一个普通方法,称为线程体,start方法会自动调用run方法,run必须是public,返回值void。

127.0.0.1是回送地址,指本地机

TCP提供面向连接的、可靠的、基于字节流的传输层通信协议。三次握手四次挥手,一般用于文件传输、发送和接收邮件、远程登录等场景。

UDP是一个无连接的协议,在传送数据之前不需要先建立连接,交付不可靠,一般用于即时通信,比如QQ。

TCP三次握手,四次挥手:

  1. 传输前,采用"三次握手"方式,是可靠的
  • 第1次 客户端---->服务器端---->客户端
    第2次 客户端接收到服务器端返回的消息
    第3次 客户端---->服务器端
  1. 传输完毕,需释放已建立的连接,“四次挥手”,效率低
  • 第1次 客户端---->服务器端说我要关闭连接了
    第2次 服务器端说可以,但是你等我一会,我把剩余的任务做完
    第3次 服务器端做完收尾工作之后---->客户端说,我这边结束了,你可以关了
    第4次 客户端说OK,我关了

Socket套接字

通信两端都要有Scoket,服务器端ServerSocket
网络通讯其实就是Socket之间的通信,
Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输

基于Socket编程实现cs(Client-Server)

//服务器端

1.创建服务器端套接字,ServerSocket,端口号
2.accept 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
3.getInputStream //输入流
4.FileOutputStream //获取客户端发过来的数据
5.buff缓冲器
6.while:read读,getOutupStream //响应消息给客户端
7.close关闭

//客户端
1.创建客户端套接字Socket,IP地址+端口号
2.getOutputStream //输出流
3.FileInputStream //读取本地文件
3.buff缓冲器
4.while:write写
shutdownOutput //数据发送完毕
getInputStream //接收服务器端响应的数据
5.close关闭

UDP

DatagramPacket对象封装了UDP数据报

通过数据报套接字DatagramSocket发送和接收UDP数据报

URL编程

URL url = new URL;

URL的基本结构由5部分组成

<传输协议>://<主机名>:<端口号>/<文件名>

反射reflection

Java的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制。

反射就是把java类中的各种成分映射成一个个的Java对象

  • 反射中,可把方法视为对象

  • 用方法对象 来调用 方法

  • 运行时期,动态创建对象

反射有什么用

1,在运行时判断任意一个对象所属的类;

2,在运行时构造任意一个类的对象;

3,在运行时判断任意一个类所具有的成员变量和方法;

4,在运行时调用任意一个对象的方法;

5,生成动态代理。

通过配置文件,在不改变源码的情况下,来控制程序,符合ocp开闭原则

反射中常见的API:

Class类

是描述类的类,可以获取一个类的描述,类中属性,方法,构造器的信息等

  • 没有构造方法,只能由系统创建

  • 一个class对象对应的是一个加载到jvm中的一个.class文件

获取class类对象的方法****:

  1. Class.forName()静态方法,多用于配置文件
Class<?> aClass = Class.forName("com.qf.javase.day22.Exe1.User");
  1. 类的.class方法,多用于参数传递
Class<User> aClass2 = User.class;
  1. 使用实例对象的getClass方法
User user = new User();
        Class<? extends User> aClass3 = user.getClass();
  1. ClassLoader类加载器
Class<? extends ClassLoader> aClass4 = User.class.getClassLoader().getClass();

method描述方法的类

getMethods获取所有public修饰的方法(包含父类)

getDeclaredMethods获取当前类所有的权限修饰符修饰的方法(不包括父类)

field描述属性的类(成员变量)

getFields返回所有的public修饰的属性,包含父类

getDeclaredFields返回当前类的所有权限的属性(不包括父类)

setAccessible(true)给私有属性赋值需要****开启权限

constructor描述构造方法的类

newInstance调用无参构造方法

getConstructor调用有参构造方法

getModifiers获取构造方法的权限修饰符

ClassLoader类加载器

getClassLoader

getResourceAsStream获取一个文件的输入流

代理模式Proxy Pattern

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,代理对象在客户端和目标对象之间起到中介作用,属于结构型设计模式。

调用目标对象,增强目标对象的功能。

静态代理

接口,优先于实现类

局限:每一个代理类只能代理一个接口

动态代理DynamicProxy

  • JDK动态代理

JDK自带的动态代理类java.lang.reflect.Proxy实现动态代理
优点: 简单、方便
缺点: 只能代理接口,不能代理类

  • CGLib动态代理

如果目标对象没有实现任何接口,那么只能使用CGLib动态代理

开源,功能强大高性能的代码生成库
优点: 可以代理类

函数式接口@FunctionalInterface

  • 首先它是一个接口,然后在这个接口里面有且只有一个抽象方法。

  • 允许定义静态方法

  • 允许定义默认方法

posted @ 2023-01-17 21:28  Rix里克斯  阅读(14)  评论(0)    收藏  举报