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

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

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

慕的地8271018 2022-09-19 14:58:39
这个无限的for循环如何不崩溃?我想如果现在没有客户,请倾听。Accept() 方法抛出一个错误,使 if 条件为 true,并且 for 循环继续到另一个迭代,直到客户端连接到服务器。因此,我放入if语句,看看它是否像我猜测的那样工作。但事实并非如此。它没有打印“错误”,因此当没有客户端时,程序不会进入if语句。fmt.Println("Error")有人可以解释一下这个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 回答

?
ibeautiful

TA贡献1993条经验 获得超6个赞

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

  1. 等待 返回,并显示新连接或错误。listener.Accept()

  2. 如果收到返回值,请检查错误。如果你有一个,记录它,或对它做任何事情,然后循环,以便服务器可以等待另一个新连接。continue

  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)

    }


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 209 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号