如何在 Golang 中接受服务器连接或中断 accept() 循环

我需要在Golang中实现一个服务器。我正在将软件包用于此目的,但我不了解如何优雅地脱离循环。netaccept


因此,请看一下包中的示例:net


ln, err := net.Listen("tcp", ":8080")

if err != nil {

    // handle error

}

for {

    conn, err := ln.Accept()

    if err != nil {

        // handle error

    }

    go handleConnection(conn)

}

我想做更多的事情,


for {

    select {

    case <-done:

        break

    case conn, err := <-ln.Accept():

    if err != nil {

        break

    }

    ...

}

换句话说,我希望能够以某种方式优雅地终止程序。


翻阅古今
浏览 142回答 1
1回答

森林海

对于任何服务,确保干净关闭的最佳做法是确保服务的每个部分都支持取消。添加上下文。上下文支持是实现此目的的推荐方法。因此,首先,请确保您不会挂起恶意客户端连接。所以要添加支持:net.Listenercontext.Contextvar lc net.ListenConfigln, err := lc.Listen(ctx, "tcp", ":8080")取消将中断此处的任何恶意客户端连接,这些连接可能在握手期间被阻止。ctx编辑:为了确保我们可以在呼叫被阻止等待时中断呼叫,可以利用相同的状态,并在检测到取消事件时关闭连接(如上一个现已删除的应答中所述):Listen()ctxgo func() {&nbsp; &nbsp; <-ctx.Done()&nbsp; &nbsp; log.Println("shutting service down...")&nbsp; &nbsp; ln.Close()}()工作示例:https://play.golang.org/p/LO1XS4jBQ02
打开App,查看更多内容
随时随地看视频慕课网APP