有没有一种方法可以优化该代码? Go中的TCP服务器

时间:2020-06-01 09:44:13

标签: go

编码器。这是基本的tcp服务器,它接受连接,读取传入的数据并写回。

    package main

    import (
        "bufio"
        "io"
        "log"
        "net"
    )

    func main() {
        li, err := net.Listen("tcp", ":8080")
        if err != nil {
            log.Fatalln(err)
        }

        defer li.Close()

        for {
            conn, err := li.Accept()
            if err != nil {
                log.Fatalln(err)
            }

            scanner := bufio.NewScanner(conn)

            for scanner.Scan() {
                ln := scanner.Text()
                io.WriteString(conn, ln+"\n")
            }

            conn.Close()
        }

    }

但是,有一个嵌套的扫描程序循环,并在每次外部循环迭代时声明新的扫描程序。我听说嵌套循环导致额外的复杂性,并且可能在无限循环的每次迭代中声明新的扫描程序会导致一些内存泄漏。其实,我不知道该怎么做,我只想问两件事:

  1. 是否可以通过其他方式执行相同操作?

  2. 我们实际上是否需要在这样的低级服务器上进行更多优化
    抽象?

1 个答案:

答案 0 :(得分:3)

外部循环正在等待新的连接,内部循环正在解析输入数据,因此从这个角度来看还可以。并非所有嵌套循环都是邪恶的。但是,当您处理单个连接时,服务器不再接受它们(可以通过尝试从多个客户端连接到服务器来进行测试)。要解决此问题,请在goroutine中处理连接:

SELECT u.name
FROM users as u
WHERE u.userid = fn_identify_required_user('RF24T','20180510');