【问题标题】:configuring RMI host so that it should know which client port is accessing it配置 RMI 主机,以便它应该知道哪个客户端端口正在访问它
【发布时间】:2015-08-22 12:16:32
【问题描述】:

我一直在做spring RMI,我已经设置了一个主机和一个客户端。

以下是我的主机的代码。我想修改它,使主机应该知道哪个客户端正在访问它,换句话说,服务器应该知道哪个客户端端口正在访问它。

如何在 Spring RMI 中实现这一点?

界面:-

package com.javatpoint;  

public interface Calculation {  
int cube(int number);  
}  

:-

package com.javatpoint;  

public class CalculationImpl implements Calculation{  

    @Override  
    public int cube(int number) {  
        return number*number*number;  
    }  

}  

最后是主机配置xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
http://www.springframework.org/schema/beans/spring-beans.xsd">  

<bean id="calculationBean" class="com.javatpoint.CalculationImpl"></bean>  
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">  
    <property name="service" ref="calculationBean"></property>  
    <property name="serviceInterface" value="com.javatpoint.Calculation"></property>  
    <property name="serviceName" value="CalculationService"></property>  
    <property name="replaceExistingBinding" value="true"></property>  
    <property name="registryPort" value="1099"></property>  
</bean>  
</beans>  

以下是我使用的类

界面:-

package com.javatpoint;

public interface Calculation {
int cube(int number);
}

实现类 :-

public class CalculationImpl implements Calculation{

    public int cube(int number) {
        return number*number*number;
    }

}

主类

package com.javatpoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Host
{
    public static void main(String[] args)
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("Waiting for requests");

    }
}

现在请告知如何添加方法获取客户端主机提前谢谢

【问题讨论】:

  • 为什么?它不是固定的。它没有传达任何有用的信息。
  • @EJP 好吧,有一种情况是,许多不同的客户端正在访问我的 rmi 服务,并且客户端本身在不同的端口上运行,所以我只想知道哪个客户端从哪个端口访问我的服务
  • 另外请告知我可以实现我自己的自定义拦截器,它将捕获作为客户端访问 rmi 服务的信息的端口
  • 那些客户端在随机端口上运行,在客户端的整个生命周期中这些端口可能会发生变化,并且对于不同主机上的不同客户端可能会意外地相同。这是毫无意义。如果您需要区分客户端,让他们登录并为他们提供令牌,或者为每个客户端使用单独的远程会话对象。

标签: java spring rmi


【解决方案1】:

配置 RMI 主机,使其知道哪个客户端端口正在访问它

  1. 没有将传递该信息的 RMI 主机的“配置”。

  2. 客户端端口信息完全没用。

    • 每个客户都不是唯一的。
    • 不是每个客户都固定的。
    • 它可以而且将会随着客户的一生而改变。

对我来说,这听起来像是 Remote Session Pattern 的案例。

【讨论】:

  • 我的客户将有不同的端口号,因为它们运行在不同的 unix box 机器上
  • @tuntun82828282hdjscd 这就是他们可以拥有相同端口号的原因。它不会改变我上面所说的任何内容。
【解决方案2】:

您可以通过多种方式解决问题。

1) 您可以在远程接口中添加一种方法,例如 registerClient(String clientId, Object clientInfo)。您可以在此方法的附加参数中传递其他相关信息。 RMI 服务器可以简单地将这些信息放入 ConcurrentHashMap 等数据结构中。

2) 调用 registerClient 后,您可以通过传递 clientId 作为远程方法中的参数之一来调用 RMI 服务器中的其他远程方法,如 cube(String clientId, int num);

3) 如果您只需要客户端IP,Java 已经在RemoteServer 中提供了getClientHost() API,它提供了您要查找的信息。

【讨论】:

  • 非常感谢你能告诉我如何添加这个方法获取客户端主机(),我会得到这个方法我远程服务导出器类的春天,如果可以的话,我会非常感谢你请显示,或者您甚至可以修改我上面的程序本身,这将非常有帮助提前谢谢
  • CalculationImpl 将有权访问此方法。此方法是在 RemoteServer 中定义的。任何作为 RemoteServer 实例的对象都可以访问它。
  • 我已经添加了核心类,请告知如何在我上面的ojo中添加方法get client host()提前谢谢
  • 错误,这是 Spring RMI。 RemoteServer的方法不适用。
  • @EJP 是的,请提前告知如何克服这个谢谢
猜你喜欢
  • 2021-07-04
  • 2011-09-29
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2012-10-17
  • 2018-08-02
相关资源
最近更新 更多