IM-System版本0.4将User处理的逻辑从Server中提取出来
This commit is contained in:
parent
b801f59988
commit
a31fda099c
@ -47,16 +47,12 @@ 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)
|
user := NewUser(conn, server)
|
||||||
// 当前连接的业务
|
// 当前连接的业务
|
||||||
fmt.Println(user.Name, "客户端连接建立成功")
|
fmt.Println(user.Name, "客户端连接建立成功")
|
||||||
|
|
||||||
// 用户上线, 将用户加入到OnlineMap中
|
// 用户上线, 将用户加入到OnlineMap中
|
||||||
server.mapLock.Lock()
|
user.Online()
|
||||||
server.OnlineMap[user.Name] = user
|
|
||||||
server.mapLock.Unlock()
|
|
||||||
// 广播当前用户的上线消息
|
|
||||||
server.BroadCast(user, "已上线")
|
|
||||||
|
|
||||||
// 接收客户端发送的消息
|
// 接收客户端发送的消息
|
||||||
go func() {
|
go func() {
|
||||||
@ -64,7 +60,7 @@ func (server *Server) Handler(conn net.Conn) {
|
|||||||
for {
|
for {
|
||||||
n, err := conn.Read(buf)
|
n, err := conn.Read(buf)
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
server.BroadCast(user, "下线了")
|
user.Offline()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
@ -74,7 +70,7 @@ func (server *Server) Handler(conn net.Conn) {
|
|||||||
// 提取用户的消息并去除"\n"
|
// 提取用户的消息并去除"\n"
|
||||||
msg := string(buf[:n-1])
|
msg := string(buf[:n-1])
|
||||||
// 将得到的消息进行广播
|
// 将得到的消息进行广播
|
||||||
server.BroadCast(user, msg)
|
user.DoMessage(msg)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
// 当前handler阻塞
|
// 当前handler阻塞
|
||||||
|
@ -3,26 +3,53 @@ package main
|
|||||||
import "net"
|
import "net"
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
Name string
|
Name string
|
||||||
Addr string
|
Addr string
|
||||||
C chan string
|
C chan string
|
||||||
conn net.Conn
|
conn net.Conn
|
||||||
|
server *Server // 当前客户端所属的Server
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建一个User的API
|
// 创建一个User的API
|
||||||
func NewUser(conn net.Conn) *User {
|
func NewUser(conn net.Conn, server *Server) *User {
|
||||||
userAddr := conn.RemoteAddr().String()
|
userAddr := conn.RemoteAddr().String()
|
||||||
user := &User{
|
user := &User{
|
||||||
Name: userAddr,
|
Name: userAddr,
|
||||||
Addr: userAddr,
|
Addr: userAddr,
|
||||||
C: make(chan string),
|
C: make(chan string),
|
||||||
conn: conn,
|
conn: conn,
|
||||||
|
server: server,
|
||||||
}
|
}
|
||||||
// 启动监听当前user channel的goroutine
|
// 启动监听当前user channel的goroutine
|
||||||
go user.ListenMessage()
|
go user.ListenMessage()
|
||||||
return user
|
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类的成员方法: 监听消息
|
// User类的成员方法: 监听消息
|
||||||
func (user *User) ListenMessage() {
|
func (user *User) ListenMessage() {
|
||||||
for {
|
for {
|
||||||
|
Loading…
Reference in New Issue
Block a user