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
运行
**

  1. go run server.go hub.go data.go connection.go

`
运行之后执行local.html文件

server.go文件代码

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/gorilla/mux"
  6. )
  7. func main() {
  8. router := mux.NewRouter()
  9. go h.run()
  10. router.HandleFunc("/ws", myws)
  11. if err := http.ListenAndServe("127.0.0.1:8080", router); err != nil {
  12. fmt.Println("err:", err)
  13. }
  14. }


hub.go文件代码

  1. package main
  2. import "encoding/json"
  3. var h = hub{
  4. c: make(map[*connection]bool),
  5. u: make(chan *connection),
  6. b: make(chan []byte),
  7. r: make(chan *connection),
  8. }
  9. type hub struct {
  10. c map[*connection]bool
  11. b chan []byte
  12. r chan *connection
  13. u chan *connection
  14. }
  15. func (h *hub) run() {
  16. for {
  17. select {
  18. case c := <-h.r:
  19. h.c[c] = true
  20. c.data.Ip = c.ws.RemoteAddr().String()
  21. c.data.Type = "handshake"
  22. c.data.UserList = user_list
  23. data_b, _ := json.Marshal(c.data)
  24. c.sc <- data_b
  25. case c := <-h.u:
  26. if _, ok := h.c[c]; ok {
  27. delete(h.c, c)
  28. close(c.sc)
  29. }
  30. case data := <-h.b:
  31. for c := range h.c {
  32. select {
  33. case c.sc <- data:
  34. default:
  35. delete(h.c, c)
  36. close(c.sc)
  37. }
  38. }
  39. }
  40. }
  41. }