forked from lihengming/java-codes
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSimpleRpcFramework.java
More file actions
67 lines (63 loc) · 2.85 KB
/
Copy pathSimpleRpcFramework.java
File metadata and controls
67 lines (63 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package rpc;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by 李恒名 on 2017/8/17.
*/
public class SimpleRpcFramework {
/**
* 暴漏服务
* @param serviceImpl 服务的实现
* @param port 服务所处的端口号
*/
public static void export(Object serviceImpl, int port) {
try {
try (ServerSocket server = new ServerSocket(port)) {
while (!Thread.currentThread().isInterrupted()) {
Socket socket = server.accept();
new Thread(() -> {
try (ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {
Method method = serviceImpl.getClass().getMethod(in.readUTF(), (Class<?>[]) in.readObject());
Object result = method.invoke(serviceImpl, (Object[]) in.readObject());
try (ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream())) {
out.writeObject(result);
}
System.out.println("Invoke method [" + method.getName() + "()] success, form " + socket.getRemoteSocketAddress());
} catch (Exception e) {
throw new RuntimeException("Export service fail .", e);
}
}).start();
}
}
} catch (Exception e) {
throw new RuntimeException("Export service fail .", e);
}
System.out.println("Export service " + serviceImpl.getClass().getSimpleName() + " success on port " + port);
}
/**
* 使用服务
* @param serviceInterface 要使用的服务的接口
* @param host 服务所处的主机名称
* @param port 服务所处的端口号
* @return 服务
*/
public static <T> T use(Class<T> serviceInterface, String host, int port) {
System.out.println(String.format("Use remote service [%s] from [%s:%s]", serviceInterface.getSimpleName(), host, port));
return (T) Proxy.newProxyInstance(serviceInterface.getClassLoader(), new Class<?>[]{serviceInterface}, (proxy, method, args) -> {
try (Socket socket = new Socket(host, port)) {
try (ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream())) {
out.writeUTF(method.getName());
out.writeObject(method.getParameterTypes());
out.writeObject(args);
try (ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {
return in.readObject();
}
}
}
});
}
}