2013-04-04 50 views
0

我正试图在一台服务器和两台客户机之间建立双向通信。当所有程序在同一台计算机上运行时,这种方式非常有效,但当我尝试使用LAN网络时,它不起作用。 我得到了错误:RMI-在同一台机器上工作,不在局域网中

java.rmi.ConnectException: Connection refused to host: 192.168.1.24; nested exception is: 
java.net.ConnectException: Connection timed out: connect 

这里是服务器代码:

public class Server{ 
private Game partie; // The class Game extends UnicastRemoteObject and implements ServerInterface 


public Server() throws RemoteException { 
    System.setProperty("java.rmi.server.hostname", "192.168.1.24"); 
    partie = new Game(); 
    LocateRegistry.createRegistry(1099); 
    try{ 
     Naming.rebind("Server", partie); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
public static void main(String argv[]) throws RemoteException{ 
    new Server(); 
} 
} 

下面是客户端代码的构造:

public Client(String aName, String aServerAdress) throws RemoteException { 
    super(); 
    name = aName; 
    ServerAdress = aServerAdress; // = "192.168.1.24" 
    theRegistry = LocateRegistry.getRegistry(ServerAdress); 

    try { 
     serverInterface = (ServerInterface) theRegistry.lookup("Server"); 
    } catch (NotBoundException e1) { 
     e1.printStackTrace(); 
    } 



    try { 
     theRegistry.bind(name, this); // For two-way communication 
    } catch (AlreadyBoundException e) { 
     e.printStackTrace(); 
    } 


    serverInterface.registerClient(name); 
} 

凡registerClient(字符串名称)代码大约(游戏类中):

cd_client = (ClientInterface) Naming.lookup("rmi://127.0.0.1/" + name); 

所有防火墙都被禁用。

我一直在解决这个问题好几个小时了,我还没有找到问题所在。如果你能帮我一下,我会很感激。 谢谢

+0

本地网络和局域网?你如何区分这些? – asgs 2013-04-04 18:18:50

+0

127.0.0.1&192.168.1.24不是(必然)是同一台机器(就您的网络代码而言)。使你的参考一致。 – KevinDTimm 2013-04-04 18:20:58

+0

192.168.1.24是我用来运行服务器应用程序的机器的地址 – maxence5694 2013-04-04 18:27:11

回答

4

变化127.0.0.1的所有出现(除注册表绑定)到您的局域网IP地址(192.168.1.24你的情况)

127.0.0.1是一个Loopback地址:

“环回(环回)描述了将电子信号,数字数据流或者来自其始发地址的设备的数据流路由回到源的接收端,而没有故意的 处理或修改,这主要是一种测试手段 传输或运输基础设施。“ - 来自维基百科

+0

谢谢,这个工程。但现在我有另一个错误: java.rmi.ServerException:在服务器线程中发生RemoteException;嵌套的异常是: java.rmi.AccessException:Registry.Registry.rebind不允许;原产地/192.168.1.56是非本地主机'。 起源是客户端代码中的'theRegistry.bind(name,this)'。我可以在注册表(它在服务器上)上注册客户端吗?所以服务器可以调用客户端上的方法。 – maxence5694 2013-04-04 19:01:26

+0

看着http://stackoverflow.com/questions/820719/using-single-rmi-registry它似乎你实际上应该使用回送注册表绑定。编辑我的答案以及 – 2013-04-04 19:10:50

+0

我在registerClient方法中添加了客户端注册表绑定,它运行良好,感谢您的帮助。 – maxence5694 2013-04-04 19:41:13

相关问题