JAVA--取服务器IP地址方法

 

try {
   Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
   while (interfaces.hasMoreElements()) {
    NetworkInterface interfaceN = (NetworkInterface)interfaces.nextElement();
    Enumeration ienum = interfaceN.getInetAddresses();
    while (ienum.hasMoreElements()) {
     InetAddress ia = (InetAddress)ienum.nextElement();
     if(ia instanceof Inet4Address){
      if(ia.getHostAddress().toString().startsWith("127")) {
       continue;
      }
      else {
       System.out.println(ia.getHostAddress()+"---ipv4");
       break;
      }
      
     }
     //if(ia instanceof Inet6Address){
     // System.out.println(ia.getHostAddress()+"---ipv6");
     //}
     
    }
   }
  }


  catch (Exception e) {
   e.printStackTrace();
  }

 

linux windows下有些不同

 

 

 

 

---------------------------------

 

如何获取本机IP地址

Posted in Linux编程 by 王 聪 on the 7月 14th, 2007
作者:西邮 王聪

如何在程序中通过函数直接获取本机IP一直是讨论比较多的话题。我在做XylFTP项目的时候,碰巧编写了客户端和服务器端两边的获取本地IP的函数(方法)。

服务器端在处理PASV命令时,需要回复自己的IP和进行数据连接的端口。由于服务器端是用C语言编写,所以可以使用底层的操作来实现
。具体代码如下:

static int _get_local_ip_address(int sock, char* ip_addr)
{
	char *ip = NULL;
	int fd = sock, intrface;
	struct ifreq buf[MAX_INTERFACES];
	struct ifconf ifc;

	ifc.ifc_len = sizeof buf;
	ifc.ifc_buf = (caddr_t) buf;
	if (!ioctl(fd, SIOCGIFCONF, (char*)&ifc)) {
			intrface = ifc.ifc_len / sizeof(struct ifreq);
			while (intrface-- > 0) {
				if (!(ioctl(fd, SIOCGIFADDR, (char*)&buf[intrface]))) {
					ip = (inet_ntoa(((struct sockaddr_in*)(&buf[intrface].ifr_addr))->sin_addr));
					strcpy(ip_addr, ip);
					break;
				}
			}
	}
	return 0;
}

它使用了ioctl这个系统调用,主要是针对网卡驱动来使用。它的优点是即使本机有多个网卡,也可以正常工作。缺点是如果网卡驱动不支持ioctl操作,此函数则会失败。

客户端在发送PORT命令时,也需要带上自己的IP。由于客户端是用Java编写,所以不方便使用底层的方法,幸运的是Java的Socket类为我们
提供了一个getLocalAddress()方法。具体代码如下:

	public String GetSelfIP(){
		InetAddress ina;
		byte[] ipa;
		String ip = "";
		ina = CmdSocket.getLocalAddress();
		ipa = ina.getAddress();
		for (int i=0; i< 4; i++) {
			ip = ip + (((int)ipa[i])&0xff) + ",";	//I know we have 4 commas!
		}
		return ip;
	}

用这个方法获得IP的优点是简单,代码只有数行,但是它要求必须现建立Socket,否则得到的只是127.0.0.1。如果我们想不建立连接就获取
IP,此法就不能适用了。

后来,在和刘洋同学商量此问题时,见到了另一种在Java中获取本机IP的方法,用的是Java包装的NetworkInterface类,具体代码如下:

    public static InetAddress getLocalIp() {
		try {
			Enumeration
    
      interfaces = NetworkInterface.getNetworkInterfaces();
			while (interfaces.hasMoreElements()) {
				NetworkInterface interfaceN = (NetworkInterface)interfaces.nextElement();
				Enumeration
     
       ienum = interfaceN.getInetAddresses(); while (ienum.hasMoreElements()) { InetAddress ia = ienum.nextElement(); if(ia.getHostAddress().toString().startsWith(”127″)) { continue; } else { return ia; } } } } catch (Exception e) { System.err.println(e); e.printStackTrace(); } return null; } 
     
    

这种方法相对比较麻烦,和最上面的用C实现的方法有相似之处。但在合适的条件下,仍然可以选择使用。

还有没有其它方法?当然有!不过这些方法只能针对具体环境,比如,在局域网的UDP通信环境中如何不用NetworkInterface获得本机IP?一种解决方法是:先在局域网内进行广播,自己收到广播包后也可以获取自己的IP。刘洋同学给出的代码如下:

public class udpgetip {
        public static void main(String[] args) {
                InetAddress local = null;
                int port = new java.util.Random().nextInt(65535); 

                try {
                        DatagramSocket gsock = new DatagramSocket(port);
                        byte [] data = Integer.toString(port).getBytes();
                        DatagramPacket pkg = new DatagramPacket(data, data.length,
			InetAddress.getByName("255.255.255.255"), port);
                        DatagramSocket ssock = new DatagramSocket();
                        ssock.send(pkg);
                        ssock.close();
                        gsock.receive(pkg);
                        gsock.close();
                        local =
				InetAddress.getByAddress(InetAddress.getLocalHost().getHostName(), pkg.getAddress().getAddress());
                }
                catch (Exception e) {
                        System.err.println("Some error occured when geting local IP address.");
                }
                System.out.println(local);
        }
}

另一种方法是通过RARP,不过前提是此局域网里有一台RARP服务器。

http://www.xiyoulinux.cn/blog/?p=32

 

你可能感兴趣的:(java,exception,struct,socket,String,服务器)