Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取TCP服务器中的服务器名称_Java_Sockets_Tcp_Hostname_Domain Name - Fatal编程技术网

Java 获取TCP服务器中的服务器名称

Java 获取TCP服务器中的服务器名称,java,sockets,tcp,hostname,domain-name,Java,Sockets,Tcp,Hostname,Domain Name,是否可以获取TCP客户端使用的服务器地址?客户端可以使用IP地址或主机/域名访问服务器 我正在尝试使用以下方式获取域名: ServerSocket ss = new ServerSocket(port); Socket s = ss.accept(); System.out.println(s.getLocalAddress().getHostName()); System.out.println(s.getLocalAddress().getCanonicalHostName()); 但我得

是否可以获取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级别上也是可能的。

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


希望这会有所帮助。

如果我正确理解了您的问题,您将尝试在服务器上查找“客户端”在侦听多个IP地址时使用哪个IP地址连接到服务器。这是你的问题吗?在这种情况下,在
accept
ed套接字上执行
getsockname()

对不起,这没用。我不想解析主机名。可以使用通配符域名访问我的服务器,我想识别名称,如subdomain1.mydomain.com、subdomain2.mydomain.com等,您将看到getServerName(..)不是从TCP级别的内容读取的。它实际上是从作为HTTP请求一部分发送的
Host:yourServer.com
头读取的。在TCP级别,您只有IP地址,最好的办法是尝试将它们解析为主机名(您现在的做法)。是的,您正确理解了我的问题。但是在Socket类中没有类似于
getsockname
的方法。getLocalAddress或getLocalSocketAddress不是提供了您想要的吗?不可能获得@TCP级别。TCP级别不知道“名称解析过程”。TCP连接建立-在名称解析后,客户端收到其请求的名称的IP地址。很明显,在TCP级别上看不到该名称。正如有人指出的那样,HTTP服务器是您的最佳选择。