Golang Gin框架 go中 websocket使用 gorilla/websocket使用教程

本文介绍了如何在Golang项目中使用Gin框架配合gorilla/websocket库实现WebSocket实时通讯,包括接入流程、代码示例、Nginx反向代理配置和HTTPS接入的注意事项。
摘要由CSDN通过智能技术生成

前言

公司新项目需要用websockt做及时通讯,golang语言,看了下websocket的库,选用使用人数比较多的gorilla/websocket


框架介绍

Gin框架是一个用Go语言编写的轻量级Web框架,而gorilla/websocket是Go语言中用于处理WebSocket的库。结合这两者可以实现在Gin应用中添加WebSocket功能。以下是一个简单的例子,演示了如何在Gin应用中使用gorilla/websocket。


接入流程

  1. 首先,确保你已经安装了Gin和gorilla/websocket库:
go get -u github.com/gin-gonic/gin
go get -u github.com/gorilla/websocket
  1. 代码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
		}
	}
}

  1. 代码调试,测试的时候我改了端口和路由,使用的是谷歌浏览器插件, 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中:

  1. 配置Nginx反向代理,确保WebSocket握手的头信息正确传递:

2. HTTPS接入

在上述Nginx配置中,已经包含了HTTPS的设置。确保使用正确的证书和私钥文件路径,并将域名和端口替换为你的实际值。

3. 部署与测试

  1. 部署Gin应用和Nginx配置。

  2. 测试WebSocket连接是否正常,确保Nginx能够正确地将WebSocket握手流量传递到Gin应用。

  3. 测试HTTPS连接,确保Nginx能够正确地处理HTTPS请求并将流量传递给Gin应用。

请注意:在生产环境中,确保证书的安全性,使用由受信任的证书颁发机构签发的证书,并定期更新证书。对于WebSocket权限验证,根据实际需求修改Gin应用中的验证逻辑。

Golang中的Gin框架提供了一种简单而强大的方法来构建Web应用程序。与此同时,Golang标准库中的"net/http"包提供了构建WebSocket服务器和客户端的功能。 首先,我们来看一下如何使用GinWebSocket构建WebSocket服务器。首先,需要导入相关的包: ```go import ( "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) ``` 接下来,在Gin中创建一个WebSocket处理函数: ```go func WebSocketHandler(c *gin.Context) { upgrader := websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } conn, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } for { messageType, message, err := conn.ReadMessage() if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } err = conn.WriteMessage(messageType, message) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } } } ``` 上面的代码创建了一个基本的WebSocket处理函数。它使用WebSocket标准库中的Upgrader结构来处理升级连接并创建一个WebSocket连接。 然后,我们需要在Gin中设置路由来处理WebSocket请求: ```go router := gin.Default() router.GET("/ws", WebSocketHandler) ``` 以上代码将在根路径下创建一个WebSocket处理函数。 接下来,我们来看一下如何使用GolangGin构建WebSocket客户端。首先,我们需要导入所需的包: ```go import ( "github.com/gorilla/websocket" "net/http" ) ``` 然后,我们可以使用以下代码来创建一个WebSocket客户端: ```go func main() { c, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil) if err != nil { log.Fatal("dial:", err) } defer c.Close() done := make(chan struct{}) go func() { defer close(done) for { _, message, err := c.ReadMessage() if err != nil { log.Println("read:", err) return } log.Printf("recv: %s", message) } }() ticker := time.NewTicker(time.Second) defer ticker.Stop() for { select { case <-done: return case <-ticker.C: err := c.WriteMessage(websocket.TextMessage, []byte("Hello, Server!")) if err != nil { log.Println("write:", err) return } } } } ``` 上面的代码创建了一个WebSocket客户端,它使用WebSocket标准库中的`DefaultDialer`结构来建立WebSocket连接。 以上就是使用Golang GinWebSocket构建WebSocket客户端和服务器的简单示例。这些代码可以帮助我们使用GinGolang的标准库来构建强大的Web应用程序,并处理WebSocket通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫忘初心丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值