Получить DNS-имя локального компьютера, как видно на удаленной машине

Я делаю одноранговое приложение для обмена мгновенными сообщениями.

В настоящее время, если UserA.pool.net говорит "привет" UserB.pool.net, пользователь A видит "You: hello", а пользователь B видит "UserA.pool.net: hello".

Вместо того, чтобы пользователь A видит "вы", я хочу, чтобы они увидели имя хоста своей собственной машины, чтобы пользователь A увидел тот же текст, что и пользователь B.

Ответ 1

Короткий ответ заключается в том, что если вы действительно хотите, чтобы User A и User B отображали один и тот же текст, вы не можете рассчитывать на собственное имя хоста. Вам нужно, чтобы Пользователь B передал свое представление имени пользователя A для пользователя A и наоборот. Из-за NAT вы не сможете просто проверить собственное имя компьютера.

В качестве альтернативы (Jonathon избил меня в этом вопросе) вы можете, чтобы каждый пользователь отправил собственное личное имя хоста в качестве части сообщения об установлении соединения и использовал его для печати сообщений на удаленном конце.

Ответ 2

Смотрите эти функции java.net.InetAddress - getLocalHost и getHostName:

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

Обратите внимание, что это дает вам имя хоста, поскольку машина видит себя; другие могут видеть это с другим (например, локальный файл hosts говорит нечто иное, чем DNS). Другими словами, не гарантируется, что машина A будет видна с тем же именем хоста от машины A, машины B или машины C.

Как отмечает @biniam_Ethiopia, даже не гарантировано, что вы получите тот же результат от разных программ на одном компьютере, поскольку они могут использовать разрешение имен на основе сети (например, здесь).

Может быть более полезным отправить весь идентификатор: [email protected], а не просто piskvor.

Ответ 3

Я получил имя хоста на локальной машине в прошлом, используя что-то вроде этого:

InetAddress addr = InetAddress.getLocalHost();

String hostname = addr.getHostName();

Вы можете ссылаться на: InetAddress.getHostName()

Ответ 4

Вам может понадобиться использовать getCanonicalHostName(), чтобы получить полное имя хоста, которое также включает имя домена.

Код - Строка fullHostName = java.net.InetAddress.getLocalHost(). GetCanonicalHostName();

Ответ 5

Это не идеально при определенных условиях. В частности, InetAddress.getLocalHost() будет генерировать исключение, если текущее имя хоста установлено, но не распознано локальным сервером DNS. Раздражательно нет обходного пути, не использующего отражение, чтобы очистить данные от внутренних компонентов InetAddress.