我有一个Java服务器程序使用套接字流处理客户端请求。它工作正常。
但是,我需要在服务器端看到客户端的IP地址。我在这里看到了几个类似的问题,他们都建议使用getRemoteSocketAddress()
(或getInetAddrees()
)方法。
以下是一个例子:
ServerSocket serverSocket_A = new ServerSocket(port1);
Socket clientSocket_A = serverSocket_A.accept();
此处阻止该程序收听客户的请求。当收到请求时,处理继续。这意味着clientSocket_A
已连接到远程客户端。
现在,如果我发出
requesterAddress = clientSocket_A.getRemoteSocketAddress().toString();
它返回这个奇怪的地址:0:0:0:0:0:0:0:1而不是127.0.0.1(我的客户端在本地机器上)。
知道如何解决这个问题吗?
有趣的是,我在此服务器程序中设置了一个ClientSocket_B
,它连接到Web服务器。对此clientSocket_B
Socket clientSocket_B = new Socket(WebServerHost, workPort2);
clientSocket_B.getRemoteSocketAddress().toString();
返回WebServer的正确IP地址。
为什么会这样?
答案 0 :(得分:2)
您看到的0:0:0:0:0:0:0:1
是IPv6等价物127.0.0.1。这是因为您在服务器上启用了IPv6,并且正在从同一台计算机建立与服务器的连接。
您可以通过强制客户端仅使用IPv4协议来查看IPv4地址。另一方面,您的Web服务器主机很可能使用您在呼叫时可以看到的IPv4互联网地址 -
Socket clientSocket_B = new Socket(WebServerHost, workPort2);
clientSocket_B.getRemoteSocketAddress().toString();