IM-System版本0.3实现用户消息广播(基本群聊)

This commit is contained in:
wandoubaba 2024-11-24 12:23:34 +08:00
parent 49a696b582
commit b801f59988

View File

@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"io"
"net" "net"
"sync" "sync"
) )
@ -11,7 +12,7 @@ type Server struct {
Port int Port int
OnlineMap map[string]*User // 在线用户列表 OnlineMap map[string]*User // 在线用户列表
mapLock sync.RWMutex // OnlineMap读写锁 mapLock sync.RWMutex // OnlineMap读写锁
Message chan string // 用户消息管道 Message chan string // 全部用户消息管道
} }
// 创建一个server的接口 // 创建一个server的接口
@ -46,16 +47,36 @@ func (server *Server) BroadCast(user *User, msg string) {
// server类的成员方法处理客户端连接 // server类的成员方法处理客户端连接
func (server *Server) Handler(conn net.Conn) { func (server *Server) Handler(conn net.Conn) {
user := NewUser(conn)
// 当前连接的业务 // 当前连接的业务
fmt.Println("客户端连接建立成功") fmt.Println(user.Name, "客户端连接建立成功")
// 用户上线, 将用户加入到OnlineMap中 // 用户上线, 将用户加入到OnlineMap中
user := NewUser(conn)
server.mapLock.Lock() server.mapLock.Lock()
server.OnlineMap[user.Name] = user server.OnlineMap[user.Name] = user
server.mapLock.Unlock() server.mapLock.Unlock()
// 广播当前用户的上线消息 // 广播当前用户的上线消息
server.BroadCast(user, "已上线") 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阻塞 // 当前handler阻塞
select {} select {}
} }