1.1.1. webSocket是什么
- WebSocket是一种在单个TCP连接上进行全双工通信的协议
- WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据
- 在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输
- 需要安装第三方包:
- cmd中:go get -u -v github.com/gorilla/websocket
1.1.2. 举个聊天室的小例子
在同一级目录下新建四个go文件connection.go|data.go|hub.go|server.go
运行
**
go run server.go hub.go data.go connection.go
`
运行之后执行local.html文件
server.go文件代码
package mainimport ("fmt""net/http""github.com/gorilla/mux")func main() {router := mux.NewRouter()go h.run()router.HandleFunc("/ws", myws)if err := http.ListenAndServe("127.0.0.1:8080", router); err != nil {fmt.Println("err:", err)}}
hub.go文件代码
package mainimport "encoding/json"var h = hub{c: make(map[*connection]bool),u: make(chan *connection),b: make(chan []byte),r: make(chan *connection),}type hub struct {c map[*connection]boolb chan []byter chan *connectionu chan *connection}func (h *hub) run() {for {select {case c := <-h.r:h.c[c] = truec.data.Ip = c.ws.RemoteAddr().String()c.data.Type = "handshake"c.data.UserList = user_listdata_b, _ := json.Marshal(c.data)c.sc <- data_bcase c := <-h.u:if _, ok := h.c[c]; ok {delete(h.c, c)close(c.sc)}case data := <-h.b:for c := range h.c {select {case c.sc <- data:default:delete(h.c, c)close(c.sc)}}}}}
