简介


Gorilla WebSocket是WebSocket协议的Go实现。可以收&发websocket数据包

如何使用


  1. import "github.com/gorilla/websocket"
  1. func main() {
  2. http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
  3. serverWs(hub, w, r)
  4. })
  5. http.ListenAndServe("127.0.0.1:8080", nil)
  6. }
  1. func serverWs(w http.ResponseWriter, r *http.Request) {
  2. upgrader := websocket.Upgrader{
  3. HandshakeTimeout: 0, // 握手超时时间
  4. ReadBufferSize: 1024, // 读取缓冲区大小
  5. WriteBufferSize: 1024, // 写入缓冲区大小
  6. WriteBufferPool: nil, // 写入缓冲池
  7. Error: nil, // http错误响应函数
  8. CheckOrigin: func(r *http.Request) bool {
  9. return true
  10. }, // 同源检测函数
  11. EnableCompression: false, // 是否开启消息压缩
  12. }
  13. conn, err := upgrader.Upgrade(w, r, nil)
  14. if err != nil {
  15. fmt.Println(err.Error())
  16. return
  17. }
  18. // 新的协程读取消息
  19. go readPump(conn)
  20. go writePump(conn)
  21. }
  1. // 消息读取泵
  2. func readPump(conn *websocket.Conn) {
  3. defer func() {
  4. _ = conn.Close()
  5. }()
  6. for {
  7. // 读取消息
  8. _, message, err := conn.ReadMessage()
  9. if err != nil {
  10. // 判断ws是否断开
  11. if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
  12. fmt.Println(err.Error())
  13. }
  14. break
  15. }
  16. fmt.Printf("message: %s\n", message)
  17. }
  18. }
  1. func writePump(c *websocket.Conn) {
  2. ticker := time.NewTicker(1 * time.Second)
  3. defer func() {
  4. _ = c.Close()
  5. }()
  6. for {
  7. select {
  8. case <-ticker.C:
  9. // 写入字符串数据
  10. _ = c.WriteMessage(websocket.TextMessage, []byte("你好"))
  11. // 写入json数据
  12. _ = c.WriteJSON(map[string]interface{}{
  13. "code": 200,
  14. })
  15. // 尝试向客户端发送消息
  16. if err := c.WriteMessage(websocket.PingMessage, nil); err != nil {
  17. // 发送失败后关闭客户端连接
  18. return
  19. }
  20. }
  21. }
  22. }