在处理业务的 Handler(conn net.Conn) 方法中加入可以从当前 conn 中读取消息并广播的功能
go func() {
buf := make([]byte, 4096)
for {
n, err := conn.Read(buf)
if n == 0 {
this.BroadCast(user, "下线")
return
}
if err != nil && err != io.EOF {
fmt.Println("Conn Read err:", err)
}
msg := string(buf[ : n - 1])
this.BroadCast(user, msg)
}
}()
总结:
- net.Conn.Read() 可以将连接中的信息读入字节切片中,返回值为字节切片长度 n 与 err;
- n == 0 表示连接正常断开,广播用户下线消息,对应在 terminal 中敲 cirl + C
- err != nil && err != io.EOF 表面连接中的消息未读完就出现 err,说明读取出错
- 把字节切片转换为 msg 时要把最后的 '\n' 去除(因为在 user 的 ListenMessage 中已经给 msg 后填上换行了,否则每条消息后都会多一个换行),所以是 buf[:n-1]