Golang net包
最近在项目日志报警中,经常看到"broken pipe"这个报错,经过询问负责基础架构的同事,是server正在处理的时候client主动关闭TCP连接导致的,可以忽略;于是我们的做法是,将这个报警项添加进了白名单。但本着刨根问底的心态,我自己按照网上的文章也尝试本地复现了一下这个报错。
1 Conn
Conn是一个基本的接口类型,以数据流为向导的网络连接接。注意是接口类型,不需要我们来手动构造实现Conn接口,生成满足Conn接口的函数。
func Dial(network, address string) (Conn, error) // 用来建立TCP连接
func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
func FileConn(f *os.File) (c Conn, err error)
func Pipe() (Conn, Conn)
服务端通过Accept()
方法来接受Listen到的一个TCP连接;
客户端通过Dial()
方法来请求建立一个TCP连接。
在连接建立完成后,由于TCP是全双工通信的,所以两端都可以使用conn.Read() conn.Write()
函数来读取内容到buffer中。
2 测试TCP建立连接和通信的过程
为了方便观察,把Server做成只会读,Client只会写。
服务端代码
func recvConnectionMsg(connection net.Conn) {
buffer := make([]byte, 50)
defer connection.Close()</