1、定义服务接口

public interface RpcService {

    int printHello(int msg);
}

2、定义服务接口实现类

public class RpcInterfaceImpl implements RpcService{

    @Override
public int printHello(int msg) {
return msg;
} }

3、定义服务提供者

public class RpcProvider {

    public static void main(String[] args) throws Exception {
RpcService service = new RpcInterfaceImpl();
//对外暴露服务接口
RpcSimple.exportServer(service, 12306);
}
}

4、定义服务消费者

public class RpcMainTest {

    public static void main(String[] args) throws Exception{
//远程调用服务
RpcService service =
RpcSimple.refer(RpcService.class, "127.0.0.1", 12306);
for(int i = 0; i < 10; i++){
System.out.println(service.printHello(i));
Thread.sleep(1000);
}
}
}

5、服务提供中心类

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.ServerSocket;
import java.net.Socket; /**
* simple RPC servicer
* @author Tim
*
*/
public class RpcSimple { /**
* export server
*/
public static void exportServer(final Object service, int port) throws Exception{
if(null == service){
throw new IllegalArgumentException("service is not null");
}
if(port > 65535 || port < 0){
throw new IllegalArgumentException("port is not between 0 and 65535");
}
System.out.println("export service" + service.getClass().getName()
+ " on port " + port); @SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(port);
for(;;){
try {
final Socket socket = serverSocket.accept();
new Thread(new Runnable(){
@Override
public void run(){
try {
try {
ObjectInputStream input =
new ObjectInputStream(socket.getInputStream());
try {
/**get object from socket inputstream*/
String methodName = input.readUTF();
Class<?>[] parameterTypes = (Class<?>[]) input.readObject();
Object[] arguments = (Object[]) input.readObject();
ObjectOutputStream output =
new ObjectOutputStream(socket.getOutputStream());
try {
Method method = service.getClass().getMethod(methodName, parameterTypes);
Object result = method.invoke(service, arguments);
output.writeObject(result);
} catch (Exception e) {
output.writeObject(e);
}finally {
output.close();
}
}finally {
input.close();
}
}finally{
socket.close();
}
} catch (Exception e) { }
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
} /**
* refer server
*/
@SuppressWarnings("unchecked")
public static <T> T refer(final Class<T> interfaceClass,
final String host, final int port) throws Exception{
if(null == interfaceClass){
throw new IllegalArgumentException("interfaceClass is not null");
}
if(!interfaceClass.isInterface()){
throw new IllegalArgumentException(interfaceClass.getName()
+ "must be interface class");
}
if(null == host || host.length() == 0){
throw new IllegalArgumentException("host is null");
}
if(port > 65535 || port < 0) {
throw new IllegalArgumentException("the port must in 0 - 65535");
}
System.out.println("get remote service" + interfaceClass.getName()
+ " from server" + host + ": " + port);
return (T)Proxy.newProxyInstance(interfaceClass.getClassLoader(),
new Class<?>[] {interfaceClass}, new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] arguments) throws Throwable {
Socket socket = new Socket(host, port);
try {
ObjectOutputStream output =
new ObjectOutputStream(socket.getOutputStream());
try {
output.writeUTF(method.getName());
output.writeObject(method.getParameterTypes());
output.writeObject(arguments);
ObjectInputStream input =
new ObjectInputStream(socket.getInputStream());
try {
Object result = input.readObject();
if(result instanceof Throwable){
throw (Throwable)result;
}
return result;
} finally{
input.close();
}
} finally{
output.close();
}
} finally{
socket.close();
}
}
});
} }

RPC_简洁版的更多相关文章

  1. string类的简洁版实现

    说是原创,差不多算是转载了,我也是看了好多大牛的写法,大牛的建议,自己加一总结,形成代码: 实现一个简洁版的string类,我觉得,下面的也够了:另外需要参见另外的写法: http://blog.cs ...

  2. springboot 与 shiro 整合 (简洁版)

    前言: 网上有很多springboot 与 shiro 整合的资料,有些确实写得很好, 对学习shiro和springboot 都有很大的帮助. 有些朋友比较省事, 直接转发或者复制粘贴.但是没有经过 ...

  3. YAML基础知识及搭建一台简洁版guestbook

    一,前言 前面我们已经搭建过简易版k8s集群了,在此基础上可以搭建一个简洁版guestbook ,以便来学习k8s创建pod的整个过程. 二,在此之前,我们还需要学习一下YAML基础知识 YAML 基 ...

  4. jQuery弹出提示信息简洁版(自动消失)

    之前看了有一些现成的blockUI.Boxy.tipswindow等的jQuery弹出层插件,可是我的要求并不高,只需要在保存后弹出提示信息即可,至于复杂点的弹出层-可以编辑的,我是直接用bootst ...

  5. 带无缝滚动的轮播图(含JS运动框架)-简洁版

    昨天写的神逻辑,今天终于解决,经过大家的商讨,终于研究出来一套简单的代码!!! js代码如下: <script> window.onload = function() { var oWra ...

  6. jquery动态插入行,不用拼写html,简洁版

    这个一个利用jquery实现动态插入输入行效果小功能,不用在javascript里拼写html字符串,更简洁.高效. html代码: <div class="fitem"&g ...

  7. Android自定义简洁版EditText

    Android开发中有些主题的EditText不能让我们满意,我们通常希望文本输入框是一条直线,这样显得简洁又美观. 这里我们自定义了一个MyEditText类,继承EditText类,可以实现一条线 ...

  8. centosl7简洁版配置

    生产环境安装了精简版的centos7需要进行相关配置,添加相关组件才能更好的使用! 由于不同的安装方式欠缺的组件不尽相同,本例尽可能满足一般的生产环境的需要!!! 一.安装ifconfig服务 在没有 ...

  9. jdk安装简洁版

    一.jdk是what? jdk其实是个软件语言开发包,包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具. 没有JDK的话,无法编译Java程序(指java源码.java文件),如果想 ...

随机推荐

  1. DELPHI 调试IOS时出现 Please specify exact device preset UUID

    右击设备DEVICE, 选择REFRESH刷新, 再重新选择一个设备即可.

  2. SPFA的两个优化

    评测题:洛谷[模板]单源最短路径 不加任何优化: queue<int>q; void spfa(ll s) { ;i<=n;i++) d[i]=(ll)(); d[s]=;q.pus ...

  3. 暴力&打表

    _LH巨神好像不太会打表,这里来普及一下 还有暴力这么重要的东西网上讲的人竟然不多…… 一.打表 打表,就是针对一些输入数据比较小的题目的一种骗分技巧,当然有时候也可以在正解或暴力中起一定优化作用. ...

  4. SYSTEM32 下的几乎所有文件的简单说明(原由无忧启动论坛老毛桃出)

    SYSTEM32 下的几乎所有文件的简单说明(原由无忧启动论坛http://bbs.wuyou.com老毛桃出): clui.dll .....Security Descriptor Editor,没 ...

  5. Unity 中使用预编译指令区分平台

    在实际项目开发过程中,我们经常会根据平台来写一些逻辑 #if UNITY_EDITOR #elif UNITY_IPHONE #elif UNITY_ANDROID #endif 使用预编译指令能很好 ...

  6. 使用Flask+nginx+uwsgi+Docker部署python应用

    https://www.cnblogs.com/vh-pg/p/11731637.html

  7. hdu1159Common Subsequence——动态规划(最长公共子序列(LCS))

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  8. IIS网站绑定域名

    你新建的网站右键-->编辑绑定-->添加 -->类型:http,IP地址:全部未分配,端口号:80,主机名:你的域名,例如yangche.cn-->确定

  9. 结合Pool进程池进程,实现进程之间的通讯,稍微复杂的运用

    #进程池中的Queue """ 如果要用Pool创建进程,就需要multiprocessing.Manager()中的Queue() 而不是multiprocessing ...

  10. maven基础--IDEA集成

    创建项目 构建项目 查找依赖 依赖范围 provided:已提供依赖范围.编译和测试有效,运行无效.如servlet-api,在项目运行时,tomcat等容器已经提供