【云计算】javaRMI解析
小标 2019-01-07 来源 : 阅读 1328 评论 0

摘要:本文主要向大家介绍了【云计算】javaRMI解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】javaRMI解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

RMI是分布式远程调用的一种技术,当你所有的类和方法在同一个JVM的时候,你直接调用即可,但是当在不同JVM,需要调用不同JVM的方法就需要通过远程调用了。 http通常使用RESTFUL服务来为各个不同系统交互服务,提供一个http地址,带上变量参数去获取别的系统的结果,RMI不同的是走tcp/ip层。


从技术上理解,调用方法先要获得一个对象(反射除外),有了对象就可以调用方法了,就可以调用类的任何方法。所以RMI的技术就是服务端给客户端返回一个对象,然后在客户端你随意调用方法就感觉是在自己的JVM里面。这一切背后的RMI已经帮你处理了。


实现RMI比较简单,一般有以下几个通用流程:


1. 定义一个接口


2. 实现接口


3.注册要访问的服务,曝露你的RMI地址给客户端


4.编写客户端


定义接口:


package com.isesol.rpcServer;

import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.sql.ResultSet;
import java.util.List;

public interface MyRemote extends Remote, Serializable {
 
 
 public List sayHello() throws RemoteException;

}


实现接口,并曝露地址:


package com.isesol.rpcServer;

import java.io.Serializable;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote, Serializable {

 /**
  * 
  */
 private static final long serialVersionUID = 1L;

 protected MyRemoteImpl() throws RemoteException {

 }

 public List sayHello() throws RemoteException {
  // TODO Auto-generated method stub
  List list = new ArrayList();
  String driver = "com.mysql.jdbc.Driver";
  String url = "jdbc:mysql://172.20.30.102:3306/isesol_wis";
  String username = "admin";
  String password = "internal";
  Connection conn = null;
  ResultSet resultSet = null;
  int result = 0;
  try {
   Class.forName(driver);
   conn = DriverManager.getConnection(url, username, password);

   Statement statement = conn.createStatement();

   resultSet = statement.executeQuery("select 1");
   // CallableStatement cstmt = conn.prepareCall("{call
   // getWorkCenterLoad('2018-08-01')}");

   while (resultSet.next()) {

    list.add(resultSet.getString(1));
   }

  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  }

  return list;
 }

 public static void main(String[] args) {
  try {
   MyRemote myRemote = new MyRemoteImpl();
   LocateRegistry.createRegistry(5008);
   Naming.rebind("rmi://172.20.30.102:5008/service", myRemote);
   //Naming.rebind("rmi://172.20.30.102:5008/service1", myRemote1);

  } catch (Exception ex) {

   ex.printStackTrace();
  }
 }

}


上面就是服务端了,启动之后5008端口会启动。客户端实际上并不会与服务端直接沟通,而是与5008端口通信,然后RMI内部会帮请求转给服务端,再返回给客户端。


客户端:


package com.isesol.rmi;


import java.io.Serializable;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import com.isesol.rpcServer.MyRemote;
import com.isesol.rpcServer.MyRemote1;

public class MyRemoteClient implements Serializable{
 
 /**
  * 
  */
 private static final long serialVersionUID = 1L;

 public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException, SQLException{
  
  new MyRemoteClient().go();
  
 }
 
 public void go() throws MalformedURLException, RemoteException, NotBoundException, SQLException{
  
  MyRemote myRemote = (MyRemote) Naming.lookup("rmi://172.20.30.102:5008/service");

  List string = myRemote.sayHello();

  for(int i = 0; i < string.size(); i++){
   
   System.out.println(string.get(0));
   
  }

 }

}


这里有一个问题要注意,客户端其中有一句代码是:


MyRemote myRemote = (MyRemote) Naming.lookup("rmi://172.20.30.102:5008/service");


由于客户端并没有MyRemote接口,因此客户端也需要服务端的接口文件,简单理解就是客户端和服务端要有相同的接口文件。


打包服务端和客户端代码,在命令行测试一下就知道是否能够调用成功了。


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved