0

和有什么区别

ln, err := net.Listen("tcp", addr)
if err != nil {
    return err
}
go srv.Serve(ln)

ln, err := net.Listen("tcp", addr)
if err != nil {
    return err
}
return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})

?

我正在创建自己的 ListenAndServe(第一个代码片段),以便在调用 ListenAndServe 后立即执行代码并向服务器发送请求。但是,我不能使用 tcpKeepAliveListener,因为它没有被导出。srv.Serve(ln) 也可以,但如果我采用第一种方式,我不知道我是否遗漏了一些东西。

4

1 回答 1

1

鉴于启动服务器后向服务器发送请求的目标,应用程序必须分别执行监听和服务。

在 goroutine 中启动后发送请求的方法ListenAndServe并不能保证发送请求时服务器正在侦听。主 goroutine 有可能在 goroutine 执行之前继续执行发送。

很短tcpKeepAliveListener。如果您需要该功能,请将代码复制到您的应用程序中。

这是要使用的代码:

ln, err := net.Listen("tcp", addr)
if err != nil {
    log.Fatal(err)

}

go func() {
    log.Fatal(srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)}))

}()

// The Serve loop is not guaranteed to be running at this point, but 
// the listening socket is open and requests to the socket will queue.

... send requests here
于 2018-11-15T17:47:46.000 回答