如何在Golang中接受服务器连接或中断accept()循环
我需要在Golang实现一个服务器。为此,我使用了如何在Golang中接受服务器连接或中断accept()循环,go,Go,我需要在Golang实现一个服务器。为此,我使用了net包,但我不知道如何优雅地从accept循环中解脱出来 请看net包中的示例: ln, err := net.Listen("tcp", ":8080") if err != nil { // handle error } for { conn, err := ln.Accept() if err != nil { // handle error }
net
包,但我不知道如何优雅地从accept
循环中解脱出来
请看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
}
...
}
用于{
挑选{
case对于任何服务,确保干净关闭的最佳实践是确保服务的每个部分都支持取消。添加支持是实现这一点的推荐方法
因此,首先,确保您的net.Listener
未挂起恶意客户端连接。要添加context.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()
}()
go func(){