- 浏览: 5617 次
- 性别:
- 来自: 广州
最新评论
客户端 和 服务端公用文件
share
|__call
| |__Call.java
|__service
|__HelloService.java
客户端代码
locale
|__client
|__SimpleClient.java
|__ProxyFactory.java
|__TcpConnector.java
服务端代码
remote
|__server
| |__SimpleServer.java
|__service
|__HelloServiceImpl.java
程序实现目标
客户端通过动态代理类调用服务端HelloServiceImpl.java 中的方法
- // share.call.Call.java
- package share.call;
- import java.io.Serializable;
- /**
- *@date 2010-3-13 下午04:32:04
- *@author dycc
- *@file share.call.Call.java
- */
- public class Call implements Serializable{
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String className;
- private String methodName;
- @SuppressWarnings(value="unchecked")
- private Class[] paramTypes;
- private Object[] params;
- private Object result;
- public Call(){
- }
- @SuppressWarnings(value="unchecked")
- public Call(String className,String methodName,
- Class[] paramTypes,Object[] params){
- this.className = className;
- this.methodName = methodName;
- this.paramTypes = paramTypes;
- this.params = params;
- }
- public String getClassName() {
- return className;
- }
- public void setClassName(String className) {
- this.className = className;
- }
- public String getMethodName() {
- return methodName;
- }
- public void setMethodName(String methodName) {
- this.methodName = methodName;
- }
- @SuppressWarnings(value="unchecked")
- public Class[] getParamTypes() {
- return paramTypes;
- }
- @SuppressWarnings(value="unchecked")
- public void setParamTypes(Class[] paramTypes) {
- this.paramTypes = paramTypes;
- }
- public Object[] getParams() {
- return params;
- }
- public void setParams(Object[] params) {
- this.params = params;
- }
- public Object getResult() {
- return result;
- }
- public void setResult(Object result) {
- this.result = result;
- }
- public String toString(){
- StringBuffer sb = new StringBuffer();
- sb.append("{className=" + className);
- sb.append(",methodName=" + methodName);
- sb.append(",result=" + result);
- sb.append("}");
- return sb.toString();
- }
- }
- // share.service.HelloService.java
- package share.service;
- import java.util.Date;
- /**
- *@date 2010-3-13 下午04:29:29
- *@author dycc
- *@file share.service.HelloService.java
- */
- public interface HelloService {
- public String echo(String msg);
- public Date getTime();
- }
- // locale.client.SimpleClient.java
- package locale.client;
- import share.service.HelloService;
- /**
- *@date 2010-3-13 下午04:58:48
- *@author dycc
- *@file locale.client.SimpleClient.java
- */
- public class SimpleClient {
- /**
- * 通过代理类调用远程方法
- */
- public void invoke(){
- HelloService hello = (HelloService)ProxyFactory.getProxy(
- HelloService.class,"remote.service.HelloServiceImpl",
- "localhost", 8002);
- String result = hello.echo("music");
- System.out.println("result=" + result);
- }
- public static void main(String[] args){
- SimpleClient client = new SimpleClient();
- client.invoke();
- }
- }
- // locale.client.ProxyFactory.java
- package locale.client;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
- import java.rmi.RemoteException;
- import share.call.Call;
- /**
- *@date 2010-3-13 下午08:21:01
- *@author dycc
- *@file locale.client.ProxyFactory.java
- */
- public class ProxyFactory {
- /**
- * 获取动态代理类
- * @param classType 接口
- * @param className 实现类名称
- * @param ip ip 地址
- * @param port 端口
- * @return
- */
- @SuppressWarnings(value="unchecked")
- public static Object getProxy(Class classType,
- final String className,
- final String ip,final int port){
- // start
- InvocationHandler handler = new InvocationHandler(){
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- System.out.println("--- before " + method.getName() + "---");
- TcpConnector connector = new TcpConnector(ip, port);
- Call call = new Call(className,method.getName(),
- method.getParameterTypes(),args);
- call = (Call)connector.invoke(call);
- Object result = call.getResult();
- if(result instanceof Throwable){
- return new RemoteException(method.getName() + "invoke failed",
- (Throwable)result);
- }
- System.out.println("--- after " + method.getName() + "---");
- connector.close();
- return result;
- }
- };
- return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
- new Class[]{classType}, handler);
- }
- }
- // locale.client.TcpConnector.java
- package locale.client;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.net.Socket;
- /**
- *@date 2010-3-13 下午08:25:04
- *@author dycc
- *@file locale.client.TcpConnector.java
- */
- public class TcpConnector {
- private Socket socket;
- private ObjectInputStream in;
- private ObjectOutputStream out;
- /**
- * 构造器
- * @param ip
- * @param port
- * @throws IOException
- */
- public TcpConnector(String ip,int port)throws IOException{
- socket = new Socket(ip,port);
- }
- /**
- * 调用远程方法
- * @param obj
- * @throws IOException
- */
- public Object invoke(Object obj)throws IOException,ClassNotFoundException{
- if(out == null){
- out = new ObjectOutputStream(socket.getOutputStream());
- }
- out.writeObject(obj);
- out.flush();
- if(in == null){
- in = new ObjectInputStream(socket.getInputStream());
- }
- return in.readObject();
- }
- /**
- * 关闭连接
- */
- public void close(){
- try{
- if(in != null){
- in.close();
- }
- if(out != null){
- out.close();
- }
- if(socket != null){
- socket.close();
- }
- } catch(Exception e){
- }
- }
- }
- // remote.server.SimpleServer.java
- package remote.server;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.lang.reflect.Method;
- import java.net.ServerSocket;
- import java.net.Socket;
- import java.util.HashMap;
- import java.util.Map;
- import share.call.Call;
- /**
- *@date 2010-3-13 下午04:38:44
- *@author dycc
- *@file remote.server.SimpleServer.java
- */
- public class SimpleServer {
- private Map<String,Object> map_objs = new HashMap<String,Object>();
- private ObjectInputStream in;
- private ObjectOutputStream out;
- /**
- * 服务端在 8002 端口监听客户端请求
- * @throws IOException
- */
- public void service()throws IOException{
- ServerSocket server_socket = new ServerSocket(8002);
- System.out.println("----- server started. -----");
- while(true){
- try{
- Socket socket = server_socket.accept();
- // ObjectInputStream 会发生阻塞!!
- in = new ObjectInputStream(socket.getInputStream());
- Call call = (Call)in.readObject();
- System.out.println("-- get call [" + call.getClassName()
- + ":" + call.getMethodName() + "]");
- call = invoke(call);
- out = new ObjectOutputStream(socket.getOutputStream());
- out.writeObject(call);
- out.flush();
- } catch(Exception e){
- e.printStackTrace();
- } finally{
- try{
- if(in != null){
- in.close();
- }
- if(out != null){
- out.close();
- }
- } catch(Exception e){
- }
- }
- }
- }
- /**
- * 调用 call 所指定的的方法
- * @param call
- * @return
- */
- public Call invoke(Call call){
- Object obj = map_objs.get(call.getClassName());
- if(obj == null){
- try {
- obj = Class.forName(call.getClassName()).newInstance();
- map_objs.put(call.getClassName(), obj);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- try {
- Method method = obj.getClass().getMethod(
- call.getMethodName(),
- call.getParamTypes());
- Object result = method.invoke(obj, call.getParams());
- call.setResult(result);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return call;
- }
- public static void main(String[] args)throws Exception{
- SimpleServer server = new SimpleServer();
- server.service();
- }
- }
- // remote.service.HelloServiceImpl.java
- package remote.service;
- import java.util.Date;
- import share.service.HelloService;
- /**
- *@date 2010-3-13 下午04:30:44
- *@author dycc
- *@file remote.service.HelloServiceImpl.java
- */
- public class HelloServiceImpl implements HelloService{
- public String echo(String msg) {
- return "echo:" + msg;
- }
- public Date getTime() {
- return new Date();
- }
- }
相关推荐
Java 远程方法调用 (Java RMI) 是一个 Java API,它执行远程过程调用 (RPC) 的面向对象等价物,支持序列化 Java 类的直接传输和分布式垃圾收集。 远程过程调用:消息传递远程过程调用 (RPC) 是一种允许程序调用位于...
通过动态代理,我们可以在运行时生成代理类,用于代理真实对象的方法调用。这种代理机制允许我们在不修改原始代码的情况下,对原始对象的行为进行扩展、增强或控制。 动态代理的应用场景非常广泛。首先,它与AOP...
http远程接口调用-httpClient+跳过SSL证书校验. 里面分别有3个httpClient的工具类代码。 还有一个专门为了跳过SSL证书校验的工具类。
ASP.NET 中使用 C# 调用 Java Web Service 图解教程 在本教程中,我们将学习如何在 ASP.NET 中使用 C# 调用 Java Web Service。首先,我们需要了解什么是 Web Service。 Web Service 是一种软件系统,旨在支持机器...
java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....
基于java aio 的RPC 远程调用框架 组件介绍 Serializer 序列化和反序列的工具类,项目的实现为基于Gson的序列化工具 IOHandler 从Channel中读取数据并交由Serializer处理的类,本身是异步读取数据 在读取数据时 提供...
本章首先介绍了Java Reflection API的用法,然后介绍了一个远程方法调用的例子,在这个例子中客户端能够远程调用服务器端的一个对象的方法。服务器端采用了反射机制提供的动态调用方法的功能,而客户端则采用了反射...
里面列出了Java jdk 1.7的所有类及其使用方法! Java SE Platform 软件包: java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有...
里面列出了,Java的所有类及其使用方法! Java SE Platform 软件包: java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 ...
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
本实验报告主要介绍了 Java RMI(Remote Method Invocation,远程方法调用)的基本概念和实现步骤。RMI 是一种分布式对象通讯机制,允许运行在一个 Java 虚拟机的对象调用运行在另一个 Java 虚拟机上对象的方法。 ...
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
brap(Java远程调用框架 BRAP) 一个Java远程调用框架,它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准...
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...