-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuser.go
127 lines (105 loc) · 2.9 KB
/
user.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package main
import (
"net"
"strings"
)
type User struct {
Name string
Addr string
C chan string //当前用户绑定的channel
conn net.Conn
// user类型新增sever关联--->用于用户业务层封装
server *Server
}
// 创建一个用户的api
func NewUser(conn net.Conn, server *Server) *User {
userAddr := conn.RemoteAddr().String() //拿到当前的地址链接
user := &User{
Name: "user_" + userAddr,
Addr: userAddr,
C: make(chan string),
conn: conn,
server: server,
}
// 启动监听当前user channel消息的协程
go user.ListenMessage()
return user
}
// 用户上线的业务
func (u *User) Online() {
// 用户上线,将用户加入onlineMap中
u.server.mapLock.Lock()
u.server.OnlineMap[u.Name] = u
u.server.mapLock.Unlock()
// 广播当前用户上线消息
u.server.Broadcast(u, "已上线")
}
// 用户下线的业务
func (u *User) Offline() {
// 用户下线,将用户从onlineMap中删除
u.server.mapLock.Lock()
// 调用delete函数将user从map中删除
delete(u.server.OnlineMap, u.Name)
u.server.mapLock.Unlock()
// 广播当前用户下线消息
u.server.Broadcast(u, "下线")
}
// 给当前的User对应的客户端发送消息
func (u *User) SendMsg(msg string) {
u.conn.Write([]byte(msg))
}
// 用户处理消息的业务
func (u *User) DoMessage(msg string) {
if msg == "who" { //对“who”指令处理
// 查询当前在线的用户都有哪些
u.server.mapLock.Lock()
for _, user := range u.server.OnlineMap {
onlineMsg := "[" + user.Addr + "]" + user.Name + ":" + "在线...\n"
u.SendMsg(onlineMsg)
}
u.server.mapLock.Unlock()
} else if len(msg) > 7 && msg[:7] == "rename|" {
//消息格式 rename|张三
newName := strings.Split(msg, "|")[1]
// 判断name是否存在
_, ok := u.server.OnlineMap[newName]
if ok {
u.SendMsg("当前用户名已存在\n")
} else {
// 更改map中的指针引向
u.server.mapLock.Lock()
delete(u.server.OnlineMap, u.Name)
u.server.OnlineMap[newName] = u
u.server.mapLock.Unlock()
// 实际更改
u.Name = newName
u.SendMsg("您已更新用户名:" + u.Name + "\n")
}
} else if len(msg) > 4 && msg[:3] == "to|" {
// 消息格式:to|zhangshang|消息内容
// 1.获取对方的用户名
remoteName := strings.Split(msg, "|")[1]
// 2.根据用户名获取对方User对象
remoteUser, ok := u.server.OnlineMap[remoteName]
if !ok {
u.SendMsg("该用户名不存在~~\n")
return
}
// 3.通过对方User对象将消息内容发送过去
content := strings.Split(msg, "|")[2]
if content == "" {
u.SendMsg("无有效信息,请重新发送\n")
return
}
remoteUser.SendMsg(u.Name + "对你说:" + content)
} else {
u.server.Broadcast(u, msg)
}
}
// 监听当前User channel的方法,一旦有消息,就直接发送给对应客户端
func (u *User) ListenMessage() {
for {
msg := <-u.C
u.conn.Write([]byte(msg + "\n"))
}
}