小标
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
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号