-3

目标

我想从阅读器将数据发送到我的服务器。(在示例 aNopCloser中,稍后它将是 an 的标准输出exec.Command

问题

请求永远不会结束。即使我手动关闭 cmdOut 程序也不会结束。具体:它永远不会到达“请求完成”行,并且永远不会调用wg.Done()

陷阱

所有数据都正确发送到服务器(即使使用exec.Command标准输出)。但是它http.DefaultClient.Do似乎仍然在听ReadCloser它是空的(并在主程序中关闭)

代码

cmdOut := ioutil.NopCloser(bytes.NewBuffer([]byte("Hallo DU")))

var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done()

    // localhost:1234 is a netcat server: "nc -l -p 1234"
    req, _ := http.NewRequest("PUT", "http://localhost:1234", cmdOut)

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        log.Println(err)
        return
    }

    // Never reaches this line
    log.Println("Request Done")
}()

cmdOut.Close()

log.Println("Wait for go routine")
wg.Wait()
log.Println("DONE")
4

1 回答 1

1

问题不在于发送您的请求,而在于接收响应。

您将您的请求发送到 netcat,它只是丢弃该请求,并且不执行任何其他操作。这使得 HTTP 客户端库等待一个永远不会到来的 HTTP 响应。

解决方案是与实际的 HTTP 服务器通信。

于 2019-04-04T08:31:53.907 回答