为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
翻阅古今 2022-08-24 17:27:08
我需要在Golang中实现一个服务器。我正在将软件包用于此目的,但我不了解如何优雅地脱离循环。netaccept因此,请看一下包中的示例:netln, 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    }    ...}换句话说,我希望能够以某种方式优雅地终止程序。
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

对于任何服务,确保干净关闭的最佳做法是确保服务的每个部分都支持取消。添加上下文。上下文支持是实现此目的的推荐方法。


因此,首先,请确保您不会挂起恶意客户端连接。所以要添加支持:net.Listenercontext.Context


var lc net.ListenConfig


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

取消将中断此处的任何恶意客户端连接,这些连接可能在握手期间被阻止。ctx


编辑:为了确保我们可以在呼叫被阻止等待时中断呼叫,可以利用相同的状态,并在检测到取消事件时关闭连接(如上一个现已删除的应答中所述):Listen()ctx


go func() {

    <-ctx.Done()

    log.Println("shutting service down...")

    ln.Close()

}()

工作示例:https://play.golang.org/p/LO1XS4jBQ02


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信