2011-04-08 7 views
24

피어 투 피어 인스턴트 메시징 응용 프로그램을 만들고 있습니다.원격 컴퓨터에서 볼 수있는 로컬 컴퓨터의 DNS 이름 가져 오기

현재 UserA.pool.net이 UserB.pool.net에 "hello"라고 말하면 사용자 A는 "You : hello"를보고 사용자 B는 "UserA.pool.net : hello"를 봅니다. 사용자 A가 "당신은"나는 그 사용자 A가 사용자 B와 같은 텍스트를 볼 수 있도록 그들을

+3

[Java 현재 컴퓨터 이름 및 로그인 한 사용자가 있습니까?] (http://stackoverflow.com/questions/473446/java-current-machine-name-and-logged-in-user) –

+0

약간의 문제입니다. Jonathon보다 더 복잡합니다. NAT 레이어 뒤에 있다면 사용자 A와 사용자 B는 똑같은 것을 보지 못할 것입니다. –

+2

맞습니다. 각 참가자는 자신의 (내부) 호스트 이름을 상대방에게보고해야합니다. –

답변

14

정말로 사용자 A와 사용자 B가 동일한 텍스트를 보게하려는 경우 호스트 이름을 직접 알아낼 수는 없습니다. 사용자 A의 호스트 이름에 대한 사용자의보기를 사용자 A에게 전달하고 그 반대의 경우에는 사용자 B의 호스트 이름보기를 사용자 A에게 전송해야합니다. NAT로 인해 자신의 컴퓨터 호스트 이름을 확인할 수 없습니다.

(Jonathon이 질문 주석에서 나를 괴롭혔습니다.) 각 사용자가 연결 핸드 셰이크의 일부로 자신의 개인 호스트 이름을 보내고이를 원격 끝에있는 메시지를 인쇄하는 데 사용할 수 있습니다.

14

내가 로컬 컴퓨터의 호스트 이름을 늘어 놓던 자신의 시스템의 호스트 이름을보고 싶어보고보다는

이런 식으로 뭔가를 사용하여 과거 :

InetAddress addr = InetAddress.getLocalHost(); 

String hostname = addr.getHostName(); 
당신은 참조 할 수

: java.net.InetAddress의 이러한 기능을 참조하십시오 InetAddress.getHostName()

79

-getLocalHostgetHostName :

String localhostname = java.net.InetAddress.getLocalHost().getHostName(); 

기계가 자체적으로 볼 때 호스트 이름을 가져옵니다. 다른 사람은 다른 사람과 그것을 볼 수 있습니다 (예 : 로컬 hosts 파일이 DNS와 다른 것을 말합니다). 다시 말해, 시스템 A가 시스템 A, 시스템 B 또는 시스템 C와 동일한 호스트 이름으로 표시된다는 보장은 없습니다.

@biniam_Ethiopia는 지적했듯이, 네트워크 기반 이름 확인 (예 : here)을 사용하는 것과 같은 컴퓨터에서 다른 프로그램의 결과와 동일합니다.

piskvor 대신 전체 식별자 ([email protected])를 보내는 것이 더 유용 할 수 있습니다.

+1

이것은 특정 조건 하에서 이상적이지 않습니다. 특히 InetAddress.getLocalHost()는 현재 호스트 이름이 설정되었지만 로컬 DNS 서버에서 인식 할 수없는 경우 예외를 발생시킵니다. 귀찮게도 InetAddress의 내부에서 데이터를 긁어 내기 위해 리플렉션을 사용하지 않으면 사용할 수있는 해결 방법이 없습니다. –

+0

호스트에 여러 개의 NIC가 있고 여러 개의 이름과 IP 주소가 있으면 어떻게됩니까? 어떤 이름이 반환됩니까 ?? – Lawrence

+0

@Lawrence : 나는 이것에 대한 정의 된 명령이 있다고 생각하지 않습니다. 당신은 그것들 중 하나를 얻을 수 있습니다. – Piskvor

5

getCanonicalHostName()을 사용하여 도메인 이름도 포함하는 완전한 호스트 이름을 가져와야 할 수도 있습니다.

코드 - 문자열 fullHostName = java.net.InetAddress.getLocalHost(). getCanonicalHostName();

관련 문제