go 1.20 系统 Ubuntu22.04
一个简单的监听 tcp 的代码 ,然后在浏览器请求 127.0.0.1:9999, 这个时候浏览器一直没有返回, 到 server 端发现 read 一直在等待。reader.Read (buf [:]) 这句代码一直在等待
package main
import (
"bufio"
"fmt"
"net"
)
// TCP Server端测试
// 处理函数
func process(conn net.Conn) {
defer conn.Close() // 关闭连接
for {
reader := bufio.NewReader(conn)
var buf [64]byte
n, err := reader.Read(buf[:]) // 读取数据
if err != nil {
fmt.Println("read from client failed, err: ", err)
break
}
recvStr := string(buf[:n])
fmt.Println("收到Client端发来的数据:", recvStr)
conn.Write([]byte(recvStr)) // 发送数据
}
}
func main() {
listen, err := net.Listen("tcp", "127.0.0.1:9999")
if err != nil {
fmt.Println("Listen() failed, err: ", err)
return
}
for {
conn, err := listen.Accept() // 监听客户端的连接请求
fmt.Println(conn)
if err != nil {
fmt.Println("Accept() failed, err: ", err)
continue
}
go process(conn) // 启动一个goroutine来处理客户端的连接请求
}
}
可以看到 第一轮读取了 64 个字节以后 第二轮 read 就一直在等待 没有任何输出。这是为什么呢
你用错了bufio.NewReader。 你read了64字节以后block是因为conn真的没有再发数据给你了,因为conn发的数据都被bufio.Reader读走了,而你又在每次循环后把bufio.Reader丢掉了,所以你只能读到64字节。
具体可以看bufio.Reader的源码。