1.PRC(Remote Procudure Call)
- 远程过程调用(不同计算机里类的方法可以相互调用)
三个角色:客户端\服务端\注册中心(map集合 来实现注册)
实现所需技术: 反射技术,socket连接通信,动态代理
1.1 Service 服务端
public interface HelloService{
//服务端接口
public String sayHi(String name);
}
public class HelloServiceImpl implements HelloService {
//实现类
@Override
public String sayHi(String name) {
return "hi,"+name;
}
}
***反射技术回顾****
// Class类是用于java反射机制的,一切java类,都有一个对应的Class对象,他是一个final类。Class 类的实例表示,正在运行的 Java 应用程序中的类和接口。
// 在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息
// 获取Class实例的三种方式:
// (1)利用对象调用getClass()方法获取该对象的Class实例;
// (2)使用Class类的静态方法forName(),用类的名字获取一个Class实例(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );
// (3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例
// 在newInstance()调用类中缺省的构造方法 ObjectnewInstance()(可在不知该类的名字的时候,常见这个类的实例) Creates a new instance of the class represented by this Classobject.
// 在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象
//
// Class对象的生成方式如下:
// 1.Class.forName("类名字符串") (注意:类名字符串必须是全称,包名+类名);
// 2.类名.class;
// 3.实例对象.getClass();
1.2 Server 服务注册中心
public interface Server {
//服务注册中心
public void start();
public void stop();
//注册服务, 1.包名+类名;
public void register(Class service,Class serviceImpl);
//...
}
**********************实现类******
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ServerCenter implements Server {
//服务中心具体实现
//map: 服务端所有可供 客户端访问的接口,都注册到map中
// key: 接口的名字"HelloService,A接口,..." value:真正的HelloService实现
private static HashMap<String, Object> serviceRegiser