去测试网站状态(ping)

时间:2014-10-25 21:40:31

标签: http go ping

还有其他更好的方法来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
}

这个功能太慢了,当我用goroutines运行时,它超出限制并给我错误...

谢谢!

1 个答案:

答案 0 :(得分:2)

  • 使用单一运输。因为传输维护了一个连接池,所以不应该无法创建和忽略传输。
  • net/http doc
  • 开头所述关闭响应正文
  • 如果您只对状态感兴趣,请使用HEAD。
  • 检查错误。

代码:

var client = http.Client{
  Transport: &http.Transport{
    Dial: net.Dialer{Timeout: 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
}