去测试网站状态(ping)

Posted

技术标签:

【中文标题】去测试网站状态(ping)【英文标题】:Go to test website status (ping) 【发布时间】:2014-12-21 10:46:46 【问题描述】:

还有其他更好的方法来 ping 网站并检查网站是否可用?

我只需要获取状态码而不是获取(下载)所有网站...

func Ping(domain string) int 
    timeout := time.Duration(2 * time.Second)
    dialTimeout := func(network, addr string) (net.Conn, error) 
        return net.DialTimeout(network, addr, timeout)
    
    transport := http.Transport
        Dial: dialTimeout,
    
    client := http.Client
        Transport: &transport,
    
    url := "http://" + domain
    req, _ := http.NewRequest("GET", url, nil)
    resp, _ := client.Do(req)
    return resp.StatusCode

这个函数太慢了,当我使用 goroutine 运行时,它超出了限制并给了我错误......

谢谢!

【问题讨论】:

【参考方案1】: 使用单一传输。由于传输维护了一个连接池,因此您不应随意创建和忽略传输。 按照net/http doc开头所述关闭响应正文。 如果您只对状态感兴趣,请使用 HEAD。 检查错误。

代码:

var client = http.Client
  Transport: &http.Transport
    Dial: net.DialerTimeout: 2 * time.Second.Dial,
  ,


func Ping(domain string) (int, error) 
    url := "http://" + domain
    req, err := http.NewRequest("HEAD", url, nil)
    if err != nil 
       return 0, err
    
    resp, err := client.Do(req)
    if err != nil 
       return 0, err
    
    resp.Body.Close()
    return resp.StatusCode, nil

【讨论】:

我觉得成功返回应该是return resp.StatusCode, nil【参考方案2】:

由于这是 Google 上 Pinging in Go 的最高结果,只知道已经为此目的编写了几个包,但如果您打算使用此答案,我必须进行一些更改才能使其正常工作。

import (
   "time"
   "net/http"
)

var client = http.Client
   Timeout: 2 * time.Second,

但在其他方面与接受的答案保持一致。

但我是 Go 的初学者,所以可能有更好的方法来做到这一点。

【讨论】:

以上是关于去测试网站状态(ping)的主要内容,如果未能解决你的问题,请参考以下文章

无回显不出网命令执行测试方式

一分钟学会网站性能在线评估

网站外网可以正常访问,内网无法访问是啥原因?

网站打开慢如何排查?

只会用ping测试网络通不通?高级网工还会这么用

使用Ping测试网络连通状态