Vì vậy, tôi đang cố gắng lấy địa chỉ IP của máy của tôi trong mạng cục bộ của tôi (cần là 192.168.178.41
).Nhận địa chỉ IP cục bộ mà không cần kết nối Internet
ý định đầu tiên của tôi là sử dụng một cái gì đó như thế này:
InetAddress.getLocalHost().getHostAddress();
nhưng nó chỉ trả về 127.0.0.1
, đó là chính xác nhưng không phải là rất hữu ích cho tôi.
Tôi đã tìm kiếm xung quanh và tìm thấy câu trả lời này https://stackoverflow.com/a/2381398/717341, mà chỉ đơn giản tạo ra một Socket
-Connection một số web-page (ví dụ như "google.com") và nhận được địa chỉ host nội bộ từ các ổ cắm:
Socket s = new Socket("google.com", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();
Điều này làm việc cho máy của tôi (nó trả về 192.168.178.41
), nhưng nó cần phải kết nối với internet để làm việc. Vì ứng dụng của tôi không yêu cầu kết nối internet và có thể có vẻ "đáng ngờ" khi ứng dụng tìm cách kết nối với google mỗi khi nó được khởi chạy, tôi không thích ý tưởng sử dụng nó.
Vì vậy, sau khi một số nghiên cứu tôi càng loạng choạng trên NetworkInterface
đẳng cấp, trong đó (với một số công việc) cũng không trả lại mong muốn IP-Địa chỉ:
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()){
NetworkInterface current = interfaces.nextElement();
System.out.println(current);
if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
Enumeration<InetAddress> addresses = current.getInetAddresses();
while (addresses.hasMoreElements()){
InetAddress current_addr = addresses.nextElement();
if (current_addr.isLoopbackAddress()) continue;
System.out.println(current_addr.getHostAddress());
}
}
Trên máy tính của tôi, điều này sẽ trả về như sau:
name:eth1 (eth1)
fe80:0:0:0:226:4aff:fe0d:592e%3
192.168.178.41
name:lo (lo)
Nó tìm thấy cả hai giao diện mạng của tôi và trả về IP mong muốn nhưng tôi không chắc địa chỉ khác (fe80:0:0:0:226:4aff:fe0d:592e%3
) có nghĩa là gì.
Ngoài ra, tôi chưa tìm cách lọc nó từ địa chỉ trả về (bằng cách sử dụng isXX()
-methods của InetAddress
-object), sau đó sử dụng RegEx, mà tôi thấy rất "bẩn".
Bất kỳ suy nghĩ nào khác ngoài sử dụng RegEx hoặc internet?
fe80: 0: 0: 0: 226: 4aff: fe0d: 592e trông giống như một địa chỉ IPv6 –
'fe80 :: ... 'là một IPv6 địa chỉ link-local s – fge
Và nhân tiện, bạn muốn "lọc" cái gì? Và tất nhiên, bạn có biết rằng một chiếc máy có thể được multihomed? – fge