Golang 如何从socket读出所有数据
第一种:
func read(conn *net.Conn) error { defer conn.Close() buf := make([]byte, 0, 4096) len := 0 for { n, err := conn.Read(buf[len:]) if n > 0 { len += n } if err != nil { if err != io.EOF { //Error Handler } break } } // buf[:len] is the content }
第二种,更给力的一种方法:
func read2(conn *net.Conn) error { defer conn.Close() var buf bytes.Buffer _, err := io.Copy(&buf, conn) if err != nil { // Error handler return err } return nil }
从io.Copy的实现来看,它实际上跟第一种的实现非常像。它先从conn中读出最多32KB的数据,然后调用buf的Write方法将这些数据写入到buf中。
第三种:
func read3(conn *net.Conn) error { defer conn.Close() buf, err = ioutil.ReadAll(conn) if err != nil { // Error Handler return err } // use buf... return nil }
要想玩得爽,还是用第一种比较靠谱。知根知底。