RPC_简洁版
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_简洁版的更多相关文章
- string类的简洁版实现
说是原创,差不多算是转载了,我也是看了好多大牛的写法,大牛的建议,自己加一总结,形成代码: 实现一个简洁版的string类,我觉得,下面的也够了:另外需要参见另外的写法: http://blog.cs ...
- springboot 与 shiro 整合 (简洁版)
前言: 网上有很多springboot 与 shiro 整合的资料,有些确实写得很好, 对学习shiro和springboot 都有很大的帮助. 有些朋友比较省事, 直接转发或者复制粘贴.但是没有经过 ...
- YAML基础知识及搭建一台简洁版guestbook
一,前言 前面我们已经搭建过简易版k8s集群了,在此基础上可以搭建一个简洁版guestbook ,以便来学习k8s创建pod的整个过程. 二,在此之前,我们还需要学习一下YAML基础知识 YAML 基 ...
- jQuery弹出提示信息简洁版(自动消失)
之前看了有一些现成的blockUI.Boxy.tipswindow等的jQuery弹出层插件,可是我的要求并不高,只需要在保存后弹出提示信息即可,至于复杂点的弹出层-可以编辑的,我是直接用bootst ...
- 带无缝滚动的轮播图(含JS运动框架)-简洁版
昨天写的神逻辑,今天终于解决,经过大家的商讨,终于研究出来一套简单的代码!!! js代码如下: <script> window.onload = function() { var oWra ...
- jquery动态插入行,不用拼写html,简洁版
这个一个利用jquery实现动态插入输入行效果小功能,不用在javascript里拼写html字符串,更简洁.高效. html代码: <div class="fitem"&g ...
- Android自定义简洁版EditText
Android开发中有些主题的EditText不能让我们满意,我们通常希望文本输入框是一条直线,这样显得简洁又美观. 这里我们自定义了一个MyEditText类,继承EditText类,可以实现一条线 ...
- centosl7简洁版配置
生产环境安装了精简版的centos7需要进行相关配置,添加相关组件才能更好的使用! 由于不同的安装方式欠缺的组件不尽相同,本例尽可能满足一般的生产环境的需要!!! 一.安装ifconfig服务 在没有 ...
- jdk安装简洁版
一.jdk是what? jdk其实是个软件语言开发包,包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具. 没有JDK的话,无法编译Java程序(指java源码.java文件),如果想 ...
随机推荐
- darknet-yolov3使用opencv3.4.8时,undefined reference 'imshow()'、'waitKey()'、'nameWindows()'
解决办法:暴力卸载 卸载办法:进入到opencv3.4.8的安装目录下:make uninstall 然后重新安装了其他版本的,立马编译通过了.
- LDD3 第15章 内存映射和DMA
本章内容分为三个部分: 第一部分讲述了mmap系统调用的实现过程.将设备内存直接映射到用户进程的地址空间,尽管不是所有设备都需要,但是能显著的提高设备性能. 如何跨越边界直接访问用户空间的内存页,一些 ...
- 2019 年百度之星·程序设计大赛 - 复赛 Diversity (树形DP)
题目:https://vjudge.net/contest/325352#problem/A 题意:给你一棵树,每个点给一个区间,可以选区间里面任何一个数,然后问怎么安排得到最大边两点之间的差值和,求 ...
- 【CDN+】 Hive 入门 以及Handoop 系统认知
前言 本文主要介绍Hive 的基础概念,以及Handoop的大体架构,组件依赖,对于大数据有个总体的认识 Hive 基础概念 官网:https://hive.apache.org/ The Apach ...
- Mybatis入门之MyBatis基础
一.MyBatis概述 1.ORM模型简介 ORM:对象关系映射(Object Relation Mapping) 1)传统JDBC程序的设计缺陷(实际项目不使用) a.大量配置信息硬编码 b.大量的 ...
- 异常-打开文件过多(too many open files)
异常-打开文件过多 异常报错如下 09-Oct-2019 15:37:51.923 严重 [http-nio2-8080-Acceptor-0] org.apache.tomcat.util.net. ...
- SmokeTest测试流程
没办法了,本来是表格,但是粘贴不过来 测试目的: 用于检测该版本在基本的应用场景下,基本的功能是否满足. 测试前提: 发货版本 示例:ATV9冒烟测试测试项解读 表格获取:Google ATV hel ...
- [LeetCode] 4. Median of Two Sorted Arrays(想法题/求第k小的数)
传送门 Description There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the m ...
- [Linux] 026 光盘 yum 源搭建
光盘 yum 搭建步骤 (1) 挂载光盘 $ mount /dev/cdrom /mnt/cdrom/ (2) 让网络 yum 源文件失效 $ cd /etc/yum.repos.d/ $ mv Ce ...
- 爬取王垠的博客并生成pdf
尚未完善,有待改进 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' import pdfkit im ...