Java 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

我试图编写一个简单的RMI文件,但由于某种原因,它给了我一个未知主机名异常。在真正提问之前,我已经尝试了所有的方法。这是该项目的代码

RMI接口类:

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);