[英]How do I get the IPv4 from a ServerSocket?
在我的應用程序中,我創建一個ServerSocket
,並等待連接:
while(isRunning) {
try {
socket = serverSocket.accept();
然后,我嘗試獲取生成的套接字的遠程IP:
socket.getInetAddress().getHostAddress();
但是,這似乎僅返回一個IPv6地址。
就我的目的而言,我認為我需要一個IPv4。 有什么方法可以從套接字獲取IPv4地址嗎?
不知道是否為時已晚,但是這段小代碼可以解決您的問題。 我今天遇到了同樣的問題,發現了這一點:
private String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
if (inetAddress instanceof Inet4Address) {
return ((Inet4Address)inetAddress).getHostAddress().toString();
}
}
}
}
} catch (SocketException ex) {
Log.e("ServerActivity", ex.toString());
}
return null;
}
重點是測試IP地址是否真的是IP V4地址。
玩得開心
如果客戶端已連接到IPv6地址(即,如果您的服務器是IPv6托管的),那么您將只有IPv6地址。 您還需要在(或代替)IPv4空間中托管服務器,然后讓客戶端連接到IPv4地址,以獲取客戶端的IPv4地址。
您可能可以通過DNS進行查找,但這並不可靠(即,對IPv6地址進行反向查找以獲取主機名,然后進行正向查找,在主機上查找A記錄)。 假設已為該地址設置了反向DNS,但不能保證。
盡管某些IPv6地址映射到IPv4范圍,但由於IPv6地址比IPv4地址多,因此無法將所有IPv6都轉換為IPv4。 Oracle有一個非常好的文檔,解釋了IPv6和IPv4以及它如何影響Java和網絡。 您還應該簽出InetAddress
API文檔。 我在下面都鏈接了:
http://docs.oracle.com/javase/1.4.2/docs/guide/net/ipv6_guide/
http://docs.oracle.com/javase/1.4.2/docs/api/java/net/InetAddress.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.