【问题标题】:Get Server Name in TCP Server获取 TCP 服务器中的服务器名称
【发布时间】:2015-06-14 10:42:37
【问题描述】:

是否可以获取 TCP 客户端使用的服务器地址?客户端可以使用 IP 地址或主机/域名访问服务器。

我正在尝试使用以下方式获取域名:

ServerSocket ss = new ServerSocket(port);
Socket s = ss.accept();
System.out.println(s.getLocalAddress().getHostName());
System.out.println(s.getLocalAddress().getCanonicalHostName());

但我得到的只是 IP 地址,永远如此!

在 HTTP 服务器中,我们可以使用 httpServletRequest.getServerName() 实现相同的目的。如果 HTTP 客户端使用 IP 地址,则返回 IP 地址;如果 HTTP 客户端使用域名,则返回域名。所以我很确定在 TCP 级别也应该是可能的。

【问题讨论】:

  • If you read the docs,您会看到 getServerName(..) 不是从 TCP 级别的某些内容中读取的。它实际上是从作为 HTTP 请求的一部分发送的 Host: yourServer.com 标头中读取的。在 TCP 级别,您只有 IP 地址,最好的办法是尝试将它们解析为主机名(您现在正在做的方式)。

标签: java sockets tcp hostname domain-name


【解决方案1】:

如果您尝试将 LocalHost 作为服务器,它可能会恢复该名称,这可能是 DNS 问题;无论如何,试试你 localhost 作为服务器,如果它有效,请转到 %SystemRoot%\system32\drivers\etc\hosts 并定义你的主机名。

check this out.

希望这会有所帮助。

【讨论】:

  • 对不起,这没有帮助。我不想解析主机名。可以使用通配符域名访问我的服务器,我想识别诸如 subdomain1.mydomain.com、subdomain2.mydomain.com 等名称。
【解决方案2】:

如果我正确理解您的问题,您正试图在服务器上找出 - 当服务器正在侦听多个 IP 地址时,“客户端”使用哪个 IP 地址连接到服务器。这是你的问题吗?在这种情况下,在accepted 套接字上执行getsockname() 应该会给你。

【讨论】:

  • 是的,您正确理解了我的问题。但是Socket类中没有getsockname这样的方法。
  • getLocalAddress 或 getLocalSocketAddress 不是给你你想要的吗?
  • 不可能达到@TCP 级别。 TCP 级别不知道“名称解析过程”。 TCP 连接建立发生 - 在名称被解析并且客户端收到它所询问的名称的 IP 地址之后。所以很明显,这个名字在 TCP 级别是看不到的。正如有人指出的那样,HTTP Server:是你最好的选择。
猜你喜欢
  • 2013-06-16
  • 2014-03-21
  • 2011-11-04
  • 2020-11-03
  • 2014-02-16
  • 2012-08-02
  • 2017-03-02
  • 2010-12-19
  • 2013-03-27
相关资源
最近更新 更多