rpc
服务端
public class SocketServiceImpl implements SocketService {
@Override
public String sayHi(String name) {
return "Hi" + name;
}
客户端
public class Client {
//获取代表服务端接口的动态代理对象(HelloService)
//serviceInterFace:请求的接口名
// addr : 待请求服务端的ip: 端口
public static <T> T getRemoteProxyObj(Class serviceInterface, InetSocketAddress addr){
// 获取远程代理对象
// 需要的参数
/**
* a:类加载器:需要代理的那个类,就需要那个类的类加载器传进去
* b:需要代理对象的对象,具备哪些方法--接口
* 单继承 多实现 A implements b接口,c接口
* String str=new String();
* String [] str=new String[]{"aa","bb","cc"};
*
*/
return (T)Proxy.newProxyInstance(serviceInterface.getClassLoader(),new Class<?>[]{serviceInterface}, new InvocationHandler() {
//proxy:代理对象 method:那个方法 args 参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 客户端向服务端发送请求 请求某一个具体的接口
Socket socket = new Socket();
//连接
socket.connect(addr);
// 发送 获取OutputStream
OutputStream outputStream = socket.getOutputStream();
//序列化
ObjectOutputStream output = new ObjectOutputStream(outputStream);
//接口名 方法名:writeUTF
output.writeUTF(serviceInterface.getName());
output.writeUTF(method.getName());
//方法的参数类型,方法参数 Object
output.writeObject(method.getParameterTypes());
output.writeObject(args);
//等待服务端处理
//接收服务端处理后的返回值
InputStream inputStream = socket.getInputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Object object = objectInputStream.readObject();
objectInputStream.close();
output.close();
return object;//客户端返回值
}
});
};
}
注册中心