`
jaychang
  • 浏览: 734760 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

java简单远程调用

 
阅读更多
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();
	}
}

 以上是服务器端的代码

 

客户端由代理类,向服务端发送远程调用请求,把方法名,方法的参数类型,方法的实际参数,传递给服务端,服务端用服务接口的实现类执行客服端请求的相应方法,将结果返回给客户端的代理类

 

 

分享到:
评论

相关推荐

    service_java接口远程调用_get、post、带参数远程调用_

    - 对于Java接口远程调用,通常会封装成服务类,如`RemoteRequestServiceImpl.java`和`RemoteRequetService.java`中的实现。服务类中会包含执行HTTP请求的方法,可能包括设置请求头、处理响应等逻辑。 4. **使用库...

    三种方式实现java远程调用(rmi),绝对可用

    Java远程调用(Remote Method Invocation,RMI)是Java平台中一种重要的分布式计算技术,它允许在不同网络环境中的Java对象之间进行透明的交互。在本文中,我们将深入探讨三种不同的RMI实现方法:原始方式、Spring...

    akka java实现tcp远程调用

    在Java中,Akka可以用来实现TCP远程调用,这使得不同系统之间能够通过网络进行通信。下面我们将深入探讨如何使用Akka与Java来实现TCP远程调用,以及其中涉及的关键知识点。 首先,我们需要理解Akka的Actor系统。...

    java调用远程接口传输数据的demo

    java调用远程接口传输数据的demo

    Flex与java交互 远程调用方式

    标题中的“Flex与Java交互 远程调用方式”指的是在Adobe Flex应用程序中与Java后端进行通信的技术。Flex是一种基于ActionScript的开源框架,用于构建富互联网应用程序(RIA),而Java是后端开发的常用语言。两者之间...

    JAVA RMI远程调用方法代码

    接下来,`getMemberAccountCount`方法实现了远程调用逻辑,通过`this.ref.invoke`方法调用了远程方法,并处理了可能抛出的异常。 #### 2. 客户端代码分析 客户端通过`Naming.lookup`方法获取远程服务的引用,然后...

    java远程调用批处理文件代码归总

    Java远程调用批处理文件是将Java编程与批处理脚本结合的一种技术,它允许Java程序执行在远程服务器上的批处理任务,而无需人工干预。这通常涉及到网络通信和进程间交互,使得分布式系统能够更加灵活地管理和调度任务...

    java远程方法调用

    - 性能开销:远程调用涉及序列化、网络传输等操作,性能不如本地调用。 - 复杂性:实现和维护较为复杂,尤其是处理异常情况时。 #### 六、总结 RMI为Java开发者提供了一种强大的工具,用于构建分布式应用。理解RMI...

    java远程调用kettle说明与代码.pdf

    Java远程调用Kettle说明与代码 Java远程调用Kettle是一种基于Java的ETL(Extract、Transform、Load)工具,能够对数据进行提取、转换、加载,以满足不同业务需求。Kettle提供了名为Carte的Web Server程序,也被称为...

    基于动态代理的Java远程调用框架的研究1

    Java远程调用框架是分布式系统中关键的技术,它允许运行在不同计算机上的应用程序相互通信,协同完成任务。本文探讨的是一种基于动态代理的Java远程调用框架,旨在解决传统远程调用技术如RMI(Remote Method ...

    JAVA实现简单分布式,JAVA调用远程方法

    本篇文章将探讨如何使用Java来实现简单的分布式系统,并进行远程方法调用。 首先,分布式系统是由多个独立的节点(计算机或进程)组成的网络,这些节点通过通信和协作来完成共同的任务。在Java中,我们可以利用Java...

    Java基于MCR的本地远程调用Matlab函数库.zip

    Java基于MCR的本地远程调用Matlab函数库

    java RestTemplate 远程调用工具类

    java RestTemplate 远程调用工具类java RestTemplate 远程调用工具类java RestTemplate 远程调用工具类java RestTemplate 远程调用工具类java RestTemplate 远程调用工具类java RestTemplate 远程调用工具类

    java远程调用方法总结

    Java远程方法调用(Remote Method Invocation,简称RMI)是Java平台中用于分布式计算的核心技术。它允许一个Java对象在一台机器上调用另一台机器上的对象的方法,仿佛这些方法是在本地对象上调用一样。本篇文章将对...

    java rmi远程调用

    最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程

    java远程调用kettle说明与代码

    ### Java远程调用Kettle说明与代码 #### 概述 Kettle是一款强大的开源ETL工具,用于数据清洗和加载。随着数据量的增长以及对数据处理能力的需求提升,分布式执行ETL任务变得越来越重要。Kettle为此提供了名为Carte...

    自己的Java远程方法调用组件

    Java远程方法调用(Remote Method Invocation,简称RMI)组件是一种关键的技术,它允许Java应用程序在不同的网络节点之间透明地调用对象的方法,仿佛这些对象都在本地进程中一样。这种技术在构建分布式系统、大型...

    Java调用本地的远程桌面连接

    总之,Java调用本地的远程桌面连接是一种结合操作系统功能和Java编程的技术,它在自动化运维、远程支持等领域有着广泛的应用。然而,使用时需要注意安全性和稳定性,确保数据的保密性,并考虑在不同环境下的兼容性。

    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).zip 基于java的开发源码-brap(Java远程调用框架 BRAP)....

Global site tag (gtag.js) - Google Analytics