InetAddress.getByName()处理带路径链接报UnknownHostException的问题咨询
关于
InetAddress.getByName()的使用限制与解决办法 首先直接给结论:InetAddress.getByName()只能解析纯主机名或IP地址,完全无法处理包含协议(如https://)、路径(如/questions)的完整URL。
你遇到UnknownHostException的原因很直白:当你传入https://stackoverflow.com/questions这类字符串时,方法会把整个内容当作"主机名"去做DNS查询——显然不存在叫https://stackoverflow.com/questions的主机,自然解析失败。哪怕是https://stackoverflow.com也不行,因为https://不属于主机名的一部分。
解决建议
要正确处理带路径的URL,你需要先把URL拆解,提取出其中的主机部分,再传给InetAddress.getByName()。Java自带的java.net.URL类就能帮你轻松完成这个工作:
解析URL,提取主机和端口
用URL类解析输入的字符串,通过getHost()获取纯主机名,getPort()获取端口(如果URL里没指定端口,getPort()会返回-1,这时候你可以根据协议用默认端口:HTTPS用443,HTTP用80)。完整示例代码
try { String inputAdr = "https://stackoverflow.com/questions"; // 第一步:解析URL URL url = new URL(inputAdr); String host = url.getHost(); // 处理端口:如果URL没指定,用对应协议的默认端口 int port = url.getPort() != -1 ? url.getPort() : 443; // HTTPS默认443,HTTP则用80 // 第二步:正常创建Socket Socket socket = new Socket(InetAddress.getByName(host), port); // 这里可以继续你的socket操作... } catch (MalformedURLException e) { // 处理输入不是合法URL的情况 System.err.println("输入的地址不是有效的URL格式"); e.printStackTrace(); } catch (UnknownHostException e) { // 处理主机无法解析的情况 System.err.println("无法解析指定的主机"); e.printStackTrace(); } catch (IOException e) { // 处理socket连接异常 e.printStackTrace(); }额外提示
如果你的输入可能混合了纯主机名(比如stackoverflow.com)和完整URL,你可以先判断字符串是否包含://,如果没有的话直接当作主机名处理,避免抛出MalformedURLException。
内容的提问来源于stack exchange,提问作者Mase
相关产品推荐
相关产品推荐

