为什么java.rmi.server.RemoteServer.getClientHost()得到127.0.0.1

时间:2013-07-12 02:57:57

标签: java

当我使用RemoteServer.getClientHost()时,我在red hat上获得127.0.0.1,但在Windows上,我得到我的本地IP 192.168.1.15,linux需要不同的方法吗? 使用相同的代码:

  String chost = getClientHost();// 客户端主机
            if (logger.isDebugEnabled()) {
                StringBuffer strb = new StringBuffer();
                strb.append("客户端主机:").append(chost).append(",用户名:").append(username);
                logger.debug(strb.toString());
            }
            boolean login = rmiImpl.serverLogin(chost, username, password);
            System.out.println(chost+"........"+username+"......."+password);
            if (!login) {
                logger.debug("登录失败...");
                throw new LoginException();
            }

控制台出现:127.0.0.1 ........ TestWebServer ....... 123456

我的英语不是很好!

3 个答案:

答案 0 :(得分:2)

  

但是为什么我通过相同的代码在不同的操作系统中获得不同的IP

简短的回答是这是一个配置问题/问题。


通过该通话获得的IP地址取决于三件事:

  • 客户端如何请求连接到您的服务器,
  • 请求如何映射到IP地址,
  • 请求是否可以直接发送到您的服务器,或通过代理/反向代理。

如果没有更多信息,我们无法确定,但可能是这样:

  • Linux计算机已配置为将“localhost”映射到IP地址127.0.0.1,该地址是“环回”网络接口的地址。 (那不是物理网络接口......)

  • Windows计算机已配置为将“localhost”映射到主机的“真实”IP地址。

将“localhost”映射到127.0.0.1 IP地址是Linux / UNIX计算机的常规做法,至少(至少)回到4.x bsd UNIX天。我不确定Windows上的正常做法是什么,但显然在某些版本的Windows(开箱即用)上根本没有配置“localhost”。而且有人以不明智的方式配置它是合理的。

(我没有谈到代理问题。但如果这就是问题所在,你几乎没有机会做任何事情。)

答案 1 :(得分:0)

我假设你在同一台机器上运行两个操作系统。

可能是因为unix系统首先列出了loopback接口,因此当windows首先列出以太网接口并返回以太网地址时,会返回该地址。

答案 2 :(得分:0)

在@ StephenC的答案上稍微扩展一下:

  1. getClientHost()返回传入套接字的远程套接字地址。
  2. 该值取决于客户端在连接服务器时自动将其传出套接字绑定到的IP地址。
  3. 反过来又取决于从客户端到服务器的IP路由。
  4. 反过来又取决于客户端尝试连接的内容。
  5. 客户端会将自己绑定到任何一个传出IP地址都有最便宜的路由到目标。
  6. 又取决于客户端是将服务器的地址视为127.0.0.1还是外部IP地址。
  7. 反过来又取决于客户端的DNS或etc / hosts文件。
  8. 你可以忽略RMI代理的影响,除非你从我那里买了一个;-)或者除非你使用了可怕的HTTP隧道选项。