linux中InetAddress.getLocalHost() 出现异常

 

使用:InetAddress.getLocalHost() 出现异常:
“Reason: java.net.UnknownHostException zw_65_43 : .....
 
问题原因是在系统的 /etc/Hostname中配置了“zw_65_43” 作为主机名,
而在/etc/hosts文件中没有 相应的“zw_65_43”。
简单的解决办法是对应关系配好就可以,甚至删除/etc/Hostname这个文件也可以。
 
深层的原因: 在大多数Linux操作系统中,都是以/etc/hosts中的配置查找主机名的,
但是 Detian based system 用/etc/Hostname文件中的配置做主机名。
而Java 的InetAddress.java 调用 InetAddressImpl.java 的   
public native String getLocalHostName() throws UnknownHostException; 来获取本地主机名, 
Java 的这个方法是native的,是本地系统的一个实现,所以在本地配置出现问题的情况下,Java 代码出现问题。

或使用下面的解决方案

 

package org.jasig.cas.a4.tools;

import java.net.*;
import java.util.*;

public class IPUtil {

	public static String getMacAddr() {
		String MacAddr = "";
		String str = "";
		try {
			NetworkInterface NIC = NetworkInterface.getByName("eth0");
			byte[] buf = NIC.getHardwareAddress();
			for (int i = 0; i < buf.length; i++) {
				str = str + byteHEX(buf[i]);
			}
			MacAddr = str.toUpperCase();
		} catch (SocketException e) {
			e.printStackTrace();
			System.exit(-1);
		}
		return MacAddr;
	}

	public static String getLocalIP() {
		String ip = "";
		try {
			Enumeration<?> e1 = (Enumeration<?>) NetworkInterface
					.getNetworkInterfaces();
			while (e1.hasMoreElements()) {
				NetworkInterface ni = (NetworkInterface) e1.nextElement();
				if (!ni.getName().equals("eth0")) {
					continue;
				} else {
					Enumeration<?> e2 = ni.getInetAddresses();
					while (e2.hasMoreElements()) {
						InetAddress ia = (InetAddress) e2.nextElement();
						if (ia instanceof Inet6Address)
							continue;
						ip = ia.getHostAddress();
					}
					break;
				}
			}
		} catch (SocketException e) {
			e.printStackTrace();
			System.exit(-1);
		}
		return ip;
	}

	/* 一个将字节转化为十六进制ASSIC码的函数 */
	public static String byteHEX(byte ib) {
		char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',
				'b', 'c', 'd', 'e', 'f' };
		char[] ob = new char[2];
		ob[0] = Digit[(ib >>> 4) & 0X0F];
		ob[1] = Digit[ib & 0X0F];
		String s = new String(ob);
		return s;
	}

	public static void main(String[] args) {
		IPUtil t = new IPUtil();
		System.out.println(t.getLocalIP());
		System.out.println(t.getMacAddr());
	}
}

 

 

你可能感兴趣的:(InetAddress)