0

当我使用 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

我的英语不是很好!

4

3 回答 3

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”(开箱即用)。有人以不明智的方式配置它是合理的。

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

于 2013-07-12T03:42:46.847 回答
0

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

可能是unix系统首先列出环回接口并因此返回该地址,但是当Windows首先列出以太网接口并返回以太网地址时。

于 2013-07-12T03:19:14.890 回答
0

扩展@StephenC的答案:

  1. getClientHost()返回传入套接字的远程套接字地址。
  2. 该值取决于客户端在连接到服务器时自动将其传出套接字绑定到哪个 IP 地址。
  3. 这又取决于从客户端到服务器的 IP 路由。
  4. 这又取决于客户端尝试连接的内容。
  5. 客户端将自己绑定到其传出 IP 地址中具有到目标的最便宜路由的任何一个。
  6. 又取决于客户端是否将服务器的地址视为 127.0.0.1 或外部 IP 地址。
  7. 这又取决于客户端的 DNS 或 etc/hosts 文件。

您可以忽略 RMI 代理的影响,除非您从我这里购买了一个 ;-) 或者除非您使用可怕的 HTTP 隧道选项。

于 2013-07-12T05:53:49.900 回答