这次的就直接发放代码截图吧,应该是用go语言做后台一个简易的聊天,这里没用到什么特别的知识,最朴实的来实现效果,主要目的是分享下h5怎么用websocket,go搭建websocket服务的主要部分。
go代码部分:
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 }