【问题标题】:Go to test website status (ping)去测试网站状态(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 运行时,它超出了限制并给了我错误......

谢谢!

【问题讨论】:

    标签: http go ping


    【解决方案1】:
    • 使用单一传输。由于传输维护了一个连接池,因此您不应随意创建和忽略传输。
    • 按照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
    }
    

    【讨论】:

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

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

    import (
       "time"
       "net/http"
    )
    
    var client = http.Client{
       Timeout: 2 * time.Second,
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      相关资源
      最近更新 更多