1 // WebChat project main.go
2 package main
3
4 import (
5 "fmt"
6 "net/http"
7 "time"
8
9 "encoding/json"
10
11 "strings"
12
13 "golang.org/x/net/websocket"
14 )
15
16 //全局信息
17 var datas Datas
18 var users map[*websocket.Conn]string
19
20 func main() {
21 fmt.Println("启动时间")
22 fmt.Println(time.Now())
23
24 //初始化
25 datas = Datas{}
26 users = make(map[*websocket.Conn]string)
27
28 //绑定效果页面
29 http.HandleFunc("/", h_index)
30 //绑定socket方法
31 http.Handle("/webSocket", websocket.Handler(h_webSocket))
32 //开始监听
33 http.ListenAndServe(":8", nil)
34 }
35
36 func h_index(w http.ResponseWriter, r *http.Request) {
37
38 http.ServeFile(w, r, "index.html")
39 }
40
41 func h_webSocket(ws *websocket.Conn) {
42
43 var userMsg UserMsg
44 var data string
45 for {
46
47 //判断是否重复连接
48 if _, ok := users[ws]; !ok {
49 users[ws] = "匿名"
50 }
51 userMsgsLen := len(datas.UserMsgs)
52 fmt.Println("UserMsgs", userMsgsLen, "users长度:", len(users))
53
54 //有消息时,全部分发送数据
55 if userMsgsLen > 0 {
56 b, errMarshl := json.Marshal(datas)
57 if errMarshl != nil {
58 fmt.Println("全局消息内容异常...")
59 break
60 }
61 for key, _ := range users {
62 errMarshl = websocket.Message.Send(key, string(b))
63 if errMarshl != nil {
64 //移除出错的链接
65 delete(users, key)
66 fmt.Println("发送出错...")
67 break
68 }
69 }
70 datas.UserMsgs = make([]UserMsg, 0)
71 }
72
73 fmt.Println("开始解析数据...")
74 err := websocket.Message.Receive(ws, &data)
75 fmt.Println("data:", data)
76 if err != nil {
77 //移除出错的链接
78 delete(users, ws)
79 fmt.Println("接收出错...")
80 break
81 }
82
83 data = strings.Replace(data, "\n", "", 0)
84 err = json.Unmarshal([]byte(data), &userMsg)
85 if err != nil {
86 fmt.Println("解析数据异常...")
87 break
88 }
89 fmt.Println("请求数据类型:", userMsg.DataType)
90
91 switch userMsg.DataType {
92 case "send":
93 //赋值对应的昵称到ws
94 if _, ok := users[ws]; ok {
95 users[ws] = userMsg.UserName
96
97 //清除连接人昵称信息
98 datas.UserDatas = make([]UserData, 0)
99 //重新加载当前在线连接人
100 for _, item := range users {
101
102 userData := UserData{UserName: item}
103 datas.UserDatas = append(datas.UserDatas, userData)
104 }
105 }
106 datas.UserMsgs = append(datas.UserMsgs, userMsg)
107 }
108 }
109
110 }
111
112 type UserMsg struct {
113 UserName string
114 Msg string
115 DataType string
116 }
117
118 type UserData struct {
119 UserName string
120 }
121
122 type Datas struct {
123 UserMsgs []UserMsg
124 UserDatas []UserData
125 }