简单的远程调用实现
最近看到一个远程调用的简单实现,于是加上自己的理解分享给大家。
远程调用是典型的CS模型,Server端提供服务,客户端调用得到结果
先看服务端提供服务的方法
1 /**
2 * 提供服务
3 *
4 * @param service 服务实现
5 * @param port 端口(可以双发约定)
6 * @throws Exception
7 */
8 public static void provide(final Object service, final int port) throws Exception {
9 //参数检查
10 if (service == null) {
11 throw new IllegalArgumentException("The service can't be null!");
12 }
13 if (port > 65535) {
14 throw new IllegalArgumentException("The host can't greater than 65535!");
15 }
16 //开启一个ServerSocket接收请求
17 ServerSocket serverSocket = new ServerSocket(port);
18 //死循环等待请求
19 while (true) {
20 //接受到请求,获取socket
21 final Socket socket = serverSocket.accept();
22 try {
23 //开启一个线程处理
24 new Thread(new Runnable() {
25 @Override
26 public void run() {
27 try {
28 try {
29 //重socket中获取输入流
30 ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
31 try {
32 //获取方法名
33 String methodName = ois.readUTF();
34 //获取方法参数数组
35 Class[] methodParameterTypes = (Class[]) ois.readObject();
36 //获取参数值数组
37 Object[] arguments = (Object[]) ois.readObject();
38 //根据方法名和方法参数获取方法(根据方法名和方法参数可以唯一定位到一个方法)
39 Method method = service.getClass().getMethod(methodName, methodParameterTypes);
40 if (method == null) {
41 throw new NoSuchMethodException();
42 }
43 //执行方法
44 Object result = method.invoke(service, arguments);
45 System.out.println("Method:" + methodName + ";Arguments:" + arguments + " invoke!");
46 //获取socket输出流
47 ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
48 try {
49 //输出结果
50 oos.writeObject(result);
51 } finally {
52 oos.close();
53 }
54 } finally {
55 ois.close();
56 }
57 } finally {
58 socket.close();
59 }
60 } catch (Exception e) {
61 //记个日志啥的
62 e.printStackTrace();