您如何确定使用Java的哪个网络接口连接到Internet?例如,我跑步
InetAddress.getLocalHost().getHostAddress();
在Eclipse中,这恰好返回了我想要的值192.168.1.105。但是,如果我将此文件打包到jar文件中并运行程序,则代码将返回169.254.234.50。对此进行调查后,我发现这是机器上的VMware虚拟以太网适配器接口的IP地址。
有什么方法可以确定连接到Internet的接口,但同时又可以保持我代码的可移植性?
接口比较
接口[net4]
display name : Intel(R) Centrino(R) Ultimate-N 6300 AGN
MTU : 1500
loopback : false
point to point: false
up : true
virtual : false
multicast : true
HW address : 00 24 D7 2C 5F 70
INET address (IPv4): 192.168.1.105
host name : MyComputer
canonical host name : MyComputer
loopback : false
site local : true
any local : false
link local : false
multicast : false
reachable : true
接口[eth5]
display name : VMware Virtual Ethernet Adapter for VMnet1
MTU : 1500
loopback : false
point to point: false
up : true
virtual : false
multicast : true
HW address : 00 50 56 C0 00 01
INET address (IPv4): 169.254.234.50
host name : MyComputer
canonical host name : MyComputer
loopback : false
site local : false
any local : false
link local : true
multicast : false
reachable : true
第三个VMware界面的站点为local = true,链接为local = false,因此这些字段也无济于事。
在我的笔记本电脑上(运行Windows 7,安装了Virtual
Box及其网络接口),以下代码将打印出我的无线接口的名称以及本地地址。它在一天结束时使用暴力手段,但只会尝试并实际连接到被认为是最佳候选人的地址。
// iterate over the network interfaces known to java
Enumeration<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 code
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: %s\n", interface_, address);
// stops at the first *working* solution
break OUTER;
}
}
(我已isReachable(...)
根据MockerTim的答案更新了我的答案。)
需要注意的一件事。socket.bind(...)
如果我尝试连续太快地运行我的代码(例如连接清理得不够快),就会对我说地址和端口已经被使用了。8080
应该是一个随机端口。
问题内容: 我想知道下面的方法是否可以检查我是否都已连接到网络,并且实际上也可以连接到互联网。 不只是连接到不允许我访问互联网的网络吗? 我认为确实如此,但我不确定100%。 谢谢 问题答案: 通过比较这篇文章中可接受的答案和您的代码,您正在做什么。随意比较代码。最安全的做法是在飞行模式下,关闭WiFi并在远离WiFi的位置进行一些测试,以确保安全。祝好运。
问题内容: 在或中,是否有一个选项可以指定网络接口来发起连接? 编辑:在OS级别的AFAIK,我可以指定地址级别,或将负载平衡到路由表中。但是我软件中接口选择的方式不止于此,我想知道我是否可以在代码中做到这一点。 问题答案: 节点具有以下内置功能: http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener h
对于一个附带项目,我试图收集与梦幻足球相关的NFL球员的统计数据。我找到了一个URL,其中包含我想要的数据:https://www.cbssports.com/fantasy/football/stats/QB/2020/ytd/stats/ppr/ 我试图在R中勉强应付,但运气不好。我试过很多东西,最接近的是: 这是我到目前为止得到的代码,结果如下: 我尝试将其输入html_text(),结果我
问题内容: 在我的Java应用程序中,如何检测Internet连接速度有多快?例如,我在家中使用AT&T Fast DSL,我想知道是否有一种方法可以编写执行以下操作的方法: 它将返回以kbps为单位的数字,例如2800kbps [2.8 M] 编辑:我要问的原因是在我的应用程序中,我可以打开多个Internet流,具体取决于用户的Internet连接速度,我希望它自动确定要打开多少个流而不会中断
问题内容: 我只是四处看看,以了解如何制作一个程序来监听Java中的网络流量,但是我什么也找不到。我想知道是否可以通过任何方式查看网络流量。我听说过Socket的想法,但我不知道该如何工作。因此,无论如何,只是寻找一个API或自己编写一种方法。 编辑: 我很乐意想要一个API,但我也想澄清一下使用Socket嗅探通信的方式。 问题答案: jpcap,jNetPcap-是Java中的pcap包装器项
问题内容: 我凭经验发现 绑定到当前计算机上的所有网络接口(而不仅仅是localhost-127.0.0.1或主机名),但是我无法找到说明这是可以保证的文档。 问题:在Java中绑定到0.0.0.0的定义将始终绑定到所有网络接口? 问题答案: 使用将仅绑定到启用IPv4的接口。但是,如果绑定到,则假定您的TCP / IP堆栈(和Java)启用了IPv4兼容的IPv6套接字,则该协议应涵盖所有IPv