Java Rmi未知后异常
我试图编写一个简单的RMI文件,但由于某种原因,它给了我一个未知主机名异常。在真正提问之前,我已经尝试了所有的方法。这是该项目的代码 RMI接口类:Java Rmi未知后异常,java,rmi,Java,Rmi,我试图编写一个简单的RMI文件,但由于某种原因,它给了我一个未知主机名异常。在真正提问之前,我已经尝试了所有的方法。这是该项目的代码 RMI接口类: import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { String sayHello() throws RemoteException; } 服务器类: import java.rmi.regist
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
服务器类:
import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class Server implements Hello {
public Server() {}
public String sayHello() {
return "Hello, world!";
}
public static void main(String args[]) {
try {
Server obj = new Server();
Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
// Bind the remote object's stub in the registry
Registry registry = LocateRegistry.getRegistry();
registry.bind("Hello", stub);
System.err.println("Server ready");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}
客户端类:
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
private Client() {}
public static void main(String[] args) {
String host = (args.length < 1) ? null : args[0];
try {
Registry registry = LocateRegistry.getRegistry(host);
Hello stub = (Hello) registry.lookup("Hello");
String response = stub.sayHello();
System.out.println("response: " + response);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}
可能还有几十个斜杠等等。仍然不知道为什么这不起作用(即使它在本地主机上运行得很好)。任何想法都欢迎
为了完整起见,这里是我得到的实际错误:
java -classpath classes/ Client
Client exception: java.rmi.UnknownHostException: Unknown host: rmi://192.168.1.1; nested exception is:
java.net.UnknownHostException: rmi://192.168.1.1
java.rmi.UnknownHostException: Unknown host: rmi://192.168.1.1; nested exception is:
java.net.UnknownHostException: rmi://192.168.1.1
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:598)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at Client.main(Client.java:14)
Caused by: java.net.UnknownHostException: rmi://192.168.1.1
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:189)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
... 5 more
java-类路径类/客户端
客户端异常:java.rmi.UnknownHostException:未知主机:rmi://192.168.1.1; 嵌套异常是:
java.net.UnknownHostException:rmi://192.168.1.1
java.rmi.UnknownHostException:未知主机:rmi://192.168.1.1; 嵌套异常是:
java.net.UnknownHostException:rmi://192.168.1.1
位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:598)
位于sun.rmi.transport.tcp.tcpcchannel.createConnection(tcpcchannel.java:198)
位于sun.rmi.transport.tcp.tcpcchannel.newConnection(tcpcchannel.java:184)
位于sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
位于sun.rmi.registry.RegistryImpl\u Stub.lookup(未知源)
位于Client.main(Client.java:14)
原因:java.net.UnknownHostException:rmi://192.168.1.1
位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195)
位于java.net.socksocketimpl.connect(socksocketimpl.java:366)
位于java.net.Socket.connect(Socket.java:529)
位于java.net.Socket.connect(Socket.java:478)
位于java.net.Socket(Socket.java:375)
位于java.net.Socket(Socket.java:189)
位于sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
位于sun.rmi.transport.proxy.rmismastersocketfactory.createSocket(rmismastersocketfactory.java:128)
位于sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
... 还有5个
此问题已解决。我将发布我自己的解决方案。显然,像这样运行服务器是可行的:java-Djava.rmi.server.hostname=192.168.1.1 server。问题是,当客户端调用服务器并返回存根时,此存根包含此属性,java默认情况下将此属性设置为localhost,即使在创建注册表时将服务器绑定到ip。这就是为什么即使您的客户端正在连接到远程主机,它也会崩溃,因为本地主机上的连接被拒绝,因为它的存根中包含本地主机。关于主机名和IP之间的映射的注释:您可以随意命名定位器,但随后必须在主机文件中插入一个条目(C:\Windows\system32…\hosts),例如
然后,您可以在呼叫中选择主机1:
LocateRegistry.getRegistry(host, port);
你试过“192.168.1.1”吗?主机名是机器的名称,不应该包含“协议”-它不是URI/URL.java-classpath classes/Client在这里我没有看到任何参数,你传递给客户机main方法的参数是什么?在本地主机和远程计算机的情况下?我试过192.168.1.1。正如我提到的,我已经试过了到目前为止,所有的组合都很荒谬,但它们都不起作用。这里没有参数,因为这个错误来自另一次运行,我只是将主机名硬编码为“rmi://192.168.1.2“等等,以确保代码不是问题所在。@user1822343那么,当您尝试调用
LocateRegistry.getRegistry时,当前的问题是什么?”("192.168.1.1")
?这真的是服务器的IP地址吗?在我看来,它更像是一个路由器地址。这已解决。我将发布我自己的解决方案。显然,像java-Djava.rmi.server.hostname=192.168.1.1服务器那样运行服务器解决了问题。当客户端调用服务器并返回存根时,此存根包含此属性和java默认将此属性设置为localhost。这就是为什么即使您的客户端正在连接到远程主机,它也会崩溃,说localhost上的连接被拒绝。
127.0.0.1 rmihost1
LocateRegistry.getRegistry(host, port);