这次是用java实现RMI 的远程调用:
编写的过程大致为:
1.首先我们的启动Mysqlserver ,然后再里面建立一个数据库,以便我们在数据库中插入存放学生信息等。
2.先编写一个接口DataServer,并且继承Remote类,然后再接口里面写上服务器端能实现的方法,然后再定义一个类DataServerImpl继承UnicastRemoteObject
在实现接口DataServer,并且一一实现它定义在借口里面得到方法,这里我们重新写了一个类DBManager,用来实现与数据库的连接,包括插入数据,根据学号、姓名等进行查询等操作,其源代码见附件。
3.下面就是需要使用rmic命令进行编译DataServerImpl文件,并且产生两个文件,产生这两个文件后就可以编写服务器端的代码了,主要是在主函数中生成一个DataServerImpl对象,然后在绑定一个端口在程序中,在绑定一个url地址,来绑定服务的对象,这样服务器端的程序就写好了。
4.下面就是写客户端的代码了。
5.首先是通过Naming.lookup(url),(url)就是服务器端指定的url地址这样就可以得到一个DataServer的对象,然后得到这样一个对象后就可以调用它的方法了。这样也就实现了调用远程服务器端的代码了,所以说这样RMI就比本上写完了。
首先是编写远程的接口调用函数:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface DataServer extends Remote {
public void CreateTable() throws RemoteException;
public void insert(int id ,String name,double Score) throws RemoteException;
public double select(int id)throws RemoteException;
public double select (String name)throws RemoteException;
}
由于代码中使用到了与数据库的连接,所以写了一个数据库的管理类,代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBManager {
private static String user = "root";
private static String pass = "123456";
private static String className ="com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/students";
private static Connection conn;
private static java.sql.Statement state;
public static void init()
{
try {
Class.forName(className);
conn = DriverManager.getConnection(url,user,pass);
state =conn.createStatement();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void CreateTable(){
String sql = "create table student (id int Primary key, name char (20),score double);";
try {
state.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void insert(int id,String name,double score)
{
String sql = "insert into student values("+id+",'"+name+"',"+score+");";
try {
state.execute(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static double select(int id)
{
String sql = "select score from student where id = "+id+";";
double result= 0;
try {
ResultSet rs = state.executeQuery(sql);
while(rs.next())
{
result = rs.getDouble("score");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public static double select(String name)
{
String sql = "select score from student where name = '"+name+"';";
double result= 0;
try {
ResultSet rs = state.executeQuery(sql);
while(rs.next())
{
result = rs.getDouble("score");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}
下面就是编写实现类,要继承UnicastRemoteObject,并且实现上面定义的接口。
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class DataServerImpl extends UnicastRemoteObject implements DataServer {
static {
DBManager.init();
}
public DataServerImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
@Override
public void CreateTable() throws RemoteException {
DBManager.CreateTable();
}
@Override
public void insert(int id, String name, double score)
throws RemoteException {
DBManager.insert(id, name, score);
}
@Override
public double select(int id) throws RemoteException {
// TODO Auto-generated method stub
double score = DBManager.select(id);
return score;
}
@Override
public double select(String name) throws RemoteException {
double score = DBManager.select(name);
return score;
}
}
这样就基本上完成了,然后就是编写服务端的代码:
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class RMIServer {
public static void main(String[] args) {
try {
DataServerImpl dataServer = new DataServerImpl();
LocateRegistry.createRegistry(1111); //这里,服务端口号可任意指定
Naming.rebind("//localhost:1111/showScore", dataServer);
System.out.println("服务已经启动。。");
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
使用命令空间绑定服务的地址,以及服务的名称,以便客户端实现远程调用。客户端的代码如下:
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Scanner;
public class RMIClient {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
DataServer dataServer = (DataServer)Naming.lookup("//localhost:1111/showScore");
System.out.println("首先创建一个数据表,student");
dataServer.CreateTable();
System.out.println("创建成功。。");
boolean isrunning = true;
while(isrunning)
{
System.out.println("请您按照数字选择操作。\n1.插入数据 2.按学号查找 3.按姓名查找 0.退出");
int select = sc.nextInt();
if(select == 1)
{
System.out.println("请您依次输入学生的学号、姓名、成绩:");
int num = sc.nextInt();
String name = sc.next();
double score = sc.nextDouble();
dataServer.insert(num, name, score);
}
else if(select == 2)
{
System.out.println("请您输入学生的学号:");
int num = sc.nextInt();
double score = dataServer.select(num);
System.out.println("学号: "+num +" 成绩为: "+ score);
}
else if(select == 3)
{
System.out.println("请您输入学生的姓名:");
String name = sc.next();
double score = dataServer.select(name);
System.out.println("姓名: "+name +" 成绩为: "+ score);
}
else if(select == 0)
{
isrunning = false;
}
else
{
System.out.println("输入有误,请您重新输入!");
}
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NotBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这样就基本上的完成了所有的工作。。。
分享到:
相关推荐
最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程
Java RMI 远程调用实例,各个文件的作用: DISPLAYPERFECTTIME.JAVA|:向rmiregistry查找PerfectTime对象,定义调用远程对象的方法。 PERFECTTIME.JAVA:向RMI注册服务,以便客户端查找,创建提供注册服务的本地...
接下来,`getMemberAccountCount`方法实现了远程调用逻辑,通过`this.ref.invoke`方法调用了远程方法,并处理了可能抛出的异常。 #### 2. 客户端代码分析 客户端通过`Naming.lookup`方法获取远程服务的引用,然后...
实现java RMI 远程调用,包括 RMIServer RMIClient源码,测试用例。
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间透明地调用对象的方法。在RMI架构中,客户端能够像调用本地对象一样调用远程服务器上的对象...
Java远程调用(Remote Method Invocation,RMI)是Java平台中一种重要的分布式计算技术,它允许在不同网络环境中的Java对象之间进行透明的交互。在本文中,我们将深入探讨三种不同的RMI实现方法:原始方式、Spring...
首先,我们需要定义一个实现了`java.rmi.Remote`接口的类,比如`MyRemoteInterface.java`,并在这个接口中声明所有需要远程调用的方法。这些方法必须抛出`java.rmi.RemoteException`,因为网络通信可能会出现异常。...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行方法调用,仿佛这些方法是在本地对象上执行一样。这个技术极大地简化了构建分布式应用的...
1. **创建远程接口**:定义一个继承自Remote的接口,声明需要远程调用的方法。 2. **实现远程接口**:编写一个类实现这个接口,提供具体的方法实现。 3. **注册远程对象**:在服务器端创建远程对象实例,然后将其...
### RMI远程调用代码及使用方法 #### 一、RMI简介 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算技术,它允许开发人员在不同的Java虚拟机(JVM)之间进行对象的远程调用。通过...
这个简单的例子将引导我们了解如何利用Java RMI实现远程调用。 首先,我们要创建远程接口。在Java RMI中,远程接口是一个实现了`java.rmi.Remote`接口的Java接口。接口中声明的方法将在客户端调用,实际上会在...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,就像调用本地方法一样。RMI系统的核心概念是客户端可以调用服务器端的对象上...
总结来说,RMI远程调用是Java实现分布式计算的关键技术,它通过简化网络编程,使开发者能专注于业务逻辑,而非底层通信细节。结合Spring框架,可以进一步提升RMI应用的开发效率和可维护性。在实际项目中,合理利用...
Java 远程方法调用(Java RMI,Remote Method Invocation)是Java平台提供的一种用于构建分布式应用程序的技术。它允许一个对象在某个Java虚拟机(JVM)上执行的方法调用另一个在不同JVM上的对象的方法,仿佛它们是...
1. 远程接口(Remote Interface):定义了可以被远程调用的方法,这些方法必须声明抛出`java.rmi.RemoteException`。接口需要使用`@Remote`注解标记。 2. 远程实现类(Remote Implementation):实现了远程接口,并...
这些方法必须抛出`java.rmi.RemoteException`,因为远程调用过程中可能会出现网络通信问题。例如: ```java public interface MyRemoteInterface extends Remote { void executeCommand(String cmd) throws ...
在这个场景中,“rmi远程调用读取文件”指的是通过RMI机制,使得一个JVM中的程序能够请求另一个JVM上的程序读取并返回文件内容。这种方式在分布式系统中非常常见,可以用于数据共享、文件服务等应用。 RMI的基本...
4. ** stubs 和 skeletons**:在RMI中,远程对象的引用在客户端是通过stubs(桩)表示的,而实际的远程调用则由serverside的skeleton(骨架)处理。现代的JVM已经不再需要手动生成stubs和skeletons,它们由Java...
在提供的`动态代理与RMI远程调用.ppt`中,可能会详细解释这两个概念,通过PPT的讲解和实例,可以更直观地理解动态代理和RMI的工作原理。同时,`src`目录下的源码文件则提供了具体的实现示例,读者可以通过阅读代码,...
在Windows环境下,同样需要JRE,运行客户端程序来执行远程调用。 注意,RMI的安全性、异常处理和网络通信细节也是开发者需要考虑的问题。例如,需要处理可能的`RemoteException`,以及配置JVM的安全策略文件以允许...