IM-System版本0.4将User处理的逻辑从Server中提取出来

This commit is contained in:
wandoubaba 2024-11-24 12:37:31 +08:00
parent b801f59988
commit a31fda099c
2 changed files with 40 additions and 17 deletions

View File

@ -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阻塞

View File

@ -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 {