Java 获取 Socket IP 地址
在 Java 中,获取 Socket 的 IP 地址可以通过多种方式实现,具体取决于你的使用场景(客户端 Socket 或服务器端 Socket),以下是几种常见的方法:

获取客户端 Socket 的 IP 地址(服务器端)
如果你是服务器端,想要连接到你的客户端 Socket 的 IP 地址:
import java.net.Socket;
import java.net.InetAddress;
// 假设 socket 是已经建立连接的 Socket 对象
Socket socket = ...; // 你的 Socket 对象
// 获取远程客户端的 IP 地址
InetAddress clientAddress = socket.getInetAddress();
String clientIP = clientAddress.getHostAddress();
// 获取远程客户端的主机名(如果可用)
String clientHostname = clientAddress.getHostName();
System.out.println("客户端IP地址: " + clientIP);
System.out.println("客户端主机名: " + clientHostname);
获取服务器端 Socket 的 IP 地址(客户端)
如果你是客户端,想要连接到的服务器 Socket 的 IP 地址:
import java.net.Socket;
import java.net.InetAddress;
// 假设 socket 是已经建立连接的 Socket 对象
Socket socket = ...; // 你的 Socket 对象
// 获取远程服务器的 IP 地址
InetAddress serverAddress = socket.getInetAddress();
String serverIP = serverAddress.getHostAddress();
// 获取远程服务器的主机名(如果可用)
String serverHostname = serverAddress.getHostName();
System.out.println("服务器IP地址: " + serverIP);
System.out.println("服务器主机名: " + serverHostname);
获取本地绑定地址
如果你想知道 Socket 绑定的本地 IP 地址:
import java.net.Socket;
Socket socket = ...; // 你的 Socket 对象
// 获取本地绑定的 IP 地址
String localIP = socket.getLocalAddress().getHostAddress();
// 获取本地绑定的端口
int localPort = socket.getLocalPort();
System.out.println("本地IP地址: " + localIP);
System.out.println("本地端口: " + localPort);
使用 ServerSocket 获取连接信息(服务器端)
如果你使用的是 ServerSocket 来接受连接:

import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;
ServerSocket serverSocket = new ServerSocket(8080);
Socket clientSocket = serverSocket.accept();
// 获取客户端信息
InetAddress clientAddress = clientSocket.getInetAddress();
String clientIP = clientAddress.getHostAddress();
int clientPort = clientSocket.getPort();
// 获取服务器信息
InetAddress serverAddress = serverSocket.getInetAddress();
String serverIP = serverAddress.getHostAddress();
int serverPort = serverSocket.getLocalPort();
System.out.println("客户端IP: " + clientIP + ", 端口: " + clientPort);
System.out.println("服务器IP: " + serverIP + ", 端口: " + serverPort);
注意事项
getHostAddress()返回的是 IP 地址的字符串表示(如 "192.168.1.100")getHostName()可能会触发 DNS 查询,可能会比较耗时- 如果主机名无法解析,
getHostName()可能会返回 IP 地址本身 - 对于 IPv6 地址,
getHostAddress()会返回标准的 IPv6 格式(如 "::1")
方法应该能满足大多数获取 Socket IP 地址的需求。

