gpt4 book ai didi

Java:验证 "host:port"并将其转换为 InetSocketAddress 的常用方法?

转载 作者:IT老高 更新时间:2023-10-28 21:13:50 33 4
gpt4 key购买 nike

Java 中验证 host:port 形式的字符串并将其转换为 InetSocketAddress 实例的常用方法是什么?

如果满足以下条件就好了:

  • 没有地址查找;

  • 适用于 IPv4、IPv6 和“字符串”主机名;
    (对于 IPv4,它是 ip:port,对于 IPv6,它是 [ip]:port,对吗?是否有一些 RFC 定义了所有这些方案?)

  • 最好不用手动解析字符串。
    (我正在考虑所有这些特殊情况,当有人认为他知道所有有效形式的套接字地址时,却忘记了导致意外结果的“那种特殊情况”。)

最佳答案

我自己提出了一种可能的解决方法。

将字符串转换为 URI(这将自动对其进行验证),然后查询 URI 的主机和端口组件。

遗憾的是,带有主机组件的 URI 必须有一个方案。这就是为什么这个解决方案“不完美”的原因。

String string = ... // some string which has to be validated

try {
// WORKAROUND: add any scheme to make the resulting URI valid.
URI uri = new URI("my://" + string); // may throw URISyntaxException
String host = uri.getHost();
int port = uri.getPort();

if (uri.getHost() == null || uri.getPort() == -1) {
throw new URISyntaxException(uri.toString(),
"URI must have host and port parts");
}

// here, additional checks can be performed, such as
// presence of path, query, fragment, ...


// validation succeeded
return new InetSocketAddress (host, port);

} catch (URISyntaxException ex) {
// validation failed
}

此解决方案不需要自定义字符串解析,适用于 IPv4 (1.1.1.1:123)、IPv6 ([::0]:123) 和 主机名 (my.host.com:123)。

意外的是,这个解决方案非常适合我的场景。反正我打算使用 URI 方案。

关于Java:验证 "host:port"并将其转换为 InetSocketAddress 的常用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2345063/

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