当前位置:编程学习 > 网站相关 >>

简单的远程调用实现

最近看到一个远程调用的简单实现,于是加上自己的理解分享给大家。
远程调用是典型的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();
63                      
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,