Java 简单的rpc 一
一,简单rpc 是基于Java socket 编程
- ServerSocket serverSocket = new ServerSocket(9999);
- System.out.println("服务开启");
- while(true) {
- //开启一个服务监听
- Socket socket = serverSocket.accept();
- System.out.println(socket.getInetAddress()+"-connected");
- InputStream in = socket.getInputStream();
- byte[] buf = new byte[1024];
- in.read(buf);
//拿到序列化得数据- byte[] formatDate = formatData(buf);
- OutputStream out = socket.getOutputStream();
- out.write(formatDate);
- socket.close();
}
通过NetModel类保证从客户端传入的参数 包括 类的名称 方法名称 参数类型 参数
- package org.Simple.API;
- import java.io.Serializable;
- import java.util.Arrays;
- public class NetModel implements Serializable{
- private static final long serialVersionUID = 1L;
- private String className;
- private String method;
- private Object[] args ;
- private String[] types;
- public String getClassName() {
- return className;
- }
- public void setClassName(String className) {
- this.className = className;
- }
- public String getMethod() {
- return method;
- }
- public void setMethod(String method) {
- this.method = method;
- }
- public Object[] getArgs() {
- return args;
- }
- public void setArgs(Object[] args) {
- this.args = args;
- }
- public String[] getTypes() {
- return types;
- }
- public void setTypes(String[] types) {
- this.types = types;
- }
- @Override
- public String toString() {
- return "NetModel [className=" + className + ", method=" + method + ", args=" + Arrays.toString(args)
- + ", types=" + Arrays.toString(types) + "]";
- }
- }
通过Java 反射 调用方法生成结果 在通过 serversocket 返回给客户端
- try {
- //将收到的byte数组反序列化为NetModel类型,然后通过反射调用HelloServiceImpl实现类的方法
- NetModel netModel = (NetModel)SerializeUtils.deSerialize(bs);
- //包点类名称
- String className = netModel.getClassName();
- //参数类型
- String[] types = netModel.getTypes();
- //参数
- Object[] args = netModel.getArgs();
- /*这里简单通过Map来做接口映射到实现类,从map中取
- Map<String, String> map = new HashMap<String,String>();
- map.put("org.Simple.API.HelloService", "org.Simple.S.HelloServiceImpl");
- Class<?> clazz = Class.forName(map.get(className));
- */
- //也可以把这个键值放到配置文件下,通过配置文件读取
- Class<?> clazz = Class.forName(getPropertyValue(className));
- Class<?> [] typeClazzs = null;
- if(types!=null) {
- typeClazzs = new Class[types.length];
- for (int i = 0; i < typeClazzs.length; i++) {
- typeClazzs[i] = Class.forName(types[i]);
- }
- }
- Method method = clazz.getMethod(netModel.getMethod(),typeClazzs);
- //方法调用 参数
- Object object = method.invoke(clazz.newInstance(), args);
- byte[] byteArray = SerializeUtils.serialize(object);
- return byteArray;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
Java 简单的rpc 一的更多相关文章
- Java简单的RPC实现(一)
RPC使用java最基本的,传输层使用Socket,序列化使用Serializable,java 动态代理模式,但是未实现消息注册等相关信息 大道至简 server端 package com.rpc. ...
- Java 简单的RPC 实现
借用了网上某大神的例子.... 目录结构是这样的... RpcFramework 主要是两个方法.一个是暴露服务,一个为引用服务.暴露服务的主要作用是声明一个接口的实现类.可以通过socket 远程调 ...
- 分布式架构的基石.简单的 RPC 框架实现(JAVA)
前言 RPC 的全称是 Remote Procedure Call,它是一种进程间通信方式.允许像调用本地服务一样调用远程服务. 学习来源:<分布式系统架构:原理与实践> - 李林锋 1. ...
- Java实现简单的RPC框架(美团面试)
一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用) ...
- Java使用Netty实现简单的RPC
造一个轮子,实现RPC调用 在写了一个Netty实现通信的简单例子后,萌发了自己实现RPC调用的想法,于是就开始进行了Netty-Rpc的工作,实现了一个简单的RPC调用工程. 如果也有兴趣动手造轮子 ...
- 最简单的RPC框架实现
通过java原生的序列化,Socket通信,动态代理和反射机制,实现一个简单的RPC框架,由三部分组成: 1.服务提供者,运行再服务端,负责提供服务接口定义和服务实现类 2.服务发布者,运行再RPC服 ...
- Java自带RPC实现,RMI框架入门
Java自带RPC实现,RMI框架入门 首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种 ...
- 面试题思考:Java RMI与RPC,JMS的比较
RPC:(Remote Procedure Call) 被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异. 支持多语言 RMI:(Remote Method Invo ...
- 如何实现一个简单的RPC
在如何给老婆解释什么是RPC中,我们讨论了RPC的实现思路. 那么这一次,就让我们通过代码来实现一个简单的RPC吧! RPC的实现原理 正如上一讲所说,RPC主要是为了解决的两个问题: 解决分布式系统 ...
随机推荐
- php 替换二维数组的 key
php 替换二维数组中的 key // 需要替换 key 的数组 $arr_old = array( '0' => array('id' => 1, 'name' => 'Carro ...
- Linux.Centos安装scp反复失败的解决方式
现象 在A服务器用scp命令从B服务器拉文件时, 报找不到scp指令的错误 在A服务器运行 scp --help 发现是有指令的 在B服务器上 常规方式, 安装openssh-clients yum ...
- Go语言第一深坑:interface 与 nil 的比较
interface简介 Go 语言以简单易上手而著称,它的语法非常简单,熟悉 C++,Java 的开发者只需要很短的时间就可以掌握 Go 语言的基本用法. interface 是 Go 语言里所提供的 ...
- Android 获得手机屏幕真实的宽高
http://stackoverflow.com/questions/1016896/get-screen-dimensions-in-pixels WindowManager w = activit ...
- 浅谈压缩感知(十九):MP、OMP与施密特正交化
关于MP.OMP的相关算法与收敛证明,可以参考:http://www.cnblogs.com/AndyJee/p/5047174.html,这里仅简单陈述算法流程及二者的不同之处. 主要内容: MP的 ...
- 【Linux】Cent OS 虚拟机开机自启动配置
一次断电,导致实体机关机了,虚拟机也连不上去,只好手动来起来. 我想增加一下自启动,让硬件开机的时候,自动启动虚拟机: 其实是有办法的,尝试了一下,也成功了,这里简单标记下. virsh autost ...
- 基于Python3.6使用Django框架连接mysql数据库的驱动模块安装解决办法
解决办法1 使用PyMySQL模块,直接使用pip install pymysql即可. 参考文章:https://www.cnblogs.com/wcwnina/p/8719482.html 原文内 ...
- 11G新特性 -- flashback data archive(1)
虽然可以依赖undo数据来查询row的旧版本数据,甚至可以执行逻辑恢复.但是你不能期待在undo中找到非常旧的数据.undo数据主要是用来提供读一致性. 在11G中,提供了Flashback Data ...
- 借着Python-3来聊聊utf-8字符集
[关于文本文件] 文本文件也是以二进制序列的方式保存在磁盘中的,磁盘并不能保存文本:我们打开文本文件的时候之所以能看到文字,是因为 软件根据文件所用编码的字符集对文件进行解码的原因. [以utf-8字 ...
- ipa重签名
为什么要研究重签名问题?将程序打包成ipa包后,ipa包中会包含Provisioning Profile和_CodeSignature等文件,里面包含了对整个ipa的签名信息. 一旦改动ipa中的不论 ...