1. 第一种方式
# 客户端写
//向服务器端写数据
conn.Write(sendData1)
#服务端读
headData := make([]byte, 8)
//ReadFull从r精确地读取len(buf)字节数据填充进buf。
//函数返回写入的字节数和错误(如果没有读取足够的字节)。
//只有没有读取到字节时才可能返回EOF;如果读取了有但不够的字节时遇到了EOF,
//函数会返回ErrUnexpectedEOF。 只有返回值err为nil时,返回值n才会等于len(buf)。
_, err := io.ReadFull(conn, headData)
2.第二种方式
#客户端写
conn.Write(data)
#服务端读
//NewReader创建一个具有默认大小缓冲、从r读取的*Reader。
reader := bufio.NewReader(conn)
var buf [1024]byte
//Read读取数据写入p。本方法返回写入p的字节数。
//本方法一次调用最多会调用下层Reader接口一次Read方法,
//因此返回值n可能小于len(p)。读取到达结尾时,
//返回值n将为0而err将为io.EOF。
n, err := reader.Read(buf[:])
3.第三种
#客户端写
_, err = conn.Write([]byte(trimInput))
#服务端读
//创建一个切片
buf := make([]byte, 512)
n, err := conn.Read(buf)