diff --git a/bilibili/aceld/IM-System/server.go b/bilibili/aceld/IM-System/server.go
index c3197de..04d212e 100644
--- a/bilibili/aceld/IM-System/server.go
+++ b/bilibili/aceld/IM-System/server.go
@@ -47,16 +47,12 @@ func (server *Server) BroadCast(user *User, msg string) {
 
 // server类的成员方法:处理客户端连接
 func (server *Server) Handler(conn net.Conn) {
-	user := NewUser(conn)
+	user := NewUser(conn, server)
 	// 当前连接的业务
 	fmt.Println(user.Name, "客户端连接建立成功")
 
 	// 用户上线, 将用户加入到OnlineMap中
-	server.mapLock.Lock()
-	server.OnlineMap[user.Name] = user
-	server.mapLock.Unlock()
-	// 广播当前用户的上线消息
-	server.BroadCast(user, "已上线")
+	user.Online()
 
 	// 接收客户端发送的消息
 	go func() {
@@ -64,7 +60,7 @@ func (server *Server) Handler(conn net.Conn) {
 		for {
 			n, err := conn.Read(buf)
 			if n == 0 {
-				server.BroadCast(user, "下线了")
+				user.Offline()
 				return
 			}
 			if err != nil && err != io.EOF {
@@ -74,7 +70,7 @@ func (server *Server) Handler(conn net.Conn) {
 			// 提取用户的消息并去除"\n"
 			msg := string(buf[:n-1])
 			// 将得到的消息进行广播
-			server.BroadCast(user, msg)
+			user.DoMessage(msg)
 		}
 	}()
 	// 当前handler阻塞
diff --git a/bilibili/aceld/IM-System/user.go b/bilibili/aceld/IM-System/user.go
index 51e9f2a..4349a23 100644
--- a/bilibili/aceld/IM-System/user.go
+++ b/bilibili/aceld/IM-System/user.go
@@ -3,26 +3,53 @@ package main
 import "net"
 
 type User struct {
-	Name string
-	Addr string
-	C    chan string
-	conn net.Conn
+	Name   string
+	Addr   string
+	C      chan string
+	conn   net.Conn
+	server *Server // 当前客户端所属的Server
 }
 
 // 创建一个User的API
-func NewUser(conn net.Conn) *User {
+func NewUser(conn net.Conn, server *Server) *User {
 	userAddr := conn.RemoteAddr().String()
 	user := &User{
-		Name: userAddr,
-		Addr: userAddr,
-		C:    make(chan string),
-		conn: conn,
+		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 {