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

标签 java networking sockets hostname ports

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/

相关文章:

java - 如何自动注册新的子类?

java - Spring Security 4中如何根据角色授权链接

c - 'memcpy'(合并两个结构)

javascript - Stripe 连接 |帐号 ID 可以安全公开吗?

java - 简单的 Web 服务器在收到 http 请求时挂起

C++ 守护程序日志功能不写入文件(段错误?)

java - 如何调用这个实例方法

java - 如何使用JCOP专有方法返回可用内存?

Java获取断开连接的卡的mac地址

c select() 读取直到空字符