首先,我想为这个问题发布一些真正的代码,但我不能,因为它的行太多了。也就是说,我的情况如下:
服务器端
我有一个RMI服务器,它等待客户端自己连接和“注册”,以便服务器可以对客户端进行函数调用。基本上,服务器有一个已发布的函数,其工作原理类似于以下伪代码:
public class Server extends UnicastRemoteObject implements ServerInterface{
public Server(){ /* Server publishes itself here */ }
...
/** One of many methods visible to a remote Client */
public void registerClient(Client c) throws RemoteException{
//1. Make some remote calls on 'c' for book-keeping purposes
//2. Store reference to c to make calls on it later
}
}
客户端
在启动时,Client调用Naming.lookup([url])以获取服务器的存根,我将调用serverRef
,然后调用serverRef.registerClient(this)
。问题发生在服务器的ynsterClient(Client c)
方法的第一行。
问题
当服务器在registerClient方法中对客户端进行第一次远程方法调用时,会引发RemoteException。当客户端和服务器计算机位于同一子网上时,客户端的计算机具有辅助IP地址。所以IP看起来像这样:
服务器计算机IP:123.45.67.1客户端计算机IP:123.45.67.2、192.168.67.2
服务器第一次远程回调客户端时引发的RemoteException表示服务器正在尝试连接到客户端的192.168.67.2地址,这就是导致故障的原因。服务器应尝试连接到123.45.67.1地址。我知道禁用属于第二个IP地址的网络接口可以解决问题,但这对我来说并不是一个真正的选择。
在打开与新客户端html" target="_blank">对象存根的连接时,是否有任何方法“告诉”服务器端RMI要连接的IP地址?
有几种可能的解决方案,包括
>
编写自定义客户端套接字工厂
用java指定地址。rmi。服务器主机名属性
java.rmi.server.hostnameip_address
等
查看此链接:
这些链接也很有用:
>
爪哇rmi-Djava。rmi。服务器hostname=localhost仍然打开一个套接字,侦听0.0.0.0
http://www.chipkillmar.net/2011/06/22/multihomed-hosts-and-java-rmi/4/java-rmi-djava-rmi-server-hostname-localhost-still-opens-a-socket-listening-on
问题内容: 我正在使用RMI编写密码系统的原型。 我有一个问题,因为当我启动两个客户端时,它们从OneTimePad类的服务器中的一个对象获得了响应。 因此客户端A获取为客户端b保留的密钥,由于特定的算法,这种情况不会发生。 服务器仅向客户端发送E和N变量(例如在RSA中),因此我无法序列化OneTimePad对象并通过网络发送它(因为它将具有所有密钥)。 如何为每个客户端创建OneTimePad
我构建了一个基于文件下载器RMI客户端-服务器的应用程序。在这方面,我不了解不同客户端的工作。文件位于服务器端,RMI在其一侧有等效的代理服务器(称为存根)。我为这个应用程序使用了10个客户端和1个服务器。 问题1-我的问题是当多个客户端在从注册表查找后同时进行RMI调用时,客户端以什么顺序为他们播种/提供文件?意味着底层服务算法---? 我无法理解这一点,当我执行代码时,我只看到相应的文件正在同
我正在开发一个具有多个客户端的标准java RMI服务器。这些客户机有一个菜单,在那里他们可以调用服务器为他们做各种事情。 一种方法涉及一个队列,他们可以在其中将作业发送到队列并等待它得到处理。RMI服务器自动为所有客户端处理线程,但当涉及到此方法和队列时,我如何阻止此请求,例如: 首先调用客户端1,然后再调用客户端2(此处客户端1应首先从服务器接收消息,客户端2应等待服务器处理客户端1请求所需的
问题内容: RMI是否自己处理多个客户端?即 是否可以同时使用多个客户端的服务器功能? 如果没有,我该怎么做? 如果是,它如何工作?每次 调用 都会创建一个新线程吗?如果一个客户端阻止了该功能,那么下一个客户端会发生什么?等等 问题答案: 是 这个怎么运作?每次调用都会创建一个新线程吗?如果一个客户端阻止了该功能,那么下一个客户端会发生什么?等等 它为每个客户端连接创建一个线程。 如果一个客户端调
问题内容: 我正在使用JAX-WS,但是在检索消耗Web服务的客户端信息时遇到问题。我已经找到了如何使用JAX-RPC和Apache Tomcat Axis(而不是JAX-WS)来做到这一点。有人对此有想法吗? 问题答案: 那这个呢:
我有一个gRPC客户端调用同一台机器上的服务器,并且客户端代码使用使用以下创建的通道: 这很有效,我得到了预期的回复。 但是,如果我将“localhost”替换为实际的机器名称(FQDN)或IP地址,我会收到一个错误: 我还测试了在远程机器上启动服务器,并在创建通道时让客户端调用该远程机器(通过名称或IP),但遇到了同样的失败。该应用程序是用C#编写的。NET Core 3.2作为控制台应用程序。