public interface HelloService { public String say(String name); public int add(int a, int b); }
服务接口,需要在客户端与服务端都定义
public class HelloServiceImpl implements HelloService { @Override public String say(String name) { // 模拟方法执行需要的时间 try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } return "Hello " + name; } @Override public int add(int a, int b) { // 模拟方法执行需要的时间 try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } return a + b; } }
服务实现类,在服务端定义
import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.net.Socket; import java.net.UnknownHostException; public class Client { /** * @param interfaceClass * 接口Class类型 * @param host * IP地址或主机 * @param port * 服务器端监听端口号 * @return 代理类 */ public static <T> T getProxy(Class<T> interfaceClass, final String host, final int port) { InvocationHandler handler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { OutputStream os = null; ObjectOutputStream oos = null; InputStream is = null; ObjectInputStream ois = null; Socket socket = null; try { socket = new Socket(host, port); // 创建输出流 os = socket.getOutputStream(); oos = new ObjectOutputStream(os); // 向服务器端传递要执行的方法的方法名 oos.writeUTF(method.getName()); // 向服务器端传递要执行的方法的参数类型 oos.writeObject(method.getParameterTypes()); // 向服务器端传递要执行的方法的实际参数 oos.writeObject(args); // 创建输入流 is = socket.getInputStream(); ois = new ObjectInputStream(is); // 从输入流中读取服务器端执行的结果 return ois.readObject(); } catch (Exception e) { e.printStackTrace(); } finally { os.close(); oos.close(); is.close(); ois.close(); socket.close(); } return null; } }; return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class[] { interfaceClass }, handler); } public static void main(String[] args) throws UnknownHostException, IOException { for (int i = 0; i < 9999; i++) { HelloService hs = (HelloService) getProxy(HelloService.class, "172.16.14.223", 2555); System.out.println(hs.say("jack" + i)); System.out.println(hs.add(i + 1, i * i)); } } }
以上是客户端的代码
import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.ServerSocket; import java.net.Socket; public class Server { static class ProcessThread extends Thread { private Socket socket; public Socket getSocket() { return socket; } public void setSocket(Socket socket) { this.socket = socket; } public ProcessThread() { super(); } public ProcessThread(Socket socket) { super(); this.socket = socket; } @Override public void run() { ObjectInputStream ois = null; InputStream is = null; ObjectOutputStream oos = null; OutputStream os = null; try { // 获取输入流 is = socket.getInputStream(); ois = new ObjectInputStream(is); String methodName = ois.readUTF(); System.out.println("方法名为:" + methodName); Class[] paramTypes = (Class[]) ois.readObject(); Object[] args = (Object[]) ois.readObject(); System.out.println("参数值为:"); for (Object obj : args) { System.out.print(obj.toString() + ","); } System.out.println(); // 获取输出流 os = socket.getOutputStream(); oos = new ObjectOutputStream(os); // 得到客户端请求的方法反射类型 Method method = HelloServiceImpl.class.getMethod(methodName, paramTypes); // 执行客户端请求的方法 HelloServiceImpl helloImpl = new HelloServiceImpl(); Object rst = method.invoke(helloImpl, args); // 将执行结果写入输出流 oos.writeObject(rst); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } finally { try { ois.close(); is.close(); os.close(); oos.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) throws IOException { final ServerSocket serverSocket = new ServerSocket(2555); final HelloServiceImpl service = new HelloServiceImpl(); // 服务器端处理线程 new Thread(new Runnable() { @Override public void run() { while (true) { try { // 服务器端开始监听 Socket socket = serverSocket.accept(); // 监听到一个客户端请求 Thread processThread = new ProcessThread(socket); // 处理客户端请求 processThread.start(); } catch (IOException e) { e.printStackTrace(); } } } }).start(); } }
以上是服务器端的代码
客户端由代理类,向服务端发送远程调用请求,把方法名,方法的参数类型,方法的实际参数,传递给服务端,服务端用服务接口的实现类执行客服端请求的相应方法,将结果返回给客户端的代理类
相关推荐
- 对于Java接口远程调用,通常会封装成服务类,如`RemoteRequestServiceImpl.java`和`RemoteRequetService.java`中的实现。服务类中会包含执行HTTP请求的方法,可能包括设置请求头、处理响应等逻辑。 4. **使用库...
Java远程调用(Remote Method Invocation,RMI)是Java平台中一种重要的分布式计算技术,它允许在不同网络环境中的Java对象之间进行透明的交互。在本文中,我们将深入探讨三种不同的RMI实现方法:原始方式、Spring...
在Java中,Akka可以用来实现TCP远程调用,这使得不同系统之间能够通过网络进行通信。下面我们将深入探讨如何使用Akka与Java来实现TCP远程调用,以及其中涉及的关键知识点。 首先,我们需要理解Akka的Actor系统。...
java调用远程接口传输数据的demo
标题中的“Flex与Java交互 远程调用方式”指的是在Adobe Flex应用程序中与Java后端进行通信的技术。Flex是一种基于ActionScript的开源框架,用于构建富互联网应用程序(RIA),而Java是后端开发的常用语言。两者之间...
接下来,`getMemberAccountCount`方法实现了远程调用逻辑,通过`this.ref.invoke`方法调用了远程方法,并处理了可能抛出的异常。 #### 2. 客户端代码分析 客户端通过`Naming.lookup`方法获取远程服务的引用,然后...
Java远程调用批处理文件是将Java编程与批处理脚本结合的一种技术,它允许Java程序执行在远程服务器上的批处理任务,而无需人工干预。这通常涉及到网络通信和进程间交互,使得分布式系统能够更加灵活地管理和调度任务...
- 性能开销:远程调用涉及序列化、网络传输等操作,性能不如本地调用。 - 复杂性:实现和维护较为复杂,尤其是处理异常情况时。 #### 六、总结 RMI为Java开发者提供了一种强大的工具,用于构建分布式应用。理解RMI...
Java远程调用Kettle说明与代码 Java远程调用Kettle是一种基于Java的ETL(Extract、Transform、Load)工具,能够对数据进行提取、转换、加载,以满足不同业务需求。Kettle提供了名为Carte的Web Server程序,也被称为...
Java远程调用框架是分布式系统中关键的技术,它允许运行在不同计算机上的应用程序相互通信,协同完成任务。本文探讨的是一种基于动态代理的Java远程调用框架,旨在解决传统远程调用技术如RMI(Remote Method ...
Java Hessian远程调用是一种高效的、轻量级的RPC(Remote Procedure Call)解决方案,它允许Java应用程序通过网络进行跨语言的通信。Hessian是BEA Systems开发的一种二进制Web服务协议,它提供了序列化和远程方法...
本篇文章将探讨如何使用Java来实现简单的分布式系统,并进行远程方法调用。 首先,分布式系统是由多个独立的节点(计算机或进程)组成的网络,这些节点通过通信和协作来完成共同的任务。在Java中,我们可以利用Java...
Java基于MCR的本地远程调用Matlab函数库
java RestTemplate 远程调用工具类java RestTemplate 远程调用工具类java RestTemplate 远程调用工具类java RestTemplate 远程调用工具类java RestTemplate 远程调用工具类java RestTemplate 远程调用工具类
Java远程方法调用(Remote Method Invocation,简称RMI)是Java平台中用于分布式计算的核心技术。它允许一个Java对象在一台机器上调用另一台机器上的对象的方法,仿佛这些方法是在本地对象上调用一样。本篇文章将对...
最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程
Java远程方法调用(Remote Method Invocation,简称RMI)组件是一种关键的技术,它允许Java应用程序在不同的网络节点之间透明地调用对象的方法,仿佛这些对象都在本地进程中一样。这种技术在构建分布式系统、大型...
Java远程调用工具是开发过程中不可或缺的利器,尤其在处理分布式系统和服务之间的交互时。本文将深入探讨如何利用Java技术进行远程调用,特别是针对WebService和RESTful接口的调用,以及一个常用的工具——SoapUI。 ...
基于java的开发源码-brap(Java远程调用框架 BRAP).zip 基于java的开发源码-brap(Java远程调用框架 BRAP).zip 基于java的开发源码-brap(Java远程调用框架 BRAP).zip 基于java的开发源码-brap(Java远程调用框架 BRAP)....
Java 远程方法调用(Java RMI,Remote Method Invocation)是Java平台提供的一种用于构建分布式应用程序的技术。它允许一个对象在某个Java虚拟机(JVM)上执行的方法调用另一个在不同JVM上的对象的方法,仿佛它们是...