Java 如何检测互联网接入?
我需要创建一个可靠的测试,看看当前主机是否可以使用HTTP(端口80)或HTTPS(端口443)访问公共互联网Java 如何检测互联网接入?,java,c#,networking,connection,Java,C#,Networking,Connection,我需要创建一个可靠的测试,看看当前主机是否可以使用HTTP(端口80)或HTTPS(端口443)访问公共互联网 这不是一个编程语言问题。我把那部分搞定了 我的想法是,我将在公共互联网上测试 他永远活着 可以响应HTTP或HTTPS请求 可以快速响应(我想我会做一个HEAD请求以保持较小的响应) 也将存在于可预见的未来 那个终点会是什么?是否有一些官方服务器可以做出上述承诺,例如w3.org提供的东西?(我知道人们倾向于使用www.google.com或类似的网站,但我觉得这不是一个好的解决方案,
这不是一个编程语言问题。我把那部分搞定了 我的想法是,我将在公共互联网上测试
www.google.com
或类似的网站,但我觉得这不是一个好的解决方案,或者?)
我的进一步想法是:
- 不要使用ping测试之类的测试,因为ICMP被许多人阻止 防火墙
- 可能需要是真正的HTTP/HTTPS请求才能通过 潜在的防火墙。如果存在以下情况,则普通套接字测试可能会给出错误的结果: 中间有防火墙。所以我要做一个真正的HTTP/HTTPS测试。我的HTTPS测试将忽略证书,因为这不是我想要测试的
- 无论我做什么,我都会间接地测试名称解析(除非我是针对一个我认为不太可能的IP地址进行测试)。这没关系。在任何情况下,名称解析也是“互联网连接”的一部分
google.com
发送一个HTTP HEAD请求。我的请求将具有HTTP头元素缓存控制:无缓存
,希望避免中间代理从自己的缓存中应答我。然后,我将对HTTPS重复完全相同的测试
没有完美的测试,但从我的要求来看,上面的内容似乎是最接近的
感谢所有回答的人。我建议您看看。选择几个对您来说合理的主机,并执行以下操作:
// create a client
var httpClient = new HttpClient();
// create a request to your site / host
var request = new HttpRequestMessage(HttpMethod.Head, new Uri(your-host));
// await it
var response = await httpClient.SendAsync(request);
// Check that the response seems valid, so that it is not just a redirect somewhere else
并捕获抛出的任何异常
不过需要注意的是,很难辨别你是否有实际的互联网接入,因为没有“总的”互联网接入。您必须定义internet访问的含义:)“这不是一个编程语言问题”意味着它可能不是stackoverflow的问题,可能更有用。google.com到底出了什么问题?不要以为会有一个更好的可用性网站。如果第一个网站失败,可能会尝试检查多个网站。制作一个包含“hello”内容的粘贴箱,并请求该内容的html。当然,你可以访问
google.com
并不一定意味着你正在接入互联网——你很可能正在某处与代理交谈。至少做一个适当的谷歌搜索请求,在一些奇怪和随机的事情上:)你是关于“在我之前有数千名开发者已经解决了这个问题”。@Luaan:你是对的,但我想我可以在HTTP头请求上设置一些头元素,以确保中间的代理不会试图从自己的缓存中为它服务?