IM-System版本0.3实现用户消息广播(基本群聊)
This commit is contained in:
parent
49a696b582
commit
b801f59988
@ -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 {}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user