如何在 golang 中正确控制听众

我想根据某些东西的状态来控制一个监听器,假设我的程序将在文件的内容为1时侦听,如果内容为0,则不侦听。


问题是,一旦一个监听器被初始化,就没有办法告诉他拒绝连接。只有“接受”状态;我必须关闭听众。


所以我找到了一种方法来使用以下代码来做到这一点,但我觉得这不是一个好方法,因为我使用的是全局,通常这不是一个好主意。


有没有更好的方法来做到这一点?


var healthStatus bool


func listen(l net.Listener, port int) {

    var err error

    l, err = net.Listen("tcp", ":"+strconv.Itoa(port))

    if err != nil {

        panic(err)

    }


    defer l.Close()

    for {

        if healthStatus == false {

            _ = l.Close()

            return

        }

        logrus.Debug("Going to listen !")

        conn, err := l.Accept()

        if err != nil {

            panic(err)

        }

        go func(c net.Conn) {

            _ = c.Close()

        }(conn)

        }

    }



func main() {

    healthStatus = true


    var listener net.Listener

    var isListening = false


    for {

        logrus.Debug("Performing checks...")

        healthStatus = healthcheck()

        


        if healthStatus {

            if !isListening {

                isListening = true

                //Restart listener

                go listen(listener, config.port)

            }

        }


        if !healthStatus {

            if isListening {

                isListening = false

            }

        }


        time.Sleep(time.Second * 10)

    }

}

编辑:带频道


package main


import (

    "net"

    "strconv"

    "time"

)


var listening = make(chan bool)


func listen(l net.Listener, port int) {

    var err error

    l, err = net.Listen("tcp", ":"+strconv.Itoa(port))

    if err != nil {

        panic(err)

    }


    defer l.Close()

    for {

        localstatus := <- listening

        if localstatus == false {

        _ = l.Close()

        return

    }

    conn, _ := l.Accept()


    go func(c net.Conn) {

    // Shut down the connection.

        _ = c.Close()

        listening <- true

    }(conn)

    }

    }



汪汪一只猫
浏览 96回答 1
1回答

牛魔王的故事

当运行状况变差时关闭侦听器。使用通道向接受环路发出信号,指示它是干净关机。var listener net.Listenervar done chan struct{}for {&nbsp; &nbsp; if healthcheck() {&nbsp; &nbsp; &nbsp; &nbsp; if listener == nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var err error&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listener, err = net.Listen("tcp", ":"+strconv.Itoa(conig.port))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; done = make(chan struct{})&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; go accept(listener, done)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; if listener != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(done)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listener.Close()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; done = nil&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listener = nil&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; time.Sleep(time.Second * 10)}接受函数为:func accept(l net.Listener, done chan struct{}) {&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; conn, err := l.Accept()&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case <-done:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; go func(c net.Conn) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _ = c.Close()&nbsp; &nbsp; &nbsp; &nbsp; }(conn)&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go