用户上线及广播功能

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
package main
 
import "net"
 
type User struct {
    Name string
    Addr string
 
    C    chan string
    conn net.Conn
}
 
func newUser(conn net.Conn) *User {
    userAddr := conn.RemoteAddr().String()
 
    user := &User{
        Name: userAddr,
        Addr: userAddr,
        C:    make(chan string),
        conn: conn,
    }
 
    //开启goroutine
    go user.ListenMessage()
 
    return user
}
 
//监听当前用户channel
func (this *User) ListenMessage() {
    for {
        msg := <-this.C
 
        this.conn.Write([]byte(msg + "\n"))
    }
}

  

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
package main
 
import (
    "fmt"
    "net"
    "sync"
)
 
type Server struct {
    Ip   string
    Port int
 
    //在线用户
    OnlineMap map[string]*User
    maplock   sync.RWMutex
 
    //消息
    Message chan string
}
 
func NewServer(ip string, port int) *Server {
    server := &Server{
        Ip:   ip,
        Port: port,
 
        OnlineMap: make(map[string]*User),
        Message:   make(chan string),
    }
 
    return server
}
 
func (this *Server) ChrodCast(user *User, msg string) {
    sendMsg := "[" + user.Addr + "]" + user.Name + ":" + msg
 
    this.Message <- sendMsg
}
 
func (this *Server) Handler(conn net.Conn) {
    // fmt.Println("已连接")
 
    user := newUser(conn)
 
    this.maplock.Lock()
    this.OnlineMap[user.Name] = user
    this.maplock.Unlock()
 
    //发送消息
    this.ChrodCast(user, "已上线")
 
    select {}
}
 
//监听当前channel 消息
func (this *Server) ListenMessager() {
 
    for {
        msg := <-this.Message
 
        this.maplock.Lock()
        for _, cli := range this.OnlineMap {
            cli.C <- msg
        }
        this.maplock.Unlock()
 
    }
}
 
func (this *Server) Start() {
 
    //监听连接
    listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", this.Ip, this.Port))
    if err != nil {
        fmt.Println("listen 监听err:", err)
    }
 
    defer listener.Close()
 
    go this.ListenMessager()
 
    for {
        //accpet
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("conn连接err", err)
            continue
        }
 
        //handler
        go this.Handler(conn)
    }
 
}

  

posted @   柠檬树下少年蓝  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示