在我的笔记本电脑上(运行Windows 7,安装了Virtual
Box及其网络接口),以下代码将打印出我的无线接口的名称以及本地地址。它在一天结束时使用暴力手段,但只会尝试并实际连接到被认为是最佳候选人的地址。
// iterate over the network interfaces known to javaEnumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();OUTER : for (NetworkInterface interface_ : Collections.list(interfaces)) { // we shouldn't care about loopback addresses if (interface_.isLoopback()) continue; // if you don't expect the interface to be up you can skip this // though it would question the usability of the rest of the pre if (!interface_.isUp()) continue; // iterate over the addresses associated with the interface Enumeration<InetAddress> addresses = interface_.getInetAddresses(); for (InetAddress address : Collections.list(addresses)) { // look only for ipv4 addresses if (address instanceof Inet6Address) continue; // use a timeout big enough for your needs if (!address.isReachable(3000)) continue; // java 7's try-with-resources statement, so that // we close the socket immediately after use try (SocketChannel socket = SocketChannel.open()) { // again, use a big enough timeout socket.socket().setSoTimeout(3000); // bind the socket to your local interface socket.bind(new InetSocketAddress(address, 8080)); // try to connect to *somewhere* socket.connect(new InetSocketAddress("google.com", 80)); } catch (IOException ex) { ex.printStackTrace(); continue; } System.out.format("ni: %s, ia: %sn", interface_, address); // stops at the first *working* solution break OUTER; }}(我已
isReachable(...)根据MockerTim的答案更新了我的答案。)
需要注意的一件事。
socket.bind(...)如果我尝试连续太快地运行我的代码(例如连接清理得不够快),就会对我说地址和端口已经被使用了。
8080应该是一个随机端口。



