package main import "net" type User struct { Name string Addr string C chan string conn net.Conn server *Server // 当前客户端所属的Server } // 创建一个User的API func NewUser(conn net.Conn, server *Server) *User { userAddr := conn.RemoteAddr().String() user := &User{ Name: userAddr, Addr: userAddr, C: make(chan string), conn: conn, server: server, } // 启动监听当前user channel的goroutine go user.ListenMessage() return user } // User类的成员方法:用户上线处理 func (user *User) Online() { // 用户上线,将用户加入到server的OnlineMap中 user.server.mapLock.Lock() user.server.OnlineMap[user.Name] = user user.server.mapLock.Unlock() // 广播当前用户上线消息 user.server.BroadCast(user, "已上线") } // User类的成员方法:用户下线处理 func (user *User) Offline() { // 用户下线,将用户从server的OnlineMap中删除 user.server.mapLock.Lock() delete(user.server.OnlineMap, user.Name) user.server.mapLock.Unlock() // 广播当前用户下线消息 user.server.BroadCast(user, "下线了") } // User类的成员方法:处理用户消息 func (user *User) DoMessage(msg string) { user.server.BroadCast(user, msg) } // User类的成员方法: 监听消息 func (user *User) ListenMessage() { for { msg := <-user.C user.conn.Write([]byte(msg + "\n")) } }