原文地址:https://segmentfault.com/a/1190000007462741
这里写目录标题
[Q&A] 什么是局域网? LAN
1・局域网是指在一个相对较小的地理范围内(如一栋建筑、一个办公室或一所学校内部),通过网络设备(如交换机
、路由器
和无线接入点
)相互连接的一组计算机和设备。
2・局域网的主要目的是资源共享,如文件共享、打印服务、互联网访问共享等。局域网的特点包括传输距离短、数据传输速率快、延迟低等。
3・常见的局域网技术包括以太网(Ethernet)
和Wi-Fi
。
[Q&A] 局域网有统一的IP吗?
1・在一个局域网(LAN)中,每台计算机通常被分配一个唯一的IP地址。
2・从外部互联网的角度来看,局域网内的所有设备对外表现出来的IP地址是相同的,这个IP地址称为公共IP地址或者是外网IP地址。这个公共IP地址是ISP(互联网服务提供商)分配给局域网的网关(通常是路由器)的,所有局域网内的设备通过这个网关访问互联网,外部网络看到的只是这个代表整个局域网的单一IP地址。
[Q&A] 什么是广播域?
1・广播域是指在同一个物理网络段上,所有能够直接接收广播消息的设备的集合。
2・通常由一个或一组交换机及其直接连接的设备组成,没有配置VLAN(虚拟局域网)的情况下,一个交换机的所有端口默认属于同一个广播域。
[Q&A] 如何获取本机在局域网中的IP地址?
方式1:执行命令
Windows: Win+R
→ cmd
→ ipconfig -all
→IPv4地址
Linux : ifconfig
方式2:解析命令
调用本地命令(比如 Windows 上的 ipconfig 命令和 Linux 上的 ifconfig 命令),接着解析本地命令的输出,最后得到本机在局域网内的 IP 地址。
方式3:Java网络编程
Java 在 JDK1.4 的时候添加的一个类: NetworkInterface
。拓展请转阅 : What is NetworkInterface
does?
[Q&A] 获得本机的所有IPV4网络IP
/**
* 获取本机所有IPv4网络IP地址。
* <p>
* 通过遍历本机的所有网络接口,获取与每个接口关联的IP地址,
* 并筛选出IPv4类型的地址进行输出。对于无法访问或不存在的网络接口,
* 方法会忽略并继续尝试下一个接口。
*
* @throws SocketException 如果在获取网络接口或其IP地址时发生错误
*/
public static void getLocalIPv4Address() throws SocketException {
// 获得本机的所有网络接口
Enumeration<NetworkInterface> nifs = NetworkInterface.getNetworkInterfaces();
while (nifs.hasMoreElements()) {
NetworkInterface nif = nifs.nextElement();
try {
// 获得与该网络接口绑定的 IP 地址
Enumeration<InetAddress> addresses = nif.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
// 只关心 IPv4 地址
if (addr instanceof Inet4Address) {
System.out.printf("网卡接口名称:%s%n", nif.getName());
System.out.printf("网卡接口地址:%s%n", addr.getHostAddress());
}
}
} catch (Exception e) {
// 如果某个网络接口抛出异常,继续尝试下一个接口
if (e.getMessage().contains("no such network interface")) {
continue;
}
throw e; // 如果是其他类型的异常,重新抛出
}
}
}
网卡接口名称:lo
网卡接口地址:127.0.0.1
网卡接口名称:wlan2
网卡接口地址:192.168.137.1 (即为机器在局域网内的 IP 地址)
网卡接口名称:eth10
网卡接口地址:10.10.2.129
Windows 平台上
wlan开头 表示局域网的网络接口
lo 表示本地回环地址
eth开头 表示VMware 创建的虚拟地址
[Q&A] Java 获取本机IP地址(windows or Linux)
原文链接:https://blog.csdn.net/f641385712/article/details/105233229
错误使用
InetAddress localHost = InetAddress.getLocalHost();
localHost.getHostAddress();
windows getHostAddress → 192.168.199.175
windows开一个vpn getHostAddress → 2.0.0.137
可以看到当出现多个网卡接口工作时,windows可能就不好使了
Linux getHostAddress → 127.0.0.1
/etc/hosts的第一行一般均是:127.0.0.1 localhost,所以返回值是127.0.0.1。
倘若你把第一行改为 127.1.1.1 localhost,那么它的返回值就是127.1.1.1了
推荐方案
此方法不管是windows 还是 Linux,亦或开启了vpn与否,都OK
// 获取本机IP地址
// 此方法不管是windows 还是 Linux,亦或开启了vpn与否,都OK
public static InetAddress getLocalHostAddress() throws SocketException, UnknownHostException {
InetAddress candidateAddress = null;
// 获得本机的所有网络接口
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface nif = networkInterfaces.nextElement();
// 获得与该网络接口绑定的IP地址,一般只有一个
Enumeration<InetAddress> addresses = nif.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress inetAddr = addresses.nextElement();
// 排除loopback环回类型地址(不管是IPv4还是IPv6 只要是回环地址isLoopbackAddress都会返回true)
if (!inetAddr.isLoopbackAddress()) {
if (inetAddr.isSiteLocalAddress()) {
// 如果是site-local地址,就是它了 就是我们要找的
// ~~~~~~~~~~~~~绝大部分情况下都会在此处返回你的ip地址值~~~~~~~~~~~~~
return inetAddr;
}
// 若不是site-local地址 那就记录下该地址当作候选
if (candidateAddress == null) {
candidateAddress = inetAddr;
}
}
}
}
// 如果除了环回地之外无其它地址了,那就回退到原始方案吧
return candidateAddress == null ? InetAddress.getLocalHost() : candidateAddress;
}
InetAddress localHostAddress = fetchLocalIpAddress();
System.out.println("网卡接口地址:" + localHostAddress.getHostAddress());
网卡接口地址:192.168.1.109