Java实现远程访问(RMI-Naming)

Java实现远程访问(RMI-Naming

1,编写服务器接口

新建项目:ITest,编写接口IServer ,有几点有求:

(1)接口必须实现类Remote

(2)接口中的方法必须抛出异常RemoteException

package cn.sun.server;

 

import java.rmi.Remote;

import java.rmi.RemoteException;

 

public interface IServer extends Remote{

int add(int a,int b)throws RemoteException;

}

2,编写实现端

新建项目:ImplTest,编写实现类ServerImpl有几点有求:

(1)实现类必须继承类UnicastRemoteObject  

(2)必须有空的实现且抛出异常RemoteException 

package cn.sun.impl;

 

import java.rmi.RemoteException;

import java.rmi.server.UnicastRemoteObject;

import cn.sun.server.IServer;

 

public class ServerImpl extends UnicastRemoteObject implements IServer {

public ServerImpl() throws RemoteException {

}

public int add(int a, int b) {

return a+b;

}

}

注意:此工程中的接口的实现要依赖于工程ITest中的接口,所以本工程必须从build path中导入工程ITest,具体方法如下:在工程名ImplTest上点击右键选择Build Path,选择Configure Build Path,在Projects这一项中Add项目ITest

3,编写容器端

说明:接口和实现类都是运行在服务器端的,所以要有一个容器来运行接口和实现类,所以也要开启容器的服务。

新建项目:Host,编写容器类Host,开启服务有几个步骤:

(1)通过类LocateRegistry的方法createRegistry(port)来绑定端口

(2)实例化接口IServer iServer = new ServerImpl();

(3)将实例绑定到接服务中,通过Namingrebind("//127.0.0.1:1009/绑定名" , 所绑定的实例)方法实现;

package cn.sun.host;

 

import cn.sun.impl.ServerImpl;

import cn.sun.server.IServer;

import java.rmi.Naming;

import java.rmi.registry.LocateRegistry;

public class Host {

public static void main(String[] args)throws Exception

{

LocateRegistry.createRegistry(1009);//绑定端口

IServer iServer = new ServerImpl();

Naming.rebind("//127.0.0.1:1009/iServer" , iServer);

}

}

注意:此工程中的容器的实现要依赖于工程ITest中的接口和工程ImplTest中的实现类,所以本工程必须从build path中导入工程ITest和工程ImplTest,具体方法跟上面类似。

4,编写客户端

说明:客户端是运行在客户端服务器的,所以对于服务器上的程序要进行远程访问。

新建项目:Client,编写客户端类Client,实现远程访问有几个步骤:

(1)通过Naming类的lookup(//IP:port/绑定名)方法来远程获取接口的实例

(2)通过接口的实例就可以调用接口实现中的方法

package cn.sun.client;

import java.rmi.Naming;

import cn.sun.server.IServer;

public class Client {

public static void main(String [] args)throws Exception

{

IServer iServer = (IServer)Naming.lookup("//127.0.0.1:1009/iServer");

System.out.println(iServer.add(5, 6));

}

}

注意:此工程中的远程访问的实现只需依赖于工程ITest中的接口,所以本工程必须从build path中导入工程ITest,具体方法跟上面类似。

5,程序的运行

(1)运行Host工程中的Host类中的main方法(开启服务器端容器的服务)

(2)运行客户端

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java RMI(Remote Method Invocation)允许开发者在Java应用程序之间创建可跨越网络的远程对象,以实现分布式计算。以下是一个简单的步骤概述: 1. **定义接口**[^2]: 开发者首先定义一个接口(`MyRemoteInterface.java`),这个接口将在远程端实现并暴露给客户端。 ```java public interface MyRemoteInterface { String echo(String message); } ``` 2. **实现接口**: 在服务器端,实现这个接口并注册到RMI registry(默认端口1099): ```java Server server = UnicastRemoteObject.exportObject(new MyServiceImpl(), 0); // 注册服务 Naming.bind("rmi://localhost/myService", server); // 在registry中绑定服务名 ``` 这里,`MyServiceImpl`是接口`MyRemoteInterface`的实际实现。 3. **启动服务器**[^1]: 启动RMI服务器,通常会监听指定端口并等待客户端连接。 4. **客户端调用**: 客户端通过`Naming.lookup()`找到服务器地址,并使用反射调用远程方法: ```java try (Registry registry = LocateRegistry.getRegistry("localhost", 1099); MyRemoteInterface service = (MyRemoteInterface) Naming.lookup("rmi://localhost/myService")) { String response = service.echo("Hello from client"); System.out.println(response); } ``` 客户端向服务器发送请求(如echo "Hello"),服务器接收到请求后返回响应。 注意,为了安全起见,在实际生产环境中,应该限制RMI服务器的访问,仅允许来自信任源的客户端连接,并使用安全措施保护序列化数据,防止远程代码执行漏洞(CVE-2018-11774)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值