Golang Gin框架 go中 websocket使用 gorilla/websocket使用教程
2023-12-29 14:23:06
前言
公司新项目需要用websockt做及时通讯,golang语言,看了下websocket的库,选用使用人数比较多的gorilla/websocket
框架介绍
Gin框架是一个用Go语言编写的轻量级Web框架,而gorilla/websocket是Go语言中用于处理WebSocket的库。结合这两者可以实现在Gin应用中添加WebSocket功能。以下是一个简单的例子,演示了如何在Gin应用中使用gorilla/websocket。
接入流程
- 首先,确保你已经安装了Gin和gorilla/websocket库:
go get -u github.com/gin-gonic/gin
go get -u github.com/gorilla/websocket
- 代码demo
package main
import (
"log"
"net/http"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
// 在这里进行权限验证,返回true表示验证通过,允许连接
// 你可以根据需要实现自己的验证逻辑
return true
},
}
func main() {
r := gin.Default()
// 提供一个HTTP端点用于升级连接为WebSocket
r.GET("/ws", func(c *gin.Context) {
serveWebSocket(c.Writer, c.Request)
})
r.Run(":8080")
}
func serveWebSocket(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
for {
// 读取客户端发送的消息
messageType, p, err := conn.ReadMessage()
if err != nil {
log.Println(err)
return
}
// 将消息原样发送回客户端
err = conn.WriteMessage(messageType, p)
if err != nil {
log.Println(err)
return
}
}
}
- 代码调试,测试的时候我改了端口和路由,使用的是谷歌浏览器插件,
Ctool 程序开发常用工具
4. 后续根据需要调整业务代码就可以了,如果需要wss,可以结合nginx ssl证书进行升级
···
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /path/to/your_cert.crt;
ssl_certificate_key /path/to/your_private_key.key;
location / {
proxy_pass http://127.0.0.1:8080; # 这里是你的Gin应用的地址和端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
···
总结
在Nginx中:
- 配置Nginx反向代理,确保WebSocket握手的头信息正确传递:
2. HTTPS接入
在上述Nginx配置中,已经包含了HTTPS的设置。确保使用正确的证书和私钥文件路径,并将域名和端口替换为你的实际值。
3. 部署与测试
-
部署Gin应用和Nginx配置。
-
测试WebSocket连接是否正常,确保Nginx能够正确地将WebSocket握手流量传递到Gin应用。
-
测试HTTPS连接,确保Nginx能够正确地处理HTTPS请求并将流量传递给Gin应用。
请注意:在生产环境中,确保证书的安全性,使用由受信任的证书颁发机构签发的证书,并定期更新证书。对于WebSocket权限验证,根据实际需求修改Gin应用中的验证逻辑。
文章来源:https://blog.csdn.net/u010844836/article/details/135253498
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!