java - 同一程序中的 RMI 多级

标签 java rmi

我正在从服务器到其他服务器串行调用 Java RMI?

RMI 客户端 1 >--(1)--->RMI 服务器 1 >---(2)-----> RMI 服务器 2

意味着 RMI 客户端 1 将调用 RMI 服务器 1 上的方法,并且 RMI 服务器 1 将调用其他 RMI 服务器 2 代理客户端上的方法。对于同一执行程序中的 RMI 服务器 2

异常:java.lang.ClassCastException:rmiserver1_Stub无法转换为interfc2

请帮忙..

代码在这里:

rmiserver1.java

import java.rmi.*;
import java.rmi.server.*;

import java.io.*;
import java.util.*;


class rmiserver1 extends UnicastRemoteObject implements interfc1
{
public rmiserver1() throws RemoteException
{
    System.out.println("RMIServer 1 Constructor ");
}


public String remote1() 
{
    System.out.println("here Calling RMIServer2 method remote2 ");
                try
                {
//here is Exception
                    interfc2 obj2=(interfc2) Naming.lookup("rmi://localhost/rmiserver2");
                    String r2=obj2.remote2();
                    System.out.println("Result from rmiserver2 :"+r2);
                }
                catch(Exception e){e.printStackTrace();}

    return "RMIServer1 remote 1 method return here....";

}


public static void main(String[] args) 
{
    System.out.println("RMIServer 1 Main method ");

    try
            {
                rmiserver1 p1=new rmiserver1();
                    Naming.rebind("rmiserver1",p1);

            System.out.println("RMIServer 1 rebinded ");

            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

}
 }

interfc1.java

 import java.rmi.*;
 import java.io.*;
 import java.util.*;

public interface interfc1 extends Remote
{
public String remote1() throws RemoteException;
}

interfc2.java

import java.rmi.*;
import java.io.*;
import java.util.*;

public interface interfc2 extends Remote
{
public String remote2() throws RemoteException;
}

rmiserver2.java

import java.rmi.*;
import java.rmi.server.*;

import java.io.*;
import java.util.*;


class rmiserver2 extends UnicastRemoteObject implements interfc2
{
public rmiserver2() throws RemoteException
{
    System.out.println("RMIServer 2 Constructor ");
}


public String remote2() 
{
    return "RMIServer2 remote 2 method return here....";
}


public static void main(String[] args) 
{
    System.out.println("RMIServer 2 Main method ");

    try
            {
                rmiserver1 p1=new rmiserver1();
                    Naming.rebind("rmiserver2",p1);

            System.out.println("RMIServer 2 rebinded ");

            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

}
}

rmiclient1.java

import java.rmi.*;
import java.rmi.server.*;

import java.io.*;
import java.util.*;



class rmiclient1  
{
public static void main(String[] args) 
{
    System.out.println("RMIClient 1 Main method");

    try
    {
        interfc1 obj1=(interfc1) Naming.lookup("rmi://localhost/rmiserver1");
        String r1=obj1.remote1();
        System.out.println("Result from rmiserver1 :"+r1);
    }
    catch(Exception e){e.printStackTrace();}
}
}

rmiserver1 提示异常:

  java.lang.ClassCastException: rmiserver1_Stub cannot be cast to interfc2
    at rmiserver1.remote1(rmiserver1.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
 sorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:5
 35)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTranspor
 t.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport
 .java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec
 utor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:908)
    at java.lang.Thread.run(Thread.java:619)

请帮帮我......

最佳答案

您的问题出在类 rmiserver2 的 main 方法中,您将 rmiserver1 与名称“rmiserver2”绑定(bind)。

您当前在rmiserver2的main方法中的代码

rmiserver1 p1=new rmiserver1();
                Naming.rebind("rmiserver2",p1);

你想要的是这样的:

rmiserver2 p2=new rmiserver2();
                Naming.rebind("rmiserver2",p1);

看起来像是复制粘贴问题:)

关于java - 同一程序中的 RMI 多级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339117/

相关文章:

java - 方法调用中的构造函数定义

java - 如何获取字段或方法的 JNI 风格签名字符串?

java - RMI 客户端无法查找服务器 - java.rmi.UnmarshalException

Java:RMI 问题

java - 无法与远程计算机建立 RMI 连接

java - 将具有 AdMob 集成的应用程序推送到公共(public) github

java - 双编码 UTF-8 字符串 - MySql、Hibernate

Java RMI - 实现本地到实现远程

java - 带有抽象类的 RMI/事件监听器?

java - dbunit 模式参数不起作用