如何获得客户';Java流通信中的IP地址

如何获得客户';Java流通信中的IP地址,java,sockets,stream,Java,Sockets,Stream,我有一个Java服务器程序,使用套接字流处理客户端请求。而且效果很好。 但是,我需要在服务器端查看客户端的IP地址。我在这里看到了几个类似的问题,它们都建议使用getRemoteSocketAddress()(或getInetAddrees())方法 以下是一个例子: ServerSocket serverSocket_A = new ServerSocket(port1); Socket clientSocket_A = serverSocket_A.accept(); 程序在此被阻止,以侦

我有一个Java服务器程序,使用套接字流处理客户端请求。而且效果很好。 但是,我需要在服务器端查看客户端的IP地址。我在这里看到了几个类似的问题,它们都建议使用
getRemoteSocketAddress()
(或
getInetAddrees()
)方法

以下是一个例子:

ServerSocket serverSocket_A = new ServerSocket(port1);
Socket clientSocket_A = serverSocket_A.accept();
程序在此被阻止,以侦听客户端的请求。当收到请求时,处理将继续。这意味着
clientSocket\u A
已经连接到远程客户端

现在,如果我发布

requesterAddress = clientSocket_A.getRemoteSocketAddress().toString();
它返回这个奇怪的地址:0:0:0:0:0:0:0:1,而不是127.0.0.1(我的客户端在本地计算机上)

你知道如何解决这个问题吗

有趣的是,我还有一个
ClientSocket\u B
,设置在这个服务器程序中,连接到Web服务器。将相同的方法应用于此
clientSocket\u B

Socket clientSocket_B = new Socket(WebServerHost, workPort2);
clientSocket_B.getRemoteSocketAddress().toString();
返回Web服务器的正确IP地址


为什么会发生这种情况?

您看到的
0:0:0:0:0:1
是IPv6与127.0.0.1的等价物。这是因为您在服务器上启用了IPv6,并且正在从同一台计算机建立与服务器的连接

通过强制客户端仅使用IPv4协议,您可能可以看到IPv4地址。另一方面,您的web服务器主机很可能使用了您在呼叫时可以看到的IPv4 internet地址-

Socket clientSocket_B = new Socket(WebServerHost, workPort2);
clientSocket_B.getRemoteSocketAddress().toString();

如果流量通过代理服务器或NAT,则实际地址可能不可用。