2017-02-13 13 views
0

Когда я пытаюсь подключиться к сокету (действительный ip: порт) UnknownHostException выбрасывается случайным образом!UnknownHostException вызывается при подключении к действительному порту ip

Socket socket = new Socket(); 
socket.connect(new InetSocketAddress(ipAddress, port), 1000); 

Наша локальная среда приложения /etc/resolve.conf конфигурируется с Ipaddress нашего локального сервера имен, с этой конфигурацией UnknownHostException происходит случайным образом (почти в соотношении 50:50).

Но когда записи resolve.conf очищаются и остаются пустыми, неизвестно. Не удалось исключить событие NothingHostException, и соединение сокета плавно установлено.

Как я могу решить эту проблему, так как это невозможно также оставить запустите.

ОС: CentOS 7

+0

Почему вы считаете, что проблема связана с приложением? Похоже, что namserver является виновником. – Malt

+0

@Malt Да, сервер имен может быть виновником, но используя конструктор 'InetSocketAddress (String hostname, int port)' и имеющий ненужные запросы ipAddress, дал UnknownHostException. – technaren

ответ

1

Обычно файл resolv.conf заполняется вашим клиентом DHCP. Если вы видите содержание этого файла, оно может начинаться с

; generated by /sbin/dhclient-script

Не рекомендуется вручную отредактировать этот файл. Этот файл указывает на DNS (или несколько DNS-серверов), и если вы собираетесь использовать разрешение DNS, то правильное сопоставление должно существовать в DNS.

В вашем примере вы не указываете, какой тип переменной ipAddress. Поведение, которое вы описываете, указывает, что вы ipAddress переменная - это строка. Это приведет к тому, что конструктор InetSocketAddress попытается разрешить имя узла, что может привести к поведению, которое вы испытываете.

Мои предложения являются:

  • Если вы собираетесь использовать IP-адрес, вы должны убедиться, что InetSocketAddress получает java.net.InetAddress объект. Если вы посмотрите на эту страницу API, вы увидите, что есть два свойства, которые могут изменять поведение кеширования имени имени узла.
  • Если вы собираетесь иметь сопоставления имен ip/host на сервере, альтернативой будет редактирование вашего файла/etc/hosts, чтобы содержать сопоставления.

Из API Java. Это свойство, которые управляют хост поведением кэширования разрешения имен:

Два Java свойство безопасности контролировать значение TTL, используемое для положительного и отрицательного кэширования хоста разрешения имен:

networkaddress.cache.ttl Обозначает политика кэширования для успешного поиска имен пользователей из службы имен . Значение указано как integer, чтобы указать количество секунд для кэширования успешного поиска . По умолчанию используется кеш для определенного периода реализации . Значение -1 указывает «кеш навсегда».

networkaddress.cache.negative.ttl (по умолчанию: 10) Указывает политику кэширования для неудачных поисков имен из службы имен. Значение указано как целое число, указывающее количество секунд для кэширования сбой для неудачных поисков. Значение 0 указывает «никогда не кеш». Значение -1 указывает «кеш навсегда».

Надеюсь, это поможет.

+0

Спасибо @Javier. Да, у меня был ipAddress как String и две разные записи сервера имен в файле resolv.conf. Иногда String ipAddress получил разрешение на действительный ip, и иногда он получил неудачу. Таким образом, ненужный поиск DNS дал UnknownHostException, используя этот конструктор 'InetSocketAddress (InetAddress addr, int port)' вместо 'InetSocketAddress (String hostname, int port)' должен решить моя проблема. Спасибо за ваши старания. – technaren