一、回显原理
-
net.Conn 实现了针对接口Reader和Writer的函数Read([]byte) ,Write([]byte)。因此,conn可以读也可以写。
-
创建一个TCP server
-
等待客户端的连接
-
如果连接成功,启动一个线程去处理这个连接
-
- 扫描来自客户端的输入
- 向客户端输出同样的内容
- 循环扫描客户端的输入
-
循环,处理下一个客户端的连接
-
package main import ( "bufio" "fmt" "log" "net" ) func echo(conn net.Conn) { defer conn.Close() //先将关闭连接压入栈底 for { //死循环保证能够多次读写 reader := bufio.NewReader(conn) //不仅是创建Reader,也是刷新Reader data, err := reader.ReadString('\n') //以\n作为输入字符串的终止符 if err != nil { log.Fatalln("Read data Failed") } log.Printf("Read data: %s", data) //将所读字符串打印出来 writer := bufio.NewWriter(conn) var write_data string fmt.Scanln(&write_data) // 等待用户输入 _, err = writer.WriteString(write_data) //写入输入的字符串进缓存 if err != nil { log.Fatalln("Write data Failed") } writer.Flush() //从缓存中写入底层io } } func main() { l, err := net.Listen("tcp", ":9999") //确定监听端口 if err != nil { log.Fatalln("The Port could be listened") } log.Println("正在监听 0.0.0.0:9999") for { conn, err := l.Accept() //接受请求 if err != nil { log.Fatalln("连接中断") } log.Println("已收到连接") go echo(conn) //将回显服务挂载 } /** 客户端 执行 telnet localhost 9999 this is echo server 返回 2022/11/03 21:34:08 正在监听 0.0.0.0:9999 2022/11/03 21:34:23 已收到连接 2022/11/03 21:34:31 Read data: this is echo server */ }