首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不正确的IP地址返回Java程序和运行在tomcat中的代码

不正确的IP地址返回Java程序和运行在tomcat中的代码
EN

Stack Overflow用户
提问于 2017-06-18 19:18:17
回答 1查看 399关注 0票数 1

OS:运行在tomcat中的Red Hat Enterprise Linux Server release 6.6 (Santiago)、Java、jdk1.8.0_45独立程序和代码对少数主机名返回错误的IP地址。在同一台机器上通过dig和nslookup返回正确的IP。使用strace -s 2048 -o strace_log -ff不会产生任何有用的故障排除信息。使用-Dsun.net.spi.nameservice.nameservers=8.8.8.8或本地DNS服务器(由nslookup和dig使用)返回相同的不正确地址。

代码语言:javascript
运行
复制
[INFO]  sun.net.InetAddressCachePolicy.get() = 30
[INFO]  sun.net.spi.nameservice.provider.1 = null
[INFO]  sun.net.spi.nameservice.nameservers = 8.8.8.8

使用泼尼斯瓦-Dsun.net.spi.nameservice.provider.1="dns,dnsjava"一起返回正确的IP地址。

如何检查java实际使用的名称服务器?或者还有更多的故障排除技术?

谢谢

Test.sh

代码语言:javascript
运行
复制
#!/bin/sh

HOST=REMOVED

NAMESERVER=LOCAL_NAME_SERVER_IP
NAMESERVER=8.8.8.8

# -Djava.net.preferIPv4Stack=true \ #-Dsun.net.spi.nameservice.nameservers=$NAMESERVER \
# -javaagent:dnslog.jar \
# -Dsun.net.spi.nameservice.provider.1="dns,dnsjava" \
# -cp ".:./dnsjava-2.1.8.jar" \

javac Test.java

rm strace_log.*
strace -s 2048 -o strace_log -ff java \
     -Djava.net.preferIPv4Stack=true \
     -Dsun.net.spi.nameservice.nameservers=$NAMESERVER \
     Test https://$HOST

dig $HOST > ${HOST}_dig.txt
nslookup $HOST > ${HOST}_nslookup.txt
java -cp "./dnsjava-2.1.8.jar" dig $HOST > ${HOST}_dnsjava.txt

Test.java

代码语言:javascript
运行
复制
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
import java.util.logging.*;

public class Test extends Formatter {

  public static void main(String[] args) throws Exception {

    Logger log = Logger.getLogger(Test.class.getName());
    log.setUseParentHandlers(false);

    ConsoleHandler handler = new ConsoleHandler();
    handler.setFormatter(new Test());
    log.addHandler(handler);

    log.info("sun.net.InetAddressCachePolicy.get() = " + sun.net.InetAddressCachePolicy.get());
    log.info("sun.net.spi.nameservice.provider.1 = " + System.getProperty("sun.net.spi.nameservice.provider.1"));
    log.info("sun.net.spi.nameservice.nameservers = " + System.getProperty("sun.net.spi.nameservice.nameservers"));

    try {
      if (args.length != 1 && args.length != 2) {
        log.warning("Usage: java Test <https://address.server.edu> [timeout]");
        return;
      }

      log.info("Received host address " + args[0]);
      URL constructedUrl = new URL(args[0]);
      String host = constructedUrl.getHost();

      InetAddress address = InetAddress.getByName(host);
      String ip = address.getHostAddress();
      log.info("Host = " + args[0] + " IP = " + ip);

      InetAddress Address = InetAddress.getLocalHost();
      log.info("InetAddress.getLocalHost() = " + Address);
      log.info("InetAddress.getCanonicalHostName() = " + Address.getCanonicalHostName());

      InetAddress SW[] = InetAddress.getAllByName(host);
      for (int i=0; i < SW.length; i++) {
        log.info("getAllByName[" + i + "] = " + SW[i]);
      }

      URLConnection conn = constructedUrl.openConnection();

      if (args.length == 2) {
        conn.setConnectTimeout(Integer.valueOf(args[1]) * 1000);
      } else {
        conn.setConnectTimeout(5000);
      }
      log.info("Setting connection timeout to " + conn.getConnectTimeout() / 1000 + " second(s).");

      log.info("Trying to connect to " + args[0]);
      InputStreamReader reader = new InputStreamReader(conn.getInputStream(), "UTF-8");
      BufferedReader in = new BufferedReader(reader);

      in.readLine();
      in.close();
      reader.close();

      log.info("Great! It worked.");

    } catch (Exception e) {
      log.info("Could not connect to the host address " + args[0]);
      log.info("The error is: " + e.getMessage());
      log.info("Here are the details:");
      log.log(Level.SEVERE, e.getMessage(), e);

      throw new RuntimeException(e);
    }
  }

  public String format(LogRecord record) {
    StringBuffer sb = new StringBuffer();

    sb.append("[");
    sb.append(record.getLevel().getName());
    sb.append("]\t");

    sb.append(formatMessage(record));
    sb.append("\n");

    return sb.toString();
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-19 19:31:44

通过重新启动nscd守护进程解决了问题。它有点挂起,因为很多nscd -i hosts都在运行,但它仍然在响应来自app的查询。这可能解释了为什么DNS TTLs没有被授予。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44618865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档