rpc 2

注册中心

public class ServiceImpl implements Service {
//注册中心
// map: 服务端的所有的 可供客户端访问的接口,都注册到改map中
// key: 接口的名字"HelloService" value: 真正的接口实现
private static HashMap<String, Class> serviceRegister = new HashMap<>();
private static boolean isRuning=false;
//端口不固定 可以传进来
private static int port;
//线程池 处理客户端过来的每个请求

private static ExecutorService executor= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

public ServiceImpl(int port){
this.port=port;

}

//开启服务端服务
@Override
public void start() throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
ServerSocket serverSocket = new ServerSocket();
//绑定端口
serverSocket.bind(new InetSocketAddress(port));
isRuning=true;
while (true){
System.out.println("服务开启");
Socket socket = serverSocket.accept();
executor.execute(new Task(socket));
}
// //等待客户端连接
// Socket socket = serverSocket.accept();
// //接收到客户端连接及请求,处理该请求
// // 拿到输入流
// InputStream inputStream = socket.getInputStream();
// //序列化
// ObjectInputStream input = new ObjectInputStream(inputStream);
// //ObjectInputStream 对发送数据的顺序有严格要求
// String serviceName = input.readUTF();
// String methodName = input.readUTF();
// Class[] paramterTypes = (Class[])input.readObject();
// Object[] arguments = (Object[])input.readObject();
// //根据客户端请求,到map中找到与之对应的具体接口
// Class serviceClass = serviceRegister.get(serviceName);
// //找到具体的方法
// Method method = serviceClass.getMethod(methodName, paramterTypes);
// //执行该方法 参数1该方法所在类的对象 参数2 所需的参数 person.say();
// Object o = serviceClass.newInstance();
// Object invoke = method.invoke(o, arguments);
//
// //将执行完毕的返回值 传给客户端
// OutputStream outputStream = socket.getOutputStream();
// //序列化
// ObjectOutputStream out = new ObjectOutputStream(outputStream);
// out.writeObject(invoke);
// input.close();
// out.close();
}

@Override
public void stop() {
isRuning=false;
executor.shutdown();
}

// 客户端穿过来的字符串 通过反射 找到具体的接口
@Override
public void register(Class service, Class serviceImpl) {
serviceRegister.put(service.getName(), serviceImpl);
}

public static class Task implements Runnable {
private Socket socket;
public Task() {

}
public Task(Socket socket) {
this.socket = socket;
}

@Override
public void run() {
try {
// 拿到输入流
InputStream inputStream = socket.getInputStream();
//序列化
ObjectInputStream input = new ObjectInputStream(inputStream);
//ObjectInputStream 对发送数据的顺序有严格要求
String serviceName = input.readUTF();
String methodName = input.readUTF();
Class[] paramterTypes = (Class[])input.readObject();
Object[] arguments = (Object[])input.readObject();
//根据客户端请求,到map中找到与之对应的具体接口
Class serviceClass = serviceRegister.get(serviceName);
//找到具体的方法
Method method = serviceClass.getMethod(methodName, paramterTypes);
//执行该方法 参数1该方法所在类的对象 参数2 所需的参数 person.say();
Object o = serviceClass.newInstance();
Object invoke = method.invoke(o, arguments);

//将执行完毕的返回值 传给客户端
OutputStream outputStream = socket.getOutputStream();
//序列化
ObjectOutputStream out = new ObjectOutputStream(outputStream);
out.writeObject(invoke);
input.close();
out.close();
} catch (Exception e) {
} finally {
}
}
}
}
测试
public class TestCeterent {
public static void main(String[] args) throws NoSuchMethodException, IOException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
Service service = new ServiceImpl(9999);
service.register(SocketService.class, SocketServiceImpl.class);
service.start();
}




public class ClientTest {
public static void main(String[] args) throws ClassNotFoundException {
//开启一个线程
new Thread(new Runnable() {
@SneakyThrows
@Override
public void run() {
SocketService service= Client.getRemoteProxyObj(Class.forName("com.example.demo.service.SocketService"),new InetSocketAddress("127.0.0.1",9999));
String zhangsan_ = service.sayHi(" wwqwwqe ");
System.out.println(zhangsan_);
}
}).start();


posted @ 2021-11-14 22:30  yydssc  阅读(64)  评论(0)    收藏  举报