Tag: rmi

将RMI限制为一个端口的含义

我希望能够将我的应用程序使用的端口限制为一些尽可能小的已知集。 该应用程序使用Java RMI与远程服务器通信。 注册表在端口1099上导出,这是标准的。 但是,看起来用于导出各种远程对象的端口并不总是一致的,尽管它在短时间内在多个连接中保持相同。 我没有受过教育的猜测是,在幕后进行的某种服务器套接字的缓存导致了这种情况。 我希望能够确保连接总是在几个众所周知的端口上发生,因此安装客户端应用程序的用户必须在防火墙中打开尽可能少的端口。 似乎我可以通过将RMISocketFactory更改为自定义实现并覆盖createServerSocket方法以始终使用已知端口来实现此目的。 但是,这提出了一些问题: 这对可扩展性有何影响? 如果我知道一次只能连接一个人,但是它不会阻止多个同时连接,这听起来很棒吗? 是否可以将这些远程对象与注册表绑定在同一端口上? 我的直觉说不,因为端口已经被createRegistry调用绑定了。 还有其他我不知道的含义吗?

如何快速学习Java RMI

我有一个Java应用程序,我已经工作了一两年了。 我想创建一个非常简单的集合(可能会增加以后的复杂性),我可以用来从另一个JVM(例如MATLAB)控制我的Java应用程序。 我假设RMI是最好的方法,但我不确定,因为我几乎一无所知。 快速学习RMI的最佳方法是什么? 假设我想使用这样的界面: interface Application { public void setLoggingEnabled(boolean enable); public boolean isLoggingEnabled(); } 如何使用RMI在此接口上实现两个JVM之间的桥接? 关于阻塞/线程/同步,我需要了解什么才能使其工作?

如何远程关闭Java RMI服务器

我有一个非常简单的Java RMI服务器,如下所示: import java.rmi.*; import java.rmi.server.*; public class CalculatorImpl extends UnicastRemoteObject implements Calculator { private String mServerName; public CalculatorImpl(String serverName) throws RemoteException { super(); mServerName = serverName; } public int calculate(int op1, int op2) throws RemoteException { return op1 + op2; } public void exit() throws RemoteException { try{ Naming.unbind(mServerName); System.out.println(“CalculatorServer exiting.”); } catch(Exception e){} […]

以编程方式授予权限,而不使用策略文件

如何以编程方式将AllPermissions授予RMI应用程序而不使用策略文件? 更新: 经过一番研究,我编写了这个自定义策略类并通过Policy.setPolicy(new MyPolicy())安装它。 现在我收到以下错误: 无效权限:(java.io.FilePermission \ C:\ eclipse \ plugins \ org.eclipse.osgi_3.7.0.v20110613.jar read class MyPolicy extends Policy { @Override public PermissionCollection getPermissions(CodeSource codesource) { return (new AllPermission()).newPermissionCollection(); } }

Java RMI教程 – AccessControlException:拒绝访问(java.io.FilePermission

昨天我试着开始使用Java RMI。 我找到了这个sun教程( http://java.sun.com/docs/books/tutorial/rmi/index.html )并从服务器实现开始。 但每次我启动程序(rmiregistry正在运行)时,我会得到一个带有以下StackTrace的AccessControlException: LoginImpl exception: java.security.AccessControlException: access denied (java.io.FilePermission \\\C\ProjX\server\serverProj\bin\usermanager read) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) at java.security.AccessController.checkPermission(AccessController.java:427) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkRead(SecurityManager.java:871) at java.io.File.exists(File.java:700) at sun.net.www.protocol.file.Handler.openConnection(Handler.java:80) at sun.net.www.protocol.file.Handler.openConnection(Handler.java:55) at java.net.URL.openConnection(URL.java:943) at sun.rmi.server.LoaderHandler.addPermissionsForURLs(LoaderHandler.java:1020) at sun.rmi.server.LoaderHandler.access$300(LoaderHandler.java:52) at sun.rmi.server.LoaderHandler$Loader.(LoaderHandler.java:1108) at sun.rmi.server.LoaderHandler$Loader.(LoaderHandler.java:1089) at sun.rmi.server.LoaderHandler$1.run(LoaderHandler.java:861) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.server.LoaderHandler.lookupLoader(LoaderHandler.java:858) at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:541) at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628) at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294) at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238) at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1494) […]

Java RMI:rmic编译器生成的stub-skeleton的作用是什么

我目前正在学习Java RMI(远程方法调用),我在其网站上遵循了Oracle提供的教程。 不过我有一个特别的问题: rmic生成的stub-skeleton的用途是什么? 我真的需要它吗?

是否可以中断Java RMI调用?

我们正在做一些原型设计工作,我们想知道是否有可能中断执行RMI调用的线程。 如果我们在这个线程上调用interrupt(),它会抛出一个InterruptedException吗? (或应该?)我们的测试目前显示它没有。 只是想知道它应该如何。

Java RMI资源

大家好,我目前正在开展一个涉及广泛使用Java RMI的项目,我想知道是否有人知道有关它的任何好资源。 我目前发现的材料问题是它通常已经过时(如Java 1.3)和/或半完成。 我甚至乐意买一本关于它的书,但在亚马逊上看,所有的书都像7岁。 因此,如果有人知道任何好的资源,书籍或良好的示例实现,我将非常有兴趣了解它们。 在此先感谢您的帮助。

是否可以在没有外部类的情况下序列化匿名类?

我在网上进行了一项小型研究并审查了该网站上的相关主题,但答案是矛盾的:有些人说这是不可能的,有些人说这是可能的,但很危险。 目标是将匿名类的对象作为RMI方法的参数传递。 由于RMI要求,此类必须是可序列化的。 这没问题,很容易使类Serializable。 但我们知道内部类的实例包含对外部类的引用(而匿名类是内部类)。 因此,当我们序列化内部类的实例时,外部类的实例被序列化以及字段。 这里是问题出现的地方:外部类不可序列化,更重要的是 – 我不想序列化它。 我想要做的只是发送匿名类的实例。 简单示例 – 这是一个RMI服务,其方法接受Runnable: public interface RPCService { Object call(SerializableRunnable runnable); } 以下是我想要调用该方法的方法 void call() { myRpcService.call(new SerializableRunnable() { @Override public Object run { System.out.println(“It worked!”); } } } 正如您所看到的,我想要做的是向另一方发送“操作” – 系统A描述应该在系统B上运行的代码。这就像用Java发送脚本一样。 如果可能的话,我可以很容易地看到一些危险的后果:例如,如果我们从Runnable访问字段或捕获外部类的最终变量 – 我们将遇到麻烦,因为调用者实例不存在。 另一方面,如果我在Runnable中使用安全代码(编译器可以检查它),那么我没有看到禁止此操作的原因。 因此,如果有人知道,如何在匿名类中正确覆盖writeObject()和readObject()方法或如何引用外部类transient或解释为什么在java中不可能,它将非常有用。 UPD另一个需要考虑的重要事项:外部类不存在于将执行该方法的环境中(系统B),这就是为什么应该完全排除有关它的信息以避免NoClassDefFoundError 。

服务器通过RMI没有注册表

我有一个可以通过RMI连接的服务对象。 目前我这样做: 服务器 Registry r = LocateRegistry.createRegistry(1234); r.bind(“server”, UnicastRemoteObject.exportObject(remoteServer, 0)); 客户 RemoteServer s = LocateRegistry.getRegistry(“example.com”, 1234).lookup(“server”); 服务器上的注册表只有一个用途,用于链接到单个服务器对象。 我想我也可以在服务器上这样做: UnicastRemoteObject.exportObject(remoteServer, 1234); 但那我将如何从客户端连接到服务器对象?