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

有没有办法优化该代码?Go中的TCP服务器

有没有办法优化该代码?Go中的TCP服务器

Go
森栏 2022-06-06 16:54:36
这是基本的 tcp-server,它接受连接,读取传入的数据并写回。    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 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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


for {

    conn, err := li.Accept()

    if err != nil {

        log.Fatalln(err)

    }


    go func() {

        defer conn.Close()

        scanner := bufio.NewScanner(conn)


        for scanner.Scan() {

            ln := scanner.Text()

            io.WriteString(conn, ln+"\n")

        }

    }()

}


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信