登录
首页 >  Golang >  Go问答

这个无限循环在 TCP 连接中如何工作?

来源:stackoverflow

时间:2024-04-06 23:06:34 215浏览 收藏

大家好,我们又见面了啊~本文《这个无限循环在 TCP 连接中如何工作?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

这个无限循环如何不崩溃?

我认为如果现在没有客户端,listener.accept() 方法会抛出一个错误,这使得 if 条件为真,并且 for 循环继续进行其他迭代,直到客户端连接到服务器。因此,我将 fmt.println("error") 放在 if 语句中,看看它是否按照我的猜测工作。但事实并非如此。它没有打印“error”,因此当没有客户端时程序不会进入 if 语句。

有人可以解释一下这个 for 循环实际上是如何工作的吗?

func main() {
    
        service := ":1202"
        tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
        checkError(err)
    
        listener, err := net.ListenTCP("tcp4", tcpAddr)
        checkError(err)
    
        for {
            conn, err := listener.Accept()
            if err != nil {
                fmt.Println("Error")
                continue
            }
            
            
        }
    }

正确答案


这个无限循环执行以下操作:

  1. 等待 listener.accept() 返回新连接或错误。

  2. 如果您收到返回值,请检查是否有错误。如果你有一个,记录它,或者用它做任何事情,然后 continuee 循环,这样服务器就可以等待另一个新连接。

  3. 如果没有错误,只需启动一个单独的 go 例程来处理连接即可。这样,for 循环会立即再次运行,因此侦听器将等待新连接,而您在单独的例程中处理连接。

参见示例:

func main() {

    service := ":1202"
    tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
    checkError(err)

    listener, err := net.ListenTCP("tcp4", tcpAddr)
    checkError(err)

    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Println("We've got an error:",err)
            continue
        }
        go HandleConnection(conn)
    }
}

今天关于《这个无限循环在 TCP 连接中如何工作?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>