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. Linux学习-基于CentOS7的ProxySQL实现读写分离

    一.实验环境 主机:3台,一台ProxySQL(192.168.214.37),两台主从复制,master(192.168.214.17),slave(192.168.214.27) 系统:CentO ...

  2. ht-7 treeSet特性

    TreeSetTreeSet可以对set集合中的元素进行排序,默认按照asic码表的自然顺序排序,之所以treeset能排序是因为底层是二叉树,数据越多越慢,TreeSet是依靠TreeMap来实现的 ...

  3. 实现网页qq在线咨询功能

    在自己的网页中实现qq在线咨询,给图片或链接添加地址为:tencent://message/?uin=你的qq号码!就可以了. <a href="tencent://message/? ...

  4. vim 批量添加删除注释

    vim中单行注释只是多行注释的一个特例,这里统一进行多行注释的讲解 (1)添加批量注释 ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I(shift+i) ...

  5. Fiddler正则匹配调试接口示例

    Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改. 代理就是在 ...

  6. Android中国官网资源网站

    现在android开发者官网在中国有中文版已经不是太大的新闻,为了平时查询资料和学习方便,记录如下. PS:建议用Google浏览器浏览,你懂的!! https://developers.google ...

  7. PHP-图片处理

    开启 GD 扩展(php_gd2.dll) 创建画布 画布:一种资源型数据,可以操作的图像资源. 创建新画布(新建) ImageCreate(宽,高); 创建基于调色板的画布. imageCreate ...

  8. VUEJS(vuejs) 数组数据不及时刷新

    在Vue对象中的methods属性中构建一个方法用于刷新data使用Vue.set方法进行手动刷新methods:{update:function(o){Vue.set(this,'list',o); ...

  9. HTML--JS 定时刷新、时钟、倒计时

    <html> <head> <title>定时刷新时间</title> <script language="JavaScript&quo ...

  10. MAC-安装套件管理工具Homebrew

    前言 Homebrew是一款Mac OS下的套件管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能. Homebrew安装 1,Homebrew官网获取安装指令,官网地址:https://br ...