GVKun编程网logo

您如何使用Java获取以太网地址?(您如何使用java获取以太网地址信息)

5

在这篇文章中,我们将带领您了解您如何使用Java获取以太网地址?的全貌,包括您如何使用java获取以太网地址信息的相关情况。同时,我们还将为您介绍有关bash–如何在给定ip地址的情况下获取以太网端口

在这篇文章中,我们将带领您了解您如何使用Java获取以太网地址?的全貌,包括您如何使用java获取以太网地址信息的相关情况。同时,我们还将为您介绍有关bash – 如何在给定ip地址的情况下获取以太网端口?、java-如何使用Android手机获取系统的IP地址?、java获取客户端真实IP地址?、使用Java 1.5在Windows中获取以太网适配器的IPv4地址的知识,以帮助您更好地理解这个主题。

本文目录一览:

您如何使用Java获取以太网地址?(您如何使用java获取以太网地址信息)

您如何使用Java获取以太网地址?(您如何使用java获取以太网地址信息)

我想检索用于访问特定网站的网络接口的以太网地址。

用Java如何做到这一点?

解决方案 请注意,公认的的解决方案getHardwareAddress仅在Java 6中可用。除了执行i(f |
p)confing,似乎没有Java 5的解决方案。

答案1

小编典典

java.net.NetworkInterface.getHardwareAddress(Java
6中添加的方法)

必须在您感兴趣的机器上调用它-
MAC不会跨网络边界(即LAN和WAN)传输。如果要在网站服务器上使用它来询问客户端,则必须运行一个小程序,该小程序将结果报告给您。

对于Java
5和更早的版本,我发现了各种系统上的命令行工具输出的代码解析输出。

bash – 如何在给定ip地址的情况下获取以太网端口?

bash – 如何在给定ip地址的情况下获取以太网端口?

我正在尝试编写一个bash脚本来获取我知道的IP地址的接口的以太网端口.我需要从ifconfig中获取它,但似乎无法弄清楚如何去做.有任何想法吗?

谢谢.

解决方法

有点乱,但应该工作:

/sbin/ifconfig | grep -B1 1.2.3.4 | awk '{print $1; exit}'

或者,您可以使用ip命令,当与-o | -oneline选项一起使用时,该命令更容易解析.例如

ip -o addr | awk '/1.2.3.4/{print $2}'

java-如何使用Android手机获取系统的IP地址?

java-如何使用Android手机获取系统的IP地址?

如何使用Android手机获取PC的IP地址? (特别是如何获取具有特定MAC地址的系统的IP地址,该系统的IP地址与Android手机位于同一网络上)?

       wired         wired    
modem--------router---------PC(mac:EE:00:B3:2F:56:12)
               |
               |
               |
             wireless
               |
               |
               |
               -------------android phone(A)  

解决方法:

private String getIP(String mac) {
  String ip = null;
  try {
    BufferedReader br = new BufferedReader(new FileReader("/proc/net/arp"));
    String line = "";
    while((line = br.readLine()) != null) {
      String[] tokens = line.split("\\s+");
      // The ARP table has the form:
      //   IP address        HW type    Flags     HW address           Mask   Device
      //   192.168.178.21    0x1        0x2       00:1a:2b:3c:4d:5e    *      tiwlan0
      if(tokens.length >= 4 && tokens[3].equalsIgnoreCase(mac)) {
        ip = tokens[0];
        break;
      }
    }
    br.close();
  }
  catch(Exception e) { Log.e(TAG, e.toString()); }
  return ip;
}

但要注意:除非您已经与PC建立联系(并且将需要其IP地址或名称),否则ARP表将为空.

我想您想反过来做,只知道其MAC地址就与PC建立连接.那不是那么简单.您可能试图对本地网络上的每个人执行ping操作(Runtime.getRuntime().exec(“ ping -b 192.168.178.255”);)只是为了填充ARP表.

或者,也许您可​​以从路由器中获取所有客户端及其IP地址的列表?

java获取客户端真实IP地址?

java获取客户端真实IP地址?

我想在服务器端获取浏览器的IP地址,google了一下几乎都是下面这种办法

下面是我的测试代码:

@RequestMapping(value="/ip",method=RequestMethod.GET)
    @ResponseBody
    public String getIP(HttpServletRequest request) throws IOException
    {
        String ip = getClientIpAddr(request);
        
        System.out.println(ip);
        
        return "<h1>"+ip+"</h1>";
    }
    
    private String getClientIpAddr(HttpServletRequest request) {  
        String ip = request.getHeader("X-Forwarded-For");  
        System.out.println(ip);
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("Proxy-Client-IP"); 
            System.out.println("1:"+ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("WL-Proxy-Client-IP");  
            System.out.println("2:"+ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_CLIENT_IP");  
            System.out.println("3:"+ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 
            System.out.println("4:"+ip);
        }  
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
            ip = request.getRemoteAddr();  
            System.out.println("5:"+ip);
        }  
        return ip;  
    }  

控制台:

null
1:null
2:null
3:null
4:null
5:127.0.0.1
127.0.0.1

String ip = request.getHeader("X-Forwarded-For");  
的值是null???

使用Java 1.5在Windows中获取以太网适配器的IPv4地址

使用Java 1.5在Windows中获取以太网适配器的IPv4地址

问题

我的Windows系统有多个以太网适配器.鉴于以太网适配器的名称,我需要找到它的IP地址.

例如,我系统的ipconfig命令的输出是:

Ethernet adapter GB1:

   Connection-specific DNS Suffix  . : 
   IP Address. . . . . . . . . . . . : 0.0.0.0
   subnet Mask . . . . . . . . . . . : 0.0.0.0
   Default Gateway . . . . . . . . . : 

Ethernet adapter SWITCH:

   Connection-specific DNS Suffix  . : 
   IP Address. . . . . . . . . . . . : 10.200.1.11
   subnet Mask . . . . . . . . . . . : 255.255.255.0
   IP Address. . . . . . . . . . . . : 10.200.1.51
   subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 

Ethernet adapter LAN:

   Connection-specific DNS Suffix  . : 
   IP Address. . . . . . . . . . . . : 10.1.2.62
   subnet Mask . . . . . . . . . . . : 255.255.254.0
   IP Address. . . . . . . . . . . . : 10.1.2.151
   subnet Mask . . . . . . . . . . . : 255.255.254.0
   Default Gateway . . . . . . . . . : 10.1.2.1

注意:我不必担心无线适配器或任何其他类型的适配器.我只需要为以太网适配器执行此操作.

对于这个系统,我需要编写一个行为如下所示的java类:

C:>java NametoIp GB1
0.0.0.0

C:>java NametoIp SWITCH
10.200.1.11
10.200.1.51

C:>java NametoIp LAN
10.1.2.62
10.1.2.151

什么行不通

使用java.net.NetworkInterface没有帮助.它的getName()和getDisplayName()方法不会打印出现在ipconfig输出或Windows网络连接中的适配器连接名称.它们会打印实际的设备名称.例如,请考虑以下代码:

import java.util.Enumeration;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.socketException;
import java.net.UnkNownHostException;

public class ListInterfaces 
{
    public static void main(String[] args) throws SocketException,UnkNownHostException {

        Enumeration<NetworkInterface> nwInterfaces = NetworkInterface.getNetworkInterfaces();

        while (nwInterfaces.hasMoreElements()) {

            NetworkInterface nwInterface = nwInterfaces.nextElement();
            System.out.print(nwInterface.getName() + ": " +
                             nwInterface.getdisplayName());

            Enumeration<InetAddress> addresses = nwInterface.getInetAddresses();
            while (addresses.hasMoreElements()) {
                InetAddress address = addresses.nextElement();
                System.out.print(" - " + address.getHostAddress());
            }
            System.out.println();
        }
    }
}

这将打印以下输出:

C:>java ListInterfaces
lo: MS TCP Loopback interface - 127.0.0.1
eth0: broadcom BCM5709C NetXtreme II GigE (Ndis VBD Client) # 
eth1: broadcom BCM5709C NetXtreme II GigE (Ndis VBD Client) #2 - 10.200.1.11 - 10.200.1.51
eth2: broadcom BCM5709C NetXtreme II GigE (Ndis VBD Client) #3 - 10.1.2.62 - 10.1.2.151

一个丑陋的黑客行事

我编写了一个丑陋的黑客,它从ipconfig的输出中提取指定适配器名称的IP地址.这是代码.

import java.util.ArrayList;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.IOException;

public class NametoIp
{
    public static ArrayList<String> getIP(String adapterName)
    throws IOException,InterruptedException
    {
        // Run the Windows 'ipconfig' command and get its stdout
        ProcessBuilder cmdBuilder = new ProcessBuilder("ipconfig");
        Process process = cmdBuilder.start();
        BufferedReader stdout = new BufferedReader(
                new InputStreamReader(process.getInputStream()));

        // Find the section for the specified adapter
        String line;
        boolean foundAdapter = false;
        while ((line = stdout.readLine()) != null) {
            line = line.trim();
            if (line.equals("Ethernet adapter " + adapterName + ':')) {
                foundAdapter = true;
                break;
            }
        }
        if (!foundAdapter) {
            process.waitFor();
            throw new IOException("Adapter not found");
        }

        // Find IP addresses in the found section
        ArrayList<String> ips = new ArrayList<String>();
        while ((line = stdout.readLine()) != null) {
            // Stop parsing if we reach the beginning of the next
            // adapter section in the output of ifconfig
            if (line.length() > 0 && line.charat(0) != ' ') {
                break;
            }

            line = line.trim();

            // Extract IP addresses
            if (line.startsWith("IP Address.") ||
                line.startsWith("IPv4 Address.")) {

                int colonIndex;
                if ((colonIndex = line.indexOf(':')) != 1) {
                    ips.add(line.substring(colonIndex + 2));
                }
            }
        }
        process.waitFor();

        return ips;
    }

    public static void main(String[] args)
    throws IOException,InterruptedException
    {
        // Print help message if adapter name has not been specified
        if (args.length != 1) {
            StackTraceElement[] stack = Thread.currentThread().getStackTrace();
            String prog = stack[stack.length - 1].getClassName();

            System.err.println("Usage: java " + prog + " ADAPTERNAME");
            System.err.println("Examples:");
            System.err.println("  java " + prog +" \"Local Area Connection\"");
            System.err.println("  java " + prog +" LAN");
            System.err.println("  java " + prog +" SWITCH");
            System.exit(1);
        }

        ArrayList<String> ips = getIP(args[0]);
        for (String ip: ips) {
            System.out.println(ip);
        }
    } 
}

有没有更好的方法来解决这个问题?

解决方法

创建一个使用Windows API查询本地以太网地址并使用JNI调用dll的DLL.

关于您如何使用Java获取以太网地址?您如何使用java获取以太网地址信息的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于bash – 如何在给定ip地址的情况下获取以太网端口?、java-如何使用Android手机获取系统的IP地址?、java获取客户端真实IP地址?、使用Java 1.5在Windows中获取以太网适配器的IPv4地址等相关内容,可以在本站寻找。

本文标签: