Tag: rmi

如何确保RMI仅使用一组特定的端口?

在我们的应用程序中,我们使用RMI以非常不同的方式进行客户端 – 服务器通信: 将数据从服务器推送到客户端以进行显示。 从客户端向服务器发送控制信息。 来自那些控制消息的回调代码从服务器返回到客户端的路径(侧边栏注释 – 这是一些遗留代码的副作用,而不是我们的长期意图)。 我们想要做的是确保我们所有与RMI相关的代码仅使用已知的指定端口库存。 这包括注册表端口(通常预期为1099),服务器端口以及回调产生的任何端口。 这是我们已经知道的: LocateRegistry.getRegistry(1099)或Locate.createRegistry(1099)将确保注册表正在侦听1099。 将UnicastRemoteObject构造函数/ exportObject静态方法与port参数一起使用将指定服务器端口。 这些Sun论坛post也涵盖了这些要点。 我们不知道的是:我们如何确保回调产生的客户端连接回服务器只能连接到指定的端口,而不是默认为匿名端口? 编辑:添加了一个很长的答案,总结了我的发现以及我们如何解决问题。 希望这可以帮助其他有类似问题的人。 第二次编辑:事实certificate,在我的应用程序中,我在创建和修改套接字工厂时似乎存在竞争条件。 我本来想让用户在Beanshell脚本中覆盖我的默认设置。 遗憾的是,在工厂创建第一个套接字后,我的脚本似乎正在运行。 结果,我从默认设置和用户设置中获得了混合端口。 将需要做更多的工作,这超出了这个问题的范围,但我想我会指出它是其他可能不得不在某些时候踏上这些水域的人的兴趣点….

服务器重启后重新连接RMI客户端

我有一个RMI服务器和一个桌面RMI客户端。 当我重新启动服务器时,我在客户端遇到错误。 是否可以重新启动RMI连接而无需重新启动客户端? [编辑]这是堆栈跟踪: java.rmi.ConnectException: Connection refused to host: xxx.xxx.xxx.xxx; nested exception is: java.net.ConnectException: Connection refused: connect at …user code… Caused by: java.rmi.ConnectException: Connection refused to host: xxx.xxx.xxx.xxx; nested exception is: java.net.ConnectException: Connection refused: connect at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:574) at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:185) at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:94) at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:179) at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132) at $Proxy0.search(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) […]

如何通过java代码设置JMX远程端口系统环境参数进行远程监控?

我有一个程序,它需要动态(即在运行时)打开一个可用的套接字并在其上启动一个JMX代理。 此JMX参数是在Java代码中设置的,而不是通过命令行设置的。 这很好用。 此后,需要远程通过Java Visual VM监视(即发出JMX命令等) 该程序中的RMI服务器代理在开箱即用管理的路线上描述: http : //download.oracle.com/javase/6/docs/technotes/guides/management/agent.html 我的问题可以概括为:如何通过Java代码将这些命令行属性设置为系统级别,以便可以使用远程分析? -Dcom.sun.management.jmxremote.port=1234 如果通过命令行设置“jmxremote.port”和其他参数,则远程监视工作正常。 我试图通过Java而不是通过命令行找到一种方法。 程序无法通过命令行指定端口,因为必须在运行时计算出新的可用端口。 该过程需要远程监控,并且在本地工作正常。 如果未在命令行中指定以下参数,则Java Visual VM不会连接到该进程。 -Dcom.sun.management.jmxremote.port=1234 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=10.0.0.128 我试过了。 System.setProperty(“com.sun.management.jmxremote.port”,Integer.toString(port)); 这是在启动JMXConnectorServer之前在程序中完成的第一件事。 不幸的是,它不被承认。 只有运行时属性(即通过命令行指定由Java Visual VM识别JMX连接)。 还遇到了可以从java集合类中提取属性的方法,但无法达到如何跟踪属性“com.sun.management.jmxremote.port =” public static void setEnv(Map newenv) throws Exception { Class[] classes = Collections.class.getDeclaredClasses(); Map env = System.getenv(); for(Class cl : classes) { if(“java.util.Collections$UnmodifiableMap”.equals(cl.getName())) { […]

rmi vs servlets vs socket

socket编程,rmi和Servlets之间有什么区别。 什么时候用?

最有效 – 性能明智 – 用于JVM间通信

我有一个Java应用程序,需要在不同进程之间进行通信。 进程可以在相同的JVM或不同的JVM中运行,但可以在同一台机器上运行。 我的应用程序需要向另一个进程(相同或不同的JVM)提交“消息”并忘记它。 类似于IBM“MQ”之类的消息传递队列,但是简单,只使用内存,没有IO到硬盘以获得性能提升。 我不确定Performance prescriptive的最佳方法是什么。 我想知道RMI在性能方面是否有效,我认为它需要一些开销。 那么使用本地主机的TCP / IP套接字呢? 还有其他想法吗?

在Java RMI中,客户端如何知道其服务器已经死机?

目前,我正在开发一个基于Java RMI构建的聊天服务器客户端程序。 为了让客户端检测到其连接的服务器已经死亡,我只能想到两种可能的解决方案,但在我的情况下它们都不能正常工作。 1.等到客户端需要调用服务器的某些方法,这种方式不能很好地工作,因为如果聊天客户端没有调用任何服务器的方法,它就不会知道服务器已经死了,因此聊天客户端无法接收那时候任何新的聊天消息了。 2.每隔几秒钟调用服务器的方法进行例行检查。 但这会带来大量的开销。 这种情况有没有更好的方法? 非常感谢你。

Java RMI代理问题

我收到此错误: java.lang.ClassCastException: $Proxy0 cannot be cast to rmi.engine.Call at Main.main(Main.java:39) 我的Abstract和Call类都扩展了Remote 。 呼叫: public class Call extends UnicastRemoteObject implements rmi.engine.Abstract { public Call() throws Exception { super(Store.PORT, new RClient(), new RServer()); } public String getHello() { System.out.println(“CONN”); return “HEY”; } } 抽象: public interface Abstract extends Remote { String getHello() throws RemoteException; } 这是我的主要内容: public […]

请问java RMI的意义吗?

为什么人们使用RMI,或者什么时候应该使用RMI? 我在oracle的网站上阅读了关于RMI的那些教程。但它没有提供足够的实际例子。 据我了解,软件的模块应尽可能“无关且分离”。 RMI似乎是一个与我高度耦合的例子。 为什么这不是一个糟糕的编码习惯? 我认为客户端应该只发出指令,而对象的所有实际操作都是由服务器完成的。 (我目前正在攻读计算机科学学士学位并且非常缺乏经验,所以如果我理解这些概念错误,请纠正我。) 提前致谢!

将Ruby on Rails项目转换为JRuby on Rails项目

有什么特别的方法可以将Ruby on Rails项目转换为JRuby on Rails项目吗? 现在需要让Rails端通过RMI与Jav​​a服务器通信,因此想知道如何进行转换。 谢谢。

Java RMI + SSL +压缩=不可能!

我已经设置了RMI + SSL。 这很好用。 但似乎不可能在RMI和SSL之间减少压缩。 这样RMI请求在通过SSL发送之前就会被压缩。 我在网上看到一些post建议使用SSLSocketFactory.createSocket() ,它使用Socket将SSL包装在压缩套接字上。 但这似乎会尝试压缩SSL协议本身,这可能不是非常可压缩的。 我想我应该创建一个Socket代理( Socket子类,它推迟到另一个Socket ,就像FilterOutputStream那样)。 让代理用压缩包装输入/输出流。 让我的SocketFactory和ServerSocketFactory返回代理,包装SSLSocket 。 但后来我们遇到了缓冲问题。 压缩缓冲数据,直到它足够值得压缩,或被告知要刷新。 当您没有通过套接字进行来回通信时,这很好。 但是使用RMI中的缓存套接字,你就可以了。 无法识别RMI请求的结束,因此您可以刷新压缩数据。 Sun有一个RMISocketFactory示例做这样的事情,但他们根本没有解决这个问题。 笔记: 1. SSL支持压缩,但我在JSSE中找不到任何关于启用它的信息 2.我知道对许多小的无关块进行压缩(因为RMI通常由其组成)并不是非常有益。 3.我知道如果我发送大量请求,RMI不是最好的选择。 4. Java 6中有一个SSLRMISocketFactory ,但它不会在我的自定义实现中添加任何内容。