编码员。这是基本的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()
}
}
但是,存在用于扫描程序的嵌套循环,并在每次外部循环迭代时声明新的扫描程序。我听说嵌套循环导致额外的复杂性,并且可能在无限循环的每次迭代中声明新的扫描程序会导致一些内存泄漏。其实,我不知道该怎么做,我只想问两件事:
是否可以通过其他方式执行相同操作?
我们实际上是否需要对这种低级服务器
抽象进行更多优化?
外循环正在等待新的连接,内循环正在解析输入数据,因此从这个角度来看很好。并非所有嵌套循环都是邪恶的。但是,当您处理单个连接时,服务器不再接受它们(您可以通过尝试从多个客户端连接到服务器来进行测试)。要解决此问题,请在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")
}
}()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句