RPC框架的最简单实现

一个最简单的RPC框架实现包含暴露服务、引用服务、Socket通讯三部分。


RPC框架简易实现

public class RpcFramework {

public static void exportService(final Object service, int port) throws Exception {

ServerSocket serverSocket = new ServerSocket(port);

while (true) {

final Socket socket = serverSocket.accept();

new Thread(new Runnable() {

@Override

public void run() {

ObjectInputStream reader = null;

ObjectOutputStream writer = null;

try {

reader = new ObjectInputStream(socket.getInputStream());

String methodName = reader.readUTF();

Class[] argumentsType = (Class[]) reader.readObject();

Object[] arguments = (Object[]) reader.readObject();

Method method = service.getClass().getMethod(methodName, argumentsType);

Object result = method.invoke(service, arguments);


writer = new ObjectOutputStream(socket.getOutputStream());

writer.writeObject(result);

} catch (Exception e) {

if (null != writer) {

try {

writer.writeObject(e);

} catch (IOException e1) {

e1.printStackTrace();

}

}

} finally {

if (null != writer) {

try {

writer.close();

} catch (IOException e) {

e.printStackTrace();

}

}


if (null != reader) {

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}).start();

}

}


public static <T> T referenceService(Class<T> interfaceClass, final String host, final int port) {

return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class[]{interfaceClass}, new InvocationHandler() {

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

Socket socket = new Socket(host, port);

ObjectOutputStream writer = null;

ObjectInputStream reader = null;

try {

writer = new ObjectOutputStream(socket.getOutputStream());

writer.writeUTF(method.getName());

writer.writeObject(method.getParameterTypes());

writer.writeObject(args);

reader = new ObjectInputStream(socket.getInputStream());

return reader.readObject();

} finally {

if (null != writer) {

writer.close();

}


if (null != reader) {

reader.close();

}

}

}

});

}

}


接口

public interface HelloService {

String sayHello(String name);

}


public interface ByeService {

String sayBye(String name);

}


接口实现

public class HelloServiceImpl implements HelloService {

@Override

public String sayHello(String name) {

return name + " say hello";

}

}


public class ByeServiceImpl implements ByeService {

@Override

public String sayBye(String name) {

return name +" bye bye";

}

}


服务提供方

public class Provider {

public static void main(String[] args) throws Exception {

final HelloService helloService = new HelloServiceImpl();

new Thread(new Runnable() {

@Override

public void run() {

try {

RpcFramework.exportService(helloService, 20880);

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();


final ByeService byeService = new ByeServiceImpl();

new Thread(new Runnable() {

@Override

public void run() {

try {

RpcFramework.exportService(byeService, 20881);

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

}

}


服务消费方

public class Consumer {

public static void main(String[] args) {

HelloService helloService = RpcFramework.referenceService(HelloService.class, "127.0.0.1", 20880);

System.out.println(helloService.sayHello("tom"));


ByeService byeService = RpcFramework.referenceService(ByeService.class, "127.0.0.1", 20881);

System.out.println(byeService.sayBye("jack"));

}

}


输出

tom say hello

jack bye bye


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值