gpt4 book ai didi

java - 为什么 inet :/0. 0.0.0 被解释为 inet :/0:0:0:0:0:0:0:0 by com. sun.net.httpserver.HttpServer?

转载 作者:搜寻专家 更新时间:2023-11-01 03:13:57 25 4
gpt4 key购买 nike

我们在使用部署在 Glassfishv2.1 服务器上的 JAX-WS 堆栈为 WS 端点实现重新连接逻辑时发现了这个问题。我们在集群环境中部署 Web 服务。为了简化部署,我们使用 0.0.0.0 作为需要发布端点的 IP,以便可以从属于集群节点的所有可用 IP 访问它。以下是 WS(Web Service) 初始化的代码片段:

 import javax.xml.ws.Endpoint;
.
.
//Implementor is the corresponding implementation object for the WS
Endpoint receiver = Endpoint.create(new Implementor());
.
receiver.setExecutor(threadPoolExecutor);
receiver.publish ("http://0.0.0.0:9545/context");

我们在清理代码中调用 receiver.stop() 来停止发布端点。这就是我们收到带有以下堆栈跟踪的空指针异常的地方:

java.lang.NullPointerException
at com.sun.xml.ws.transport.http.server.ServerMgr.removeContext(ServerMgr.java:123)
at com.sun.xml.ws.transport.http.server.HttpEndpoint.stop(HttpEndpoint.java:110)
at com.sun.xml.ws.transport.http.server.EndpointImpl.stop(EndpointImpl.java:167

在尝试查找 NPE 的原因时,我们发现 ServerMgr 类依赖于监听 WS 端点发布的 URL 的 ip:port 的 HttpServer 的 InetSocketAddress,以从 map 。由于 inet 地址“inet:/0.0.0.0”被解释为“inet:/0:0:0:0:0:0:0:0”,因此无法在映射中找到条目,因此无法找到 NPE。 Here is the source code of ServerMgr.

为了证明这确实是问题所在,我们尝试将与InetSocketAddress相关的ServerMgr代码的逻辑复制为以下程序:

import com.sun.net.httpserver.HttpContext;
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {
static final String URL_1 = "http://0.0.0.0:9545/context";

static final String URL_2 = "http://127.0.0.1:9548/context";
static final String URL_3 = "http://10.226.90.217:9549/context";

public void testUrl(String address){
try {
URL url = new URL(address);
Map<InetSocketAddress, Integer> map = new HashMap<InetSocketAddress, Integer>();

InetSocketAddress iaddr = new InetSocketAddress(url.getHost(), url.getPort());
map.put(iaddr, 1);

HttpServer server = HttpServer.create(iaddr, 5);
HttpContext context = server.createContext(url.toURI().getPath());
server.start();
System.out.println("original inet:"+iaddr+" and final inet:"+context.getServer().getAddress());
if(iaddr.equals(context.getServer().getAddress())){
System.out.println("equal");
Integer t = map.get(context.getServer().getAddress());
if( t == null){
System.out.println("You won");
}else{
System.out.println("You lose "+t);
}
}else{
System.out.println("not-equal");
}
server.stop(0);
map.clear();

} catch (URISyntaxException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(String[] args)
{

Main d = new Main();
d.testUrl(Main.URL_1);
d.testUrl(Main.URL_2);
d.testUrl(Main.URL_3);


}

}

奇怪的是,我们在我的 WindowsXP 机器(Java 版本 1.6.0_22)中获得了以下结果

 equal--
original inet:/0.0.0.0:9545 and final inet:/0.0.0.0:9545
equal
You lose 1
equal--
original inet:/127.0.0.1:9548 and final inet:/127.0.0.1:9548
equal
You lose 1
equal--
original inet:/10.226.92.47:9549 and final inet:/10.226.92.47:9549
equal
You lose 1

以及我的开发箱上的以下输出(Linux tahoe 2.6.9-67.EL #1 Wed Nov 7 13:43:31 EST 2007 x86_64 x86_64 x86_64 GNU/Linux)(Java 版本 1.6.0_17)

run:
original inet:/0.0.0.0:9545 and final inet:/0:0:0:0:0:0:0:0:9545
not-equal
original inet:/127.0.0.1:9548 and final inet:/127.0.0.1:9548
equal
You lose 1
original inet:/10.226.90.217:9549 and final inet:/10.226.90.217:9549
equal
You lose 1

根据背景——我有两个问题:

  • 一个。为什么0.0.0.0被解释作为 IPv6 地址? (另外,是不是有问题使用操作系统还是 JRE?是不是bug或功能?等)
  • b。我们有办法配置吗JRE 将 0.0.0.0 解释为 IPv4 地址?(我们想继续使用 0.0.0.0 作为端点地址,因为它简化了部署我们的网络服务)

最佳答案

您可以将 0.0.0.0 替换为 InetAddress.getLocalHost().getHostAddress();它会自动正确解析,不需要 -Djava.net.preferIPv4Stack=true

关于java - 为什么 inet :/0. 0.0.0 被解释为 inet :/0:0:0:0:0:0:0:0 by com. sun.net.httpserver.HttpServer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4044306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com