RMI应用过程中的问题

RMI远程方法实现 RMI远程方法的实现,客户端调用未添加 立即下载

最近闲来无事补充了下自己的短板,学习了下RMI,本来以为很简单的事,没想到遇到几个问题还是花了一段时间,在这记录下,测试demo代码附在后面。

RMI的原理在这不说了,百度或Google很多,只说下遇到的问题,具体问题解决方法我这说的不清楚也可以Google下。

说明:Centos6是装载VMware虚拟机中的固定IP,防火墙开,网络适配器为桥接模式;Windows10;registry port :1234;socket port:12345(开始不知道有这种端口)。

1、Server和Client运行环境都是Windows,单网卡多网卡运行都正常。

2、Server运行环境都是Windows,Client运行环境是Centos6,单网卡,运行正常。

3、Server运行环境都是Windows,Client运行环境是Centos6,多网卡,运行不正常;

原因:Server运行时使用的ip和Linux使用的ip不在同一个网段下,解决方法:指定Server的hostname:java.rmi.server.hostname=要绑定的ip

4、Server运行环境是Centos6,Client运行环境是Centos6或Windows,运行不正常;

    ①注册端口1234没有放开,报

java.rmi.ConnectIOException: Exception creating connection to: 192.168.1.16; nested exception is:
        java.net.NoRouteToHostException: No route to host (Host unreachable)

或java.rmi.ConnectException: Connection refused to host: 192.168.1.16; nested exception is:
        java.net.ConnectException: Connection timed out: connect;服务器开放端口1234;

②服务器端没有指定hostname,java.rmi.server.hostname=服务器的ip或者机器名,如果指定是机器名的话需要将机器名对应的ip写入在Client的hosts文件里。可以指定-D 或catalina_Opts或代码中加入System.setProperty("java.rmi.server.hostname", "服务器的ip或者机器名")

③数据传输Socket端口12345没有开放,放开12345端口即可。根据错误日志,可以看出Client和Server也是通过Socket来传输数据的。此处Socket端口默认是随机的,每次服务端启动时端口可能是变化的,所以如果防火墙启动的话最好在代码中指定。主要在这花的时间比较长,因为根据异常从网上找的信息大多是指定hostname,就一直在这纠结了。关闭防火墙后好使,根据netstat命令一看果然两个端口。还是对RMI内部机制不熟悉导致。

异常信息:

java.rmi.ConnectException: Connection refused to host: 192.168.1.16; nested exception is:
        java.net.ConnectException: Connection timed out: connect
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
        at sun.rmi.server.UnicastRef.invoke(Unknown Source)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
        at com.sun.proxy.$Proxy0.sayHello(Unknown Source)
        at com.springmvc.rmi.RMIClient.main(RMIClient.java:18)
Caused by: java.net.ConnectException: Connection timed out: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)
        at java.net.Socket.<init>(Unknown Source)

        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
        ... 8 more


解决以上问题后:

Server端:

[root@localhost Desktop]# java -jar -Djava.rmi.server.hostname=rmi rmiserver.jar
输入ip(localhost输入1):
1
rmi://localhost:1234/irmi
>>>>>>远程RMI绑定成功

Client端:

[root@rmi demo]# java -jar rmiclient.jar
输入ip:
192.168.1.16
和服务器说点话:
你好
ip:192.168.1.15-->client:你好,给你7

Server端:

[root@localhost Desktop]# java -jar -Djava.rmi.server.hostname=rmi rmiserver.jar
输入ip(localhost输入1):
1
rmi://localhost:1234/irmi
>>>>>>远程RMI绑定成功
host:192.168.1.15
ip:192.168.1.15-->welcome:你好


OK!


以下是测试Demo代码:

Client:

package com.springmvc.rmi;

import java.io.IOException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.util.Scanner;

public class RMIClient {
    public static String url = "rmi://%s:1234/irmi";

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        try {
            System.out.println("输入服务器ip:");
            url = String.format(url, s.next());
            IRMIInterface irmi = (IRMIInterface) Naming.lookup(url);
            System.out.println("和服务器说点话:");
            irmi.sayHello(s.next());
            System.out.println(irmi.getSomeThing("client"));
        } catch (NotBoundException | IOException e) {
            e.printStackTrace();
        } finally {
            s.close();
        }
    }
}

Server:

package com.springmvc.rmi;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.RMISocketFactory;
import java.rmi.server.ServerNotActiveException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Scanner;

/**
 * 服务器端
 *                       
 * @Filename: RMIServer.java
 * @Version: 1.0
 * @Author: yanrp
 * @Email: 
 *
 */
public class RMIServer extends UnicastRemoteObject implements IRMIInterface {
    public static String      url              = "rmi://%s:1234/irmi";
    /**
     *Comment for <code>serialVersionUID</code>
     */
    private static final long serialVersionUID = -7279580357318512456L;

    protected RMIServer() throws RemoteException {
        super();
    }

    @Override
    public void sayHello(String name) throws RemoteException {
        try {
            String host = getClientHost();
            String ip = InetAddress.getByName(host).getHostAddress();
            System.out.println("host:" + host);
            System.out.println("ip:" + ip + "-->welcome:" + name);
        } catch (ServerNotActiveException | UnknownHostException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String getSomeThing(String name) throws RemoteException {
        String ret = "";
        try {
            String ip = InetAddress.getByName(getClientHost()).getHostAddress();
            ret = "ip:" + ip + "-->" + name + ":你好,给你" + (int) (Math.random() * 100);
        } catch (UnknownHostException | ServerNotActiveException e) {
            e.printStackTrace();
        }
        return ret;
    }

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        try {
            System.out.println("输入ip(localhost输入1):");
            String ip = s.next();
            if ("1".equals(ip)) {
                ip = "localhost";
            }
            url = String.format(url, ip);
            System.out.println(url);
            //System.setProperty("java.rmi.server.hostname", "192.168.1.15");
            CustomRMISocketFactory socketFactory = new CustomRMISocketFactory(12345);
            RMISocketFactory.setSocketFactory(socketFactory);
            IRMIInterface irmi = new RMIServer();
            LocateRegistry.createRegistry(1234);
            Naming.bind(url, irmi);
            System.out.println(">>>>>>远程RMI绑定成功");
        } catch (AlreadyBoundException | IOException e) {
            e.printStackTrace();
        } finally {
            s.close();
        }
    }
}

/**
 * SocketFactory 指定Socket端口工厂类
 *                       
 * @Filename: RMIServer.java
 * @Version: 1.0
 * @Author: yanrp
 * @Email: 
 *
 */
class CustomRMISocketFactory extends RMISocketFactory {
    private int p;

    CustomRMISocketFactory(int port) {
        this.p = port;
    }

    @Override
    public Socket createSocket(String host, int port) throws IOException {
        if (port == 0) port = this.p;
        return new Socket(host, port);
    }

    @Override
    public ServerSocket createServerSocket(int port) throws IOException {
        if (port == 0) port = this.p;
        return new ServerSocket(port);
    }

}

Interface:
package com.springmvc.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;
/**
 * 开放接口
 *                       
 * @Filename: IRMIInterface.java
 * @Version: 1.0
 * @Author: yanrp 
 * @Email: 
 *
 */
public interface IRMIInterface extends Remote {
    void sayHello(String name) throws RemoteException;

    String getSomeThing(String name) throws RemoteException;
}


程序员必备75道逻辑思维题(附答案)之二 逻辑训练 身为一个大数据工程师,平时的算法训练还是不能少的,今天给大家看几道我曾经看到的逻辑思维题觉得很好,想分享一下。 【6】一个球、一把长度大约是球的直径2/3长度的直尺.你怎样测出球的半径?方法很多,看看谁的比较巧妙 【7】五个大小相同的一元人民币硬币。要求两两相接触,应该怎么摆? 【8】猜牌问题 S先生、P先生、Q先生他们知道桌子的抽屉里有16张扑克牌:红桃A、Q、4 黑桃J、8、4、2、... 阅读详情

相关推荐

AIStarter避坑指南:Wan2.2 Animate整合包从下载到出片的完整流程(附常见错误修复)

本文提供了Wan2.2 Animate整合包从下载部署到生成高清视频的完整避坑指南。详细解析了通过AIStarter启动、环境配置、核心参数调优以及七大常见错误(如CUDA内存不足、节点缺失、视频模糊等)的根因与修复方案,帮助用户高效利用ComfyUI工作流,稳定生成720P高质量AI动画视频。

weixin_29052717的博客 704

Java RMI 实现远程连接服务器的配置方法

错误特征:java.rmi.ConnectException: Connection refused to host: 192.168.0.3; nested exception is: java.net.ConnectException: Connection timed out: connect at sun.rmi.transport.tcp.TCPEndpoint.newSocket(U...

JianguoChow的博客 1万+

使用循环神经网络预测温度

简介 本文以天气时间序列数据集为例,讨论如何使用深度学习模型预测未来天气温度。 使用的是由德国耶拿马克思普朗克生物地球化学研究所的气象站记录。 数据每10分钟记录一次,共记录14种不同的量,如气温、气压、湿度、风向等,原始数据可追溯到2003年,本例只使用2009-2016年的数据。 数据 下载并解压数据略。 加载数据: data_dir = r'E:\practice\tf2\temperature' fname = os.path.join(data_dir, 'jena_climate_2009_

guotianqing的博客 5282

使用Java RMI时要记住的两件事

这是一篇简短的博客文章,介绍使用Java RMI时应注意的两个常见陷阱。 设置java.rmi.server.hostname 如果您感到陌生,Connection拒绝托管: RMI客户端上的错误消息,并且您确定连接应该正常工作(您仔细检查了所有标准配置,例如网络配置等)。RMI系统属性java.rmi.server.hostname值得研究。 要在远程对象上调用方法,RMI客户端...

最佳 Java 编程 3480

MATLAB图像去噪实战:如何用巴特沃斯滤波器完美去除横条纹(附完整代码)

本文详细介绍了如何使用MATLAB中的巴特沃斯滤波器有效去除图像中的横条纹噪声。通过频域分析和滤波处理,结合完整的代码示例,帮助读者掌握从噪声分析到参数优化的全流程技术,实现高质量的图像去噪效果。

weixin_30566063的博客 562

“华为”云桌面系统声音比较小,如何调大?

调整操作系统声音 开启云桌面,登录账户之后,进入操作系统,鼠标左键点击右下角的声音图标,把声音调到最大(如下图); 可以考虑使用浏览器在线听音乐,确定声音的音量! 如果只是耳麦声音小,可以鼠标右键点击声音图标,选择录音设备(R),如下图: 点击“录音设备(R)”后进入,鼠标右键点击“麦克风”选择属性,将侦听级别调至最大,确定! 调整华为云终端声音(软设置) 将鼠标移至桌面的顶端中间位置,打开如下图的样式图标,鼠标左键点击“主页”; 点击“主页”之后,将回到云桌面的终端操作界面,

shunchang的专栏 2336

java.rmi.server_为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname

之前总结了 jmeter 分布式测试的过程,在部署过程中提到,要在 system.properties中配置自己的 IP。至于为什么要这么做,源于这一次 debug 的过程。运行环境mint, ubuntu 两台主机作为 master 节点,一台 win server 作为 slave 节点,采用分布式的方式,对 target 进行测试。问题问题很奇怪,以 mint 系统作为 master,调度分...

weixin_35761094的博客 1492

告别效率低谷:用ADS仿真手把手教你设计高回退Doherty功放(附1:2非对称案例)

本文详细解析了如何使用ADS仿真设计高回退Doherty功放,特别针对1:2非对称架构进行深入探讨。通过优化功率分配比、峰值管开启阈值等关键参数,显著提升功放在9dB回退点的效率至75%以上,适用于LTE等高PAPR信号场景。文章还提供了ADS仿真环境搭建、参数优化及工程化设计的实用技巧。

weixin_33743248的博客 453

Java RMI 学习笔记

前言 开始学习一下Java中RMI的相关知识。RMI是我目前为止学起来比较难的一块,主要的原因就是一我没学过计网,对于这种通信相对来说有点陌生,很多文章后面的抓包分析我也看不懂。二就是初学Java,很多东西不了解,也不太懂怎么去看底层的东西。三就是很多文章涉及到了攻击还有反序列化这方面,目前还没接触过,所以也看不太懂。 因此目前更多的是了解,关于更多的细节我没有去接触,不好高骛远,等慢慢对Java接触的多了,再回来把这些基础更深入的了解一波。说简单一点就是,目前的学习,是从使用的角度来学习。以后再来从源码分

feng的博客 997

VSCode + QMT 量化交易完整解决方案!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1327

YOLOv8【第一章:基础入门篇·第1节】一文搞定,核心架构深度解析与环境配置!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 2103

RPC框架-RMI

RMI(Remote Method Invocation)是Java语言中的一种RPC实现,它允许Java程序调用位于其他虚拟机中的Java对象上的方法。RMI的设计目标是通过对远程对象的调用,像处理本地对象一样处理远程对象,使分布式计算的复杂性对开发者透明化。远程对象:远程对象是一个可以通过网络进行调用的对象。它的类必须实现接口,并通过类导出。远程接口:远程对象实现的接口必须继承Remote接口,接口中的每个方法必须抛出。客户端与服务端:RMI框架将远程对象的调用划分为客户端和服务端两部分。

Flying_Fish_roe的博客 1419

AutoSAR EcuM系列01- EcuM模块的功能概述和变体类型

在【ECU的软硬件架构】文章中我们了解ECU的功能和组成,那么ECU具体是怎么启动的呢?我们知道,AutoSAR标准架构有三层,即APPL应用层、RTE层和BSW层。而这些层又被进一步划分为更多单独的组件,如BSW层可能有80多个组件。在ECU启动时,这些组件必须相互交互,有时也必须以某种顺序交互。这些组件的启动顺序由ECU管理器模块或EcuM处理。EcuM负责整个ECU的初始化和去初始化,包括对一些系统模块如。......

1766

RMI概要介绍

今天看完了RMI,然后动手写了一个例子.简单说,实现RMI还是挺麻烦的.需要一个服务器,一个客户端.服务器上至少需要写两份代码,一份是注册服务,一份是实现服务,        举个例子:        我想从一台机器访问服务器,执行一个查询火车时刻的操作,那么,这个服务就是"查询火车时刻".        注册服务,就是完成向服务器声明"我有查询火车时刻的功能"这一步;         实现服

clariones的专栏 845

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Troubles in RMI

  前几天把一个RMI应用迁移到新的机器,之前这个应用运行在一台增强版的PC上。新机器上面的环境“理论上”跟以前的环境是一样的,至少我是这样要求服务器管理员的。用同样的shell启动应用,问题发生了,应用并没像在之前的环境那样正常的运行,查log发现报RMI Exceptionjava.rmi.ServerException: RemoteException occurred 

i love this game 1588

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JAVA RMI 阿里云服务器连接超时问题

需求,A应用、B应用进行通讯,使用rmi,在本地测试完毕,部署到阿里云服务器。一直报如下错: java.rmi.ConnectException: Connection refused ... 查找资料后,发现:rmi有两个端口,一个是服务注册端口(默认1099),一个是通讯端口(不指定的话,随机分配) 解决方案: 在rmi服务端新增SMRMISocket 类 public class SMRM...

真正的大师永远怀着一颗学徒的心 1361

java rmi 包,如何找到java.rmi包的罐子

I am developing an Android application which needs some rmi stuff since Android doesn't support rmi by default i found this project can be used to bundle the rmi package with my Android application bu...

weixin_35452206的博客 204

对RMI常见问题的总结

          由于项目需要使用RMI,前段时间研究了下RMI,RMI在整个J2EE体系中还算比较复杂的。现对碰到过的问题进行一个总结。 我在研究rmi时,运行环境说明: weblogic服务器下的EJB调用另外一台服务器的远程接口。 遇到的问题以及解决办法: 一、java.security.AccessControlException: access denied (java.net.Soc...

book_strawren的博客 270

spring整合rmi使用

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34072458的博客 109

RMI简单入门示例的部分问题

近日在需要用到RMI,在网上找到不少RMI简单程序的例子下面这个例子是比较通用的,也不知道谁是原创了,不管如何在哪儿看见就给哪儿的链接吧。例子链接:http://www.blog.sh/user3/dengbin752/archives/2006/51131.html照折腾了一下午,总是出错,主要在类文件,协议和安全定义文件出了些问题。现把遇到的问题记录下来,做个补充需要注意的几个

yungle's log 987

远程调用 RPC 和 RMI 如何选择?

「 预计阅读 4分钟 」 旁白:我又来了~ 上一篇:位运算符与(&)、或(|)、异或(^)、非(~)、左移(<<)、右移(>>)、右移补零(>>>)如何选择? 正文 远程调用 远程调用简单来说就是发送一个请求给远程机器,远程机器返回一个结果回来的过程。 为什么要这么做? 单台服务器的性能远远不能满足现在互联网这个体量的用户需求,就好...

良月柒 317

Spring RMI 缺点

说实话用  Spring  来支持 RMI 真的非常easy ,一个月前在一个多 Server 的系统的采用了 Spring ,主要是用他的 IOC , JDBC , RMI  ,本人系统是这样的结构,多个Server 互相通过RMI来进行交互, 这里是  IndexServer 、ReadServer  未采用 Spring ,而ContentServer 采用了 Spring lib ,所以C

2662

RMI基础和例子

一 .RMI概述  RMI(Remote Method Invocation)  RMI是分布式对象软件包,它简化了在多台计算机上的JAVA应用之间的通信。必须在jdk1.1以上  RMI用到的类  java.rmi.Remote 所有可以被远程调用的对象都必须实现该接口  java.rmi.server.UnicastRemoteObject 所有可以被远程调用的对象都必须扩展该类

zyd8505022的专栏 491

java中RMI报错no security manager: RMI classloader disable

前段时间在学习EJB有关的东西( EJB到底是什么,真的那么神秘吗??) 知道EJB都是建立在rmi基础之上的,在网上找到了几篇介绍rmi的, Java RMI之HelloWorld篇 对照上面的文章在本机的eclipse中复制了几个java文件, 测试完全通过. 之后决定尝试下将服务端server放在自己的阿里云主机上,将client放在自己的电脑上, 将eclipse对应目录下

曾经的你 3176

浅谈 RPC、RMI、REST 这些很绕的概念

什么是 RPC RPC(Remote Procedure Call) 翻译过来叫远程过程调用,加上 Protocol 之后也有称之为远程过程调用协议,可以由不同的语言实现,根据维基百科的解释 —— RPC 指在分布式环境下,一个计算机程序能调用另一个不同地址空间里的方法(不同地址空间通常指局域网下的另一台计算机),但是编码的形式就像调用一个本地方法一样,程序员不用去关心背后的细节。 为什么要有...

M_Jack的博客 704

RPC RMI 区别以及在java中的应用

RPC RMI 区别以及在java中的应用

qq_42320804的博客 1669

java RMI原理详解

定义 RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里

xinghun_4的专栏 3万+
上一篇: SQL优化
下一篇: java webservice服务器端获取request对象的三种方式
和泥小工
博客等级 码龄16年 1粉丝 7原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值