From a31fda099c5d855ae2c513a6d95cea6a55803004 Mon Sep 17 00:00:00 2001 From: wandoubaba Date: Sun, 24 Nov 2024 12:37:31 +0800 Subject: [PATCH] =?UTF-8?q?IM-System=E7=89=88=E6=9C=AC0.4=E5=B0=86User?= =?UTF-8?q?=E5=A4=84=E7=90=86=E7=9A=84=E9=80=BB=E8=BE=91=E4=BB=8EServer?= =?UTF-8?q?=E4=B8=AD=E6=8F=90=E5=8F=96=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bilibili/aceld/IM-System/server.go | 12 +++----- bilibili/aceld/IM-System/user.go | 45 ++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 17 deletions(-) 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 {