-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.go
138 lines (116 loc) · 2.43 KB
/
server.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
128
129
130
131
132
133
134
135
136
137
138
package main
import (
"fmt"
"io"
"net"
"strings"
"sync"
"time"
)
type Server struct {
Ip string
Port int
// 在线用户map
OnlineMap map[string]*User
// 读写锁
mapLock sync.RWMutex
//消息广播channel
Message chan string
}
// 创建server接口
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) BroadCast(user *User, msg string) {
sendMsg := "[" + user.Addr + "]" + user.Name + ":" + msg
this.Message <- sendMsg
}
// 监听MessageChannel的goroutine,一旦有消息,就发送给全部在线的User
func (this *Server) ListenMessage() {
for {
msg := <-this.Message
this.mapLock.Lock()
for _, client := range this.OnlineMap {
client.C <- msg
}
this.mapLock.Unlock()
}
}
// 业务处理
func (this *Server) Handler(conn net.Conn) {
//userAddr := conn.RemoteAddr().String()
//fmt.Printf("客户端%s 连接到服务器\n", userAddr)
//用户上线
user := NewUser(conn, this)
user.Login()
//isLive channel
isLevel := make(chan bool)
//接受客户端发来的消息
go func() {
buf := make([]byte, 4096)
msg := ""
for {
n, err := conn.Read(buf)
if n == 0 {
user.Logout()
return
}
if nil != err && err != io.EOF {
fmt.Printf("读取客户端[%s]消息错误:%s", user.Name, err.Error())
return
}
msg += string(buf[:n])
if strings.HasSuffix(msg, "\r\n") {
user.DoMessage(strings.TrimSuffix(msg, "\r\n"))
msg = ""
}
//用户的任意消息,都代表为活跃状态
isLevel <- true
}
}()
for {
select {
case <-isLevel:
//啥都不做
case <-time.After(300 * time.Second):
//超时T下线
user.SendMsg("timeout !!")
//关闭isLive chan
close(isLevel)
//关闭连接
conn.Close()
return
}
}
}
// 启动服务
func (this Server) Start() {
// socket listen
listener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", this.Ip, this.Port))
if nil != err {
fmt.Println("net.Listen 监听错误 :", err)
return
}
defer listener.Close()
fmt.Printf("Socket Listen 开启监听%s:%d\n", this.Ip, this.Port)
//监听消息
go this.ListenMessage()
for {
//accept
conn, err := listener.Accept()
if nil != err {
fmt.Println("socket listenner 监听错误 :", err)
continue
}
//do handler
go this.Handler(conn)
}
//close listen socket
}