-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathchat_server.go
165 lines (149 loc) · 3.31 KB
/
chat_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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package main
import (
"fmt"
"net"
"os"
)
type Server struct {
Chaters map[net.Conn]string
}
func main() {
//本机ip
ip := "xxx.xxx.xxx.xxx"
Start_server(ip)
}
/** 开启服务
* @params port string 监听端口
*
**/
func Start_server(ip string) {
//初始化
chaters := Server{make(map[net.Conn]string, 0)}
//监听
conn, err := net.Listen("tcp", ip+":9989")
chaters.Check_err(err, nil)
fmt.Println("Start Ok!")
for {
//允许握手
c, err := conn.Accept()
chaters.Check_err(err, nil)
//添加线程
go chaters.Server_chat(c)
}
}
/** 检查错误
* @params err error
* @params conn net.Conn 聊天线程
*
* @return string "break" 判断有没人退出
**/
func (server *Server) Check_err(err error, conn net.Conn) string {
if err != nil {
if conn != nil {
//有人退出
return "break"
} else {
//error
fmt.Println(err.Error())
os.Exit(1)
}
}
return ""
}
/** 监听多线程聊天
*
* @params conn net.Conn 聊天线程
**/
func (server *Server) Server_chat(conn net.Conn) {
//第一次加入
server.Chat(true, conn)
for {
//重复监听,判断是否有人退出
if server.Chat(false, conn) == "break" {
break
}
}
}
/** 多线程聊天
* @params bool mode (true为第一次加入)
* @params conn net.Conn 聊天线程
*
* @return string "break" 判断有没人退出
**/
func (server *Server) Chat(mode bool, conn net.Conn) string {
//接收信息
bytes, err := server.Receive(mode, conn)
//有人退出
if server.Check_err(err, conn) == "break" {
//broadcast
server.Broadcast([]byte(server.Chaters[conn]+" OUT!"), conn)
//delete the map
delete(server.Chaters, conn)
conn.Close()
return "break"
}
//广播
broadcast_text := server.Handle_message(mode, bytes, conn)
server.Broadcast(broadcast_text, conn)
return ""
}
/** 整理广播信息
* @params mode bool (true为第一次加入)
* @params []byte bytes 服务器接收的信息
* @params conn net.Conn 聊天线程
*
* @return []byte
**/
func (server *Server) Handle_message(mode bool, bytes []byte, conn net.Conn) (broadcast_text []byte) {
if mode == true {
//第一次加入
broadcast_text = []byte(string(bytes) + " IN !")
//add to map
server.Chaters[conn] = string(bytes)
} else {
//say something
broadcast_text = append([]byte(server.Chaters[conn]+" Say: "), bytes...)
}
return
}
/** 接收信息
* @params mode bool (true为第一次加入)
* @params conn net.Conn 聊天线程
*
* @return []byte && error
**/
func (server *Server) Receive(mode bool, conn net.Conn) (bytes []byte, err error) {
if mode == true {
//姓名最大10字节
bytes = make([]byte, 10)
//接收信息
_, err = conn.Read(bytes)
} else {
//内容最大256字节
bytes = make([]byte, 256)
var length int
//接收信息
length, err = conn.Read(bytes)
//内容截取
bytes = bytes[:length]
}
return
}
/** 广播
* @params broadcast_text []byte 广播内容
* @params conn net.Conn 聊天线程
*
**/
func (server *Server) Broadcast(broadcast_text []byte, conn net.Conn) {
if len(broadcast_text) == 0 {
return
}
for key, _ := range server.Chaters {
//跳过自己
if key == conn {
continue
}
_, err := key.Write(broadcast_text)
server.Check_err(err, nil)
}
}