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/