我正在学习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目录中 .
任何帮助或提示将不胜感激 .
UPDATE
感谢您的建议,字符串异常似乎已经消失,但现在我对此感到困惑 .
java.rmi.ConnectException:连接拒绝主机:127.0.0.1;嵌套异常是:java.net.ConnectException:连接被拒绝:在sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java: 216)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)来自于My.mmiClient.go(MyRemoteClient.java:13)的java.rmi.Naming.lookup(Naming.java:101),位于_SHELL57.run(_SHELL57.java:10)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) )sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at atj,java.lang.reflect.Method.invoke(Method.java:623)at bluej .runtime.ExecServer $ 3.run(ExecServer.java:774)引起:java.net.ConnectException:拒绝连接:连接java.net.DualStackPlainSocketImpl.connect0(本机方法)at java.net.AbstractStackPocketImpl.socketConnect(DualStackPlainSocketImpl.java:69),java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:316),java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:177),java.net.AbstractPlainSocketImpl .connect(AbstractPlainSocketImpl.java:164)java.net.SocksSocketImpl.connect(PlainSocketImpl.java:154),java.net.SocksSocketImpl.connect(SocksSocketImpl.java:352),java.net.Socket.connect(Socket . java:569)at java.net.Socket.connect(Socket.java:519)at java.net.Socket . (Socket.java:416)at 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)at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint . Java的:613)
3 回答
2件事:
将远程对象的名称更改为没有空格的内容 .
您是否首先运行服务器代码?
Tomcat与RMI有什么关系? Tomcat是一个servlet / JSP引擎,默认情况下侦听端口8080上的HTTP请求 .
RMI是一种完全不同的协议,与HTTP无关 . RMI守护程序默认使用端口1099 .
我建议看this .
检查服务器上的/ etc / hosts文件 . 它应该将localhost映射到127.0.0.1,并将您的真实主机名映射到您的真实IP地址 . 如果您的配置需要反过来,请在导出远程对象之前将系统属性java.rmi.server.hostname设置为服务器JVM上的正确IP地址 .