代码之家  ›  专栏  ›  技术社区  ›  divflex

在go中从tcp连接读取数据需要for循环吗?

  •  -2
  • divflex  · 技术社区  · 6 年前

    for {
        select {
        case conn := <-listen:
            go handleClient(conn)
        ...
    }
    
    func handleClient(client net.Conn) {
        for {
           // ...read from conn
           // at some point return
           return
        }
    }
    

    我的问题是,如果你用 for 循环,你必须写 return 否则就是死循环。如果它回来,这个 handleClient 函数只执行一次。所以呢 对于 这里不需要,对吗?我们仍然可以读取所有的数据 对于 ,这是正确的思考方式吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Vorsprung    6 年前

    服务器处理连接的常见模式可能是

    func handleClient(conn net.Conn) {
        r := bufio.NewReader(conn)
        for {
            line, err := r.ReadBytes(byte('\n'))
            switch err {
            case nil:
                break
            case io.EOF:
            default:
                fmt.Println("ERROR", err)
            }
            // do something with the data, in this case echo it back
            conn.Write(line)
        }
    }
    

    如果handleClient可以在一个块中读取所有输入,则不需要循环

    所以,是的,您是对的,因为{}并不总是必需的,但它取决于正在读取的数据。通常这样的循环是读取数据的最佳方式