Java RMI,Tomcat问题!

时间:2011-05-04 17:49:23

标签: java tomcat rmi

我正在学习Java RMI,并有一个示例代码来说明如何使用RMI通过网络将对象传递给另一个虚拟机。

以下是我正在使用的类和代码;

//interface
    import java.rmi.*;

public interface MyRemote extends Remote
{ 
    public String sayHello() throws RemoteException;

}

//My Remote Implementation Class
import java.rmi.*;
import java.rmi.server.*;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote
{
    public String sayHello()
    {
        return "Server says, 'Hey' ";
    }

    public MyRemoteImpl() throws RemoteException
    {

    }

    public static void main (String[] args)
    {
        try
        {
            MyRemote service = new MyRemoteImpl();
            Naming.rebind("Remote Hello", service);

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

//My Remote Client Class
import java.rmi.*;

public class MyRemoteClient
{
    public static void main (String [] args)
    {
        new MyRemoteClient().go();
    }

    public void go()
    {
        try{
            MyRemote service = (MyRemote) Naming.lookup("rmi://127.0.0.1/Remote Hello");

            String s = service.sayHello();

            System.out.println(s);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

我一直得到java.net.MalformedURLException:无效的URL字符串:rmi://127.0.0.1/Remote Hello我知道是由于'Naming.lookup(“rmi://127.0.0.1/Remote Hello”) )'最后一堂课的代码。

我已经安装了tomcat,并尝试将文件放在一个目录中,试图让它在我的本地计算机上运行,​​但我没有任何乐趣。

我已经创建了一个项目的JAR文件,并尝试将其放在一个目录中,但仍然没有运气。我听说过战争文件,但目前我正在学习的这本书还没有达到......

关于我如何解决这个问题的任何提示没有被调用的例外?我是否在Tomcat中错误地放置了文件?我已将它们放在我的C:\ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ webapps目录中。

非常感谢任何帮助或提示。

更新

感谢您的建议,字符串异常似乎已经消失,但现在我对此感到厌烦。

java.rmi.ConnectException:Connection拒绝主机:127.0.0.1;嵌套异常是:     java.net.ConnectException:连接被拒绝:连接     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)     at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)     at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)     在java.rmi.Naming.lookup(Naming.java:101)     at MyRemoteClient.go(MyRemoteClient.java:13)     at _ SHELL57.run( _SHELL57.java:10)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:623)     at bluej.runtime.ExecServer $ 3.run(ExecServer.java:774) 引起:java.net.ConnectException:连接被拒绝:连接     at java.net.DualStackPlainSocketImpl.connect0(Native Method)     在java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:69)     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:316)     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:177)     在java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:164)     在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:154)     在java.net.SocksSocketImpl.connect(SocksSocketImpl.java:352)     在java.net.Socket.connect(Socket.java:569)     在java.net.Socket.connect(Socket.java:519)     在java.net.Socket。(Socket.java:416)     在java.net.Socket。(Socket.java:199)     at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)     at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)     在sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)

3 个答案:

答案 0 :(得分:2)

2件事:

  1. 将远程对象的名称更改为没有空格的内容。
  2. 您是否首先运行服务器代码?

答案 1 :(得分:2)

Tomcat与RMI有什么关系? Tomcat是一个servlet / JSP引擎,默认情况下会侦听端口8080上的HTTP请求。

RMI是一种完全不同的协议,与HTTP无关。 RMI守护程序默认使用端口1099。

我建议您查看this

答案 2 :(得分:1)

检查服务器上的/ etc / hosts文件。它应该将localhost映射到127.0.0.1,并将您的真实主机名映射到您的真实IP地址。如果您的配置需要反过来,请在导出远程对象之前将系统属性java.rmi.server.hostname设置为服务器JVM上的正确IP地址。