자바,linux 서버 의 IP 가 져 오기
5093 단어 자바 네트워크 프로 그래 밍
public static String getIpAddress() {
String hostAddress = "";
try {
InetAddress address = InetAddress.getLocalHost();
hostAddress = address.getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return hostAddress;
}
이렇게 Liux 에서 얻 은 것 은 127.0.0.1 입 니 다.
검색 서버 에서 IP 발견:
[mm_cbms1@localhost ~]$ ip address1: lo: mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever2: eth0: mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:50:56:a2:0d:1b brd ff:ff:ff:ff:ff:ff inet 10.12.8.243/24 brd 10.12.8.255 scope global eth0 inet6 fe80::250:56ff:fea2:d1b/64 scope link
valid_lft forever preferred_lft forever
여기 서 먼저 위 에 열거 한 인터페이스의 의 미 를 알 아야 한다.
1.Liux 의 네트워크 인터페이스 문맹 퇴치(1)네트워크 인터페이스의 이름 은 일정한 명명 규범 이 존재 하지 않 지만 네트워크 인터페이스 이름 의 정 의 는 일반적으로 의미 가 있어 야 한다.예 를 들 어 eth 0:ethernet 의 약자 로 보통 이 더 넷 인터페이스 에 사용 된다.와 이 파이 0:와 이 파 이 는 무선 랜 이기 때문에 와 이 파이 0 은 일반적으로 무선 네트워크 인 터 페 이 스 를 가리킨다.ath 0:Atheros 의 약자 로 일반적으로 Atheros 칩 에 포 함 된 무선 네트워크 인 터 페 이 스 를 말한다.lo:local 의 약자,일반적으로 로 컬 링 인 터 페 이 스 를 말 합 니 다.(2)네트워크 인터페이스 가 어떻게 작 동 하 는 지 네트워크 인 터 페 이 스 는 패 킷 을 보 내 고 받 아들 이 는 기본 장치 이다.시스템 의 모든 네트워크 인 터 페 이 스 는 하나의 체인 구 조 를 구성 하고 응용 층 프로그램 이 사용 할 때 이름 에 따라 호출 된다.모든 네트워크 인 터 페 이 스 는 Liux 시스템 에서 하나의 struct net 에 대응 합 니 다.device 구조 체,name,mac,mask,mtu...정 보 를 포함 합 니 다.모든 하드웨어 네트워크 카드(MAC)는 네트워크 인터페이스 에 대응 하고 그 작업 은 완전히 해당 하 는 드라이버 에 의 해 제어 된다.(3)가상 네트워크 인터페이스 가상 네트워크 인터페이스의 응용 범 위 는 매우 광범 위 하 다.가장 유명한 것 은 바로'lo'입 니 다.기본적으로 모든 Liux 시스템 에 이 인터페이스 가 있 습 니 다.가상 네트워크 인 터 페 이 스 는 외부 에서 패 킷 을 받 고 보 내 는 것 이 아니 라 시스템 내부 에서 패 킷 을 받 고 보 내 는 것 이기 때문에 가상 네트워크 인 터 페 이 스 는 드라이버 가 필요 없다.가상 네트워크 인터페이스 와 실제 존재 하 는 네트워크 인 터 페 이 스 는 사용 에 있어 서 일치한다.(4)네트워크 인터페이스의 하드웨어 네트워크 카드 를 만 드 는 네트워크 인 터 페 이 스 는 드라이버 에 의 해 만들어 진다.가상 네트워크 인 터 페 이 스 는 시스템 에서 만 들 거나 응용 프로그램 을 통 해 만 듭 니 다.구동 중 네트워크 인 터 페 이 스 를 만 드 는 함 수 는:registernetdev(struct net_device*)또는 registernetdevice(struct net_device *)。이 두 함수 의 차 이 는:registernetdev(...)는"eth"를 시작 이름 으로 하 는 인터페이스 가 자동 으로 생 성 되 며,registernetdevice(...)는 인터페이스 이름 을 미리 지정 해 야 합 니 다.사실 registernetdev(...)도 register 호출 을 통 해netdevice(...)가 실 현 했 습 니 다.2.LINUX 의 lo(루프 인터페이스)1)는 LO 인터페이스 가 무엇 입 니까?LINUX 시스템 에 서 는 네트워크 인터페이스 eth 0 을 제외 하고 다른 인터페이스 도 있 을 수 있 습 니 다.예 를 들 어 lo(로 컬 순환 인터페이스).
2)LO 인터페이스의 역할 은 무엇 입 니까?
가방 이 로 컬 프로 세 스 가 다른 로 컬 프로 세 스 로 만들어 진 것 이 라면 외출 체인 의'lo'인 터 페 이 스 를 통 해 체인 에 들 어간'lo'인 터 페 이 스 를 되 돌려 줍 니 다.
사실 getLocalhost 방법 은 lo 인터페이스 에 대응 하 는 IP 주 소 를 얻 었 습 니 다.상기 문 제 를 알 게 되 었 습 니 다.자바 인 코딩 은 어떻게 정확 한 주 소 를 얻 습 니까?
자바 는 네트워크 프로 그래 밍 을 편리 하 게 하기 위해 IP 주 소 를 나타 내 는 클래스,네트워크 인터페이스(이 인 터 페 이 스 는 네트워크 카드)를 나타 내 는 클래스 를 제공 합 니 다.예 를 들 어 InetAddress 를 나타 내 는 클래스 입 니 다.그러나 테스트 결과 NetworkInterface 류 역시 로 컬 컴퓨터 네트워크 인터페이스 와 관련 된 정 보 를 얻 는 방법 을 제공 한 것 으로 나 타 났 습 니 다.InetAddress 류 는 IP 주 소 를 얻 는 방법 을 제공 하지만 이 컴퓨터 의 네트워크 인터페이스 에 대한 상세 한 정 보 를 얻 으 려 면 NetworkInterface 인터페이스 에 의존 하 는 방법 이 필요 합 니 다.테스트 결과 다음 방법 으로 서버 에 대응 하 는 IP 주 소 를 얻 을 수 있 으 며,Liux 서버 와 로 컬 테스트 를 통과 할 수 있 습 니 다.
(1)
public static String getInet4Address() {
Enumeration nis;
String ip = null;
try {
nis = NetworkInterface.getNetworkInterfaces();
for (; nis.hasMoreElements();) {
NetworkInterface ni = nis.nextElement();
Enumeration ias = ni.getInetAddresses();
for (; ias.hasMoreElements();) {
InetAddress ia = ias.nextElement();
//ia instanceof Inet6Address && !ia.equals("")
if (ia instanceof Inet4Address && !ia.getHostAddress().equals("127.0.0.1")) {
ip = ia.getHostAddress();
}
}
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ip;
}
(2)
public static InetAddress getCurrentIp() {
try {
Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) networkInterfaces.nextElement();
Enumeration nias = ni.getInetAddresses();
while (nias.hasMoreElements()) {
InetAddress ia = (InetAddress) nias.nextElement();
if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) {
return ia;
}
}
}
} catch (SocketException e) {
logger.error(e.getStackTrace());
}
return null;
}
상기 두 가지 방법 은 모두 정확 한 IP 주 소 를 얻 을 수 있 고 구체 적 인 NetworkInterface 의 사용 은 나중에 응용 하여 깊이 연구 해 야 한다.