diff --git a/bilibili/aceld/IM-System/server.go b/bilibili/aceld/IM-System/server.go index 9358c66..c3197de 100644 --- a/bilibili/aceld/IM-System/server.go +++ b/bilibili/aceld/IM-System/server.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "io" "net" "sync" ) @@ -11,7 +12,7 @@ type Server struct { Port int OnlineMap map[string]*User // 在线用户列表 mapLock sync.RWMutex // OnlineMap读写锁 - Message chan string // 用户消息管道 + Message chan string // 全部用户的消息管道 } // 创建一个server的接口 @@ -46,16 +47,36 @@ func (server *Server) BroadCast(user *User, msg string) { // server类的成员方法:处理客户端连接 func (server *Server) Handler(conn net.Conn) { + user := NewUser(conn) // 当前连接的业务 - fmt.Println("客户端连接建立成功") + fmt.Println(user.Name, "客户端连接建立成功") // 用户上线, 将用户加入到OnlineMap中 - user := NewUser(conn) server.mapLock.Lock() server.OnlineMap[user.Name] = user server.mapLock.Unlock() // 广播当前用户的上线消息 server.BroadCast(user, "已上线") + + // 接收客户端发送的消息 + go func() { + buf := make([]byte, 4096) + for { + n, err := conn.Read(buf) + if n == 0 { + server.BroadCast(user, "下线了") + return + } + if err != nil && err != io.EOF { + fmt.Println("Conn Read err:", err) + return + } + // 提取用户的消息并去除"\n" + msg := string(buf[:n-1]) + // 将得到的消息进行广播 + server.BroadCast(user, msg) + } + }() // 当前handler阻塞 select {} }