go使用gorilla/websocket实现websocket

前言

Gorilla WebSocket 是一个用于 Go 语言的 WebSocket 协议实现,而且是一个优秀的组件库,能快速实现websocket协议

websocket实现

依赖安装

使用以下依赖安装对应的库

arduino 复制代码
go get github.com/gorilla/websocket

程序实现

go 复制代码
package main

import (
    "fmt"
    "github.com/gorilla/websocket"
    "log"
    "net/http"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  4196,
    WriteBufferSize: 1124,
    CheckOrigin: func(r *http.Request) bool {

       //if r.Method != "GET" {
       // fmt.Println("method is not GET")
       // return false
       //}
       //if r.URL.Path != "/ws" {
       // fmt.Println("path error")
       // return false
       //}
       return true
    },
}

var m map[string]*websocket.Conn

// ServerHTTP 用于升级协议
func ServerHTTP(w http.ResponseWriter, r *http.Request) {
    // 收到http请求之后升级协议
    conn1, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
       log.Println("Error during connection upgrade:", err)
       return
    }
    userId := r.FormValue("userId")
    log.Println("userId:" + userId)
    defer conn1.Close()
    m[userId] = conn1

    conn := m[userId]

    for {
       // 服务端读取客户端请求
       messageType, message, err := conn.ReadMessage()
       if err != nil {
          log.Println("Error during message reading:", err)
          break
       }
       log.Printf("Received:%s", message)

       // 开启关闭连接监听
       conn.SetCloseHandler(func(code int, text string) error {
          fmt.Println(code, text) // 断开连接时将打印code和text
          return nil
       })

       //服务端给客户端返回请求
       err = conn.WriteMessage(messageType, message)
       conn.WriteMessage(websocket.TextMessage, []byte("aaa"))
       if err != nil {
          log.Println("Error during message writing:", err)
          return
       }

    }
}

func home(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Index Page")
}

func main() {
    //a, _ := strconv.Atoi("1")
    //fmt.Println(a)

    m = make(map[string]*websocket.Conn)

    // 创建HTTP服务器
    http.HandleFunc("/ws", ServerHTTP)
    log.Println("Server started on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

启动之后

使用postman连接服务端

发送消息

总结

Gorilla WebSocket 提供了一个完整且经过测试的 WebSocket 协议实现,适用于构建高效的 WebSocket 应用程序

相关推荐
KylinLab5 分钟前
TRAE Bot 上手实测:任务级模型固定 DeepSeek-V4.1-Flash,九步流程只留两步工件
程序员
紧跟先前的步伐5 分钟前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
李剑一7 分钟前
她是世界上第一位程序员,写下了人类第一行代码,但却因偏执的信任数学计算而早逝
程序员
Hespethorn8 分钟前
112 个 Valgrind 错误,1 个根因:C++ 多线程服务的关机顺序复盘
后端·架构
小兔子16 分钟前
new Date('2024-01-01') 和 new Date('2024/01/01') 差在哪
后端
Oiiouui2 小时前
linux服务器部署Logto后端与对应前端的实现
linux·服务器·前端·后端
shenlongproxy2 小时前
代理IP故障演练怎么做:注入怎么分档、恢复怎么判定
后端
知识搬运临时工2 小时前
Kafka 发 1 GiB 数据,用户态 CPU 只花 0.016 秒,总耗时反而慢了 11%
后端·kafka
wt95272 小时前
VMware 虚拟机磁盘扩容实战文档(Ubuntu 22.04 + LVM)
linux·后端
王中阳Go2 小时前
预算给够了,时间花错了地方:三跳链路给了 27 秒,实际只用掉 9 秒
人工智能·后端·性能优化