手写一个简单的RPC
来源:互联网 发布:37少年群侠传进阶数据 编辑:程序博客网 时间:2024/05/18 22:14
public class MyRPC {
private static ExecutorService threadTool = Executors.newFixedThreadPool(5);
// 客户端
public static <T> Object getProxy(Class<T> clazz, String ip, int port)
throws Exception {
// 返回一个代理对象
Socket socket = new Socket(ip, port);
InputStream is = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
OutputStream os = socket.getOutputStream();
Object instance = Proxy.newProxyInstance(clazz.getClassLoader(),
clazz.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
StringBuffer sb = new StringBuffer();
sb.append(method.getName()).append("_");
int count = args.length;
for (int i = 0; i < count; i++) {
sb.append(args[i].toString());
if (i != count - 1)
sb.append("_");
}
sb.append("\n");
os.write(sb.toString().getBytes());
os.flush();
String result = reader.readLine();
if (result.equalsIgnoreCase("null"))
return null;
return result;
}
});
return instance;
}
public static Service buidler() {
return new Service();
}
// 服务端
public static class Service {
private ServerSocket service;
private Object instacne;
private Class clazz;
public Service setObject(Object instance) {
this.instacne = instance;
return this;
}
public Service setClass(Class clazz) {
this.clazz = clazz;
return this;
}
public Service setIntentPort(int port) throws Exception {
service = new ServerSocket(port);
return this;
}
public void start() throws Exception {
System.out.println("begian connect");
while (true) {
final Socket socket = service.accept();
System.out.println(socket.getLocalAddress() + ":liangshang");
threadTool.execute(new Runnable() {
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(
new InputStreamReader(socket
.getInputStream()));
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(socket
.getOutputStream()));
while (true) {
if (socket.isClosed())
break;
String data = br.readLine();
if (data != null && !data.equals("")) {
String[] datas = data.split("_");
if (datas != null) {
String methodName = datas[0];
String[] params = new String[datas.length - 1];
Class[] types = new Class[datas.length - 1];
for (int i = 1; i < datas.length; i++) {
if (datas[i].equals(""))
continue;
params[i - 1] = datas[i];
types[i - 1] = String.class;
}
Method method = clazz
.getDeclaredMethod(methodName,
types);
String result = (String) method.invoke(
instacne, params);
bw.write(result + "\n");
bw.flush();
}
}
}
} catch (Exception e) {
System.err.println(e);
try {
socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
}
}
}
}
调用服务端:
public class ServiceTest {
public static void main(String[] args) throws Exception {
Service service = MyRPC.buidler();
service.setClass(LoginService.class).setObject(new LoginServiceImpl()).setIntentPort(3001);
service.start();
}
}
调用客户端:
public class ControllerTest {
public static void main(String[] args) throws Exception {
LoginService proxy = (LoginService) MyRPC.getProxy(MyLoginService.class, "127.0.0.1", 3001);
String result = proxy.login("yinchong");
System.out.println(result);
Thread.sleep(2000);
result = proxy.login("yucui");
System.out.println(result);
Thread.sleep(2000);
result = proxy.login("yinyou");
System.out.println(result);
}
static class MyLoginService implements LoginService{
@Override
public String login(String name) {
// TODO Auto-generated method stub
return null;
}
}
}
- 手写一个简单的RPC
- 一个简单的RPC框架
- 一个简单有效的手写识别引擎
- 一个简单的rpc框架的实现
- 一个简单的rpc框架的实现
- 自己实现一个简单的RPC框架
- 如何实现一个简单的rpc框架
- 面试手写一个简单的STL容器vector
- 浅析Spring原理,手写一个简单的Spring
- 简单实现一个rpc框架
- 一个简单RPC,java实现
- php实现的一个简单json rpc框架实例
- 一个简单的rpc框架实现(待连载优化)
- 一个简单的rpc框架实现(一)
- Java实现一个简单的RPC框架(一) 本地调用
- Java实现一个简单的RPC框架(二) 协议
- Java实现一个简单的RPC框架(六) 注册机制
- 从头创建一个简单的RPC服务框架
- DrawerLayout的使用
- 关于html文件的定时刷新及跳转页面
- java 二,八,十,十六进制相互转化
- jquery ajax遍历list数据
- POJ 1009 Edge Detection 笔记
- 手写一个简单的RPC
- pycharm教程
- petalinux-config -c kernel 出错
- Hibernate多表联合查询 并且封装Vo对象 日期格式转换
- Python assert 的使用方法
- TCP滑动窗口和拥塞窗口
- @dynamic、@synthesize
- Mybatis一对多中的SQL(查询、删除、更新、插入)及表的设计
- 51Nod-1296-有限制的排列