即时通信系统 -- V0.3消息广播功能

在处理业务的 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)
		}
	}()

总结:

  1. net.Conn.Read() 可以将连接中的信息读入字节切片中,返回值为字节切片长度 n 与 err;
  2. n == 0 表示连接正常断开,广播用户下线消息,对应在 terminal 中敲 cirl + C
  3. err != nil && err != io.EOF 表面连接中的消息未读完就出现 err,说明读取出错
  4. 把字节切片转换为 msg 时要把最后的 '\n' 去除(因为在 user 的 ListenMessage 中已经给 msg 后填上换行了,否则每条消息后都会多一个换行),所以是 buf[:n-1]
posted @ 2023-03-07 14:33  hzy0227  阅读(11)  评论(0编辑  收藏  举报