我是Java RMI技术的新手。我有一个问题,已经有其他程序员,但我无法理解他们在教程中做了什么,以解决它。 我用Java RMI实现了游戏“tic tac toe”。 这里是ControllerServer代码
public ControllerServer() {
try {
game = new GameImpl();
BoardView view = new BoardView(this);
viewUpdater = new ServerViewUpdaterImpl(view);
Game gameStub = (Game) UnicastRemoteObject.exportObject(game, 1099);
ServerViewUpdater serverViewStub = (ServerViewUpdater) UnicastRemoteObject.exportObject(viewUpdater, 1099);
Registry registry = LocateRegistry.createRegistry(1099);
registry.rebind("TTTGame", gameStub);
registry.rebind("TTTServerView", serverViewStub);
} catch (Exception e) {
e.printStackTrace();
}
}
这里是ControllerClient
public ControllerClient() {
try {
BoardView view = new BoardView(this);
localView = new ClientViewUpdaterImpl(view);
String address = JOptionPane.showInputDialog("Insert server's address: ");
Registry registry = LocateRegistry.getRegistry(address, 1099);
game = (Game) registry.lookup("TTTGame");
remoteView = (ServerViewUpdater) registry.lookup("TTTServerView");
remoteView.registerClientView(localView);
} catch (Exception e) {
e.printStackTrace();
}
}
它通过插入“localhost”“127.0.0.1”或我的外部网络IP在本地工作。 如果客户端和服务器在不同的计算机上运行,则不起作用。
我得到了例外情况“连接被127.0.1.1拒绝”。我不明白为什么他们试图在执行的某个时刻使用localhost地址。
答案 0 :(得分:4)
正如另一个所说,这是海滩你的IP被设置为 127.0.1.1
运行ipconfig -a
以查看主机的IP地址。
然后编辑/etc/hosts
文件而不是此行
的 127.0.1.1 "name of the host"
强>
将 127.0.1.1替换为您机器的IP 。
这应该有用。
您可以通过执行以下命令来验证 rmi服务器正在侦听的IP:
String hostname = InetAddress.getLocalHost().getHostAddress();
Log.info("this host IP is " + hostname);
如果使用正确的IP覆盖/etc/hosts
文件,那么一切都应该有效。
答案 1 :(得分:2)
调用getRegistry()时,地址错误。您需要提供服务器主机的地址。通常,客户端主机中没有运行RMI注册表。
答案 2 :(得分:1)
这是因为您的IP很可能是错误的。它是127.0.0.1
而不是127.0.1.1
。您也可以使用localhost
进行尝试。