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文件),如果想 ...
随机推荐
- jmeter接口测试与接口测试工具
接口测试与接口测试工具 1,什么是接口? 接口,Application Programming Interface(API) 通俗的讲 就是HTTP请求 2,什么是接口测试? 接口测试测试组件间接口的 ...
- NodeJS使用puppeteer进行截图
const puppeteer = require('/home/ordinaryUser_2/automation/NodeJS/node/lib/node_global/lib/node_modu ...
- jsp选择文件夹上传
文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...
- 【Java】ApplicationContext应用上下文工具类
@Slf4j @Service public class SpringContextHolder implements ApplicationContextAware, DisposableBean ...
- 解决webpack打包vue项目后,部署完成后,刷新页面页面404
1.url不动式url完全不动,即你的页面怎么改变,怎么跳转url都不会改变.这种情况的原理 就是纯ajax拿到页面后替换原页面中的元素,刷新页面就是首页 2.带hash(#)式这种相对于第一种的话刷 ...
- Strange fuction hdu 2899
Strange fuction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- python中用os.walk查找全部的子文件
import os import shutil # 要遍历查找的文件所在的父文件夹 trajectory_filename =r"D:\mapping" # 要粘贴到的目标文件夹 ...
- “美登杯”上海市高校大学生程序设计 E. 小花梨的数组 (线段树)
https://acm.ecnu.edu.cn/contest/173/problem/E/ 分析: 考虑这样一种情况,如果对一个点连续地做几次乘操作,那么之后紧跟着的除操作只需要将乘操作的次数减少即 ...
- php面试专题---10、网络协议考点
php面试专题---10.网络协议考点 一.总结 一句话总结: 网络的考点其实就是这些:常见状态码,常见协议,osi七层模型,http和https 1.HTTP/1.1中,状态码200.301.304 ...
- python使用中遇到的一些问题
一./usr/bin/ld:cannot find -lxxx错误 例如出现了问题: /usr/bin/ld:cannot find -lssl 其中xxx表示函式库文件名称,如上面的libssl.s ...