在项目中使用rmi,发布到linux,unix,由于开了防火墙。需要配置防火墙端口。刚开始配置了一个固定端口,死都连接不通,后来同netstat -antup |grep pid 查看进程监听的端口,,发现原来rmi有2个端口一个是固定的。一个是随机的。
RMI之所以使用的范围受限制主要有两方面原因,其一:必须要是java,平台的异构性受到限制;其二:穿越防火墙不方便。这里主要谈谈RMI如何通过固定分配端口来穿越防火墙。 RMI穿越防火墙不方便主要是因为除了RMI服务注册的端口(默认1099)外,与RMI的通讯还需要另外的端口来传送数据,而另外的端口是随机分配的,所以要想RMI的客户能通过防火墙来与RMI服务通讯,则需要能让随机分配的端口固定下来,具体做法如下:
1、增加一个文件SMRMISocket.java
- import java.rmi.server.*;
- import java.io.*;
- import java.net.*;
- publicclass SMRMISocket extends RMISocketFactory {
- public Socket createSocket(String host, int port) throws IOException{
- returnnew Socket(host,port);
- }
- public ServerSocket createServerSocket(int port) throws IOException {
- if (port == 0)
- port = 10990; //不指定就随机分配了
- returnnew ServerSocket(port);
- }
- }
import java.rmi.server.*; import java.io.*; import java.net.*; public class SMRMISocket extends RMISocketFactory { public Socket createSocket(String host, int port) throws IOException{ return new Socket(host,port); } public ServerSocket createServerSocket(int port) throws IOException { if (port == 0) port = 10990; //不指定就随机分配了 return new ServerSocket(port); } }
2、在实例化UnicastRemoteObject的子类前加入一下代码:
- try {
- RMISocketFactory.setSocketFactory(new SMRMISocket());
- } catch (Exception ex) {
- }
相关推荐
在"Rmi示例 Rmi代码示例"中,我们有两个核心文件:RmiServer和RmiClient,分别代表了RMI系统中的服务端和客户端。以下是对这两个文件及其涉及的知识点的详细解释: 1. **RMI服务端**(RmiServer): - **接口定义*...
服务器端主要包含两部分:RMI服务接口和它的实现。服务接口定义了可供客户端调用的方法,而服务实现则是这些方法的具体执行逻辑。Spring会将这个实现注册到RMI注册表中,使得客户端可以通过接口的名称来查找并调用...
下载新的jsk并没有解决我的问题,因为这个jdk也是有问题的,所以下载jdk还是去官网下,可是官网要注册,又是国外网站下载又慢,然后就去下载同学的,然后就出现下一个问题,jdk版本不匹配错误,因为有两个jdk1.8,一...
对象注册表通常运行在一个已知端口上(默认为1099)。服务器启动后,会将对象以文本形式注册到对象注册表中。客户端在调用远程方法之前,必须首先联系对象注册表以获取对远程对象的访问权限。 #### 三、RMI中的对象...
RMI包含两个主要组件:远程接口(Remote Interface)和远程对象(Remote Object)。远程接口定义了远程方法,而远程对象实现了这些接口并提供具体实现。通过RMI,开发者可以轻松地构建分布式系统,使得跨网络的服务...
在两台机器上测试RMI应用程序时,确保防火墙设置正确,允许RMI相关的端口(默认是1099)通信。同时,需要在两台机器上安装JDK,并配置好Java环境。 通过上述步骤,我们可以实现一个简单的RMI“Hello, World”程序,...
在“www.pudn.com.txt”和“rmi”这两个文件中,可能包含了关于RMI的详细教程、代码示例或配置说明。例如,“www.pudn.com.txt”可能是一个文档,详细解释了RMI的概念和如何创建、部署RMI应用程序;而“rmi”可能是...
在IT行业中,远程方法调用(Remote Method Invocation,RMI)和Spring框架是两个非常重要的概念,它们在分布式系统开发中发挥着关键作用。RMI是Java平台提供的一种技术,用于在不同Java虚拟机(JVM)之间进行对象间...
本压缩包提供了两个Java工程示例,帮助开发者了解如何在Spring环境中集成并使用RMI。 首先,让我们理解RMI的基本概念。RMI是Java提供的一种机制,使得一个Java对象能够调用运行在不同JVM上的另一个Java对象的方法。...
这个“基于RMI的远程控制”项目,虽然其界面设计可能不尽如人意,但核心功能是实现了通过网络在两台计算机之间进行交互操作。 RMI的工作原理基于对象的分布式计算模型,它允许一个Java对象调用位于另一台机器上的...
首先,我们来看“SpringRMIClient”和“SpringRMIServer”这两个文件名,它们分别代表了RMI应用中的客户端和服务端。在RMI中,服务端会暴露一些远程接口,这些接口定义了可以在远程系统上执行的方法。客户端则通过...
在"java RMI demo"中,通常包含两个主要部分:rmiclient和rmiserver,分别代表客户端和服务器端。 1. **RMI服务器(rmiserver)**: - **注册表(Registry)**:RMI系统的核心组件,用于存储远程对象的引用。...
默认情况下,RMI使用TCP端口1099,可以通过防火墙策略限制访问。另外,还可以使用SSL/TLS增强通信的安全性。 在实际应用中,RMI常用于构建分布式系统,例如服务器集群管理、分布式数据库系统、分布式计算等。RMI...
**解释**:这里定义了一个名为`AddServer`的接口,继承自`Remote`,其中声明了一个名为`AddNumbers`的方法,接受两个整型参数并返回它们的和。 ##### 2. 服务端实现 ```java import java.rmi.RemoteException; ...
【标签】:“源码”和“工具”这两个标签表明,该压缩包可能包含了框架的源代码,用户可以深入研究其内部工作原理,并且可以将这个框架作为一个实用工具来使用,以便在自己的项目中实现远程方法调用。 【压缩包子...
在这个示例中,客户端通过RMI查找名为"Calculator"的远程对象,然后调用它的`add`方法,计算两个数字的和。服务器端创建并注册了该对象,使得客户端可以跨网络调用。 这个简单的加法示例展示了RPC和RMI的基本使用...
在这个“spring+rmi非本地实现”的项目中,我们有两个主要部分:客户端(client)和服务端(rmiserver)。让我们深入探讨一下这两个部分以及它们如何协同工作。 1. **服务端(rmiserver)**: - **创建RMI接口**:...
4. **生成存根和骨架**:使用`rmic`工具编译`CalculatorImpl`类,该工具会生成两个辅助类`Calculator_stub`和`Calculator_Skel`,分别用于客户端和服务端的远程调用支持。 5. **注册远程对象**:在服务器端,通过`...
首先定义服务端接口 `AddServer`,该接口继承自 `Remote` 接口,并声明了一个远程方法 `addData()` 用于执行两个整数相加的操作: ```java public interface AddServer extends Remote { public int addData(int a...
3. **配置文件**:如`server.properties` 或 `client.properties`,可能包含了RMI注册表的地址和端口等信息。 4. **运行脚本**:用于启动服务器和客户端的脚本,可能涉及启动`rmiregistry`,运行服务器应用程序和...