golang Gin实现websocket

这篇具有很好参考价值的文章主要介绍了golang Gin实现websocket。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

golang使用 Gin实现 websocket,这里笔者重新搭建一个项目

1、创建项目安装依赖

项目名为 go-gin-websocket

在指定文件夹下,新建项目文件夹 go-gin-websocket

golang Gin实现websocket

进入项目文件夹,打开cmd窗口,在项目(go-gin-websocket)文件夹路径下,执行初始化命令 go mod init go-gin-websocket

go mod init go-gin-websocket

golang Gin实现websocket

安装依赖

安装gin

go get -u github.com/gin-gonic/gin

 安装websocket

go get github.com/gorilla/websocket

golang Gin实现websocket

2、搭建项目

在项目目录下新建controller、static、templates、ws文件夹,分别用来存放controller代码、静态文件、页面、websocket代码

golang Gin实现websocket

在templates目录下新建 index.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
hello
<script>
    var webSocket;
    try {
        webSocket = new WebSocket('ws://127.0.0.1:8080/ws?id=abc123456789');
    }catch (e) {
        console.log(e)
    }

    webSocket.onerror = function(event) {}

    //与WebSocket建立连接
    webSocket.onopen = function(event) {
        console.log('建立连接')
        console.log(JSON.stringify(event))
        var msg = "身无彩凤双飞翼,心有灵犀一点通"
        //发送消息
        webSocket.send(msg);
    };
    //接收服务端发送的消息
    webSocket.onmessage=function (m) {
        console.log(m)
        console.log(m.data)
    }
</script>
</body>
</html>

在controller目录下新建 page_controller.go

package controller

import "github.com/gin-gonic/gin"

func Index(c *gin.Context) {
	c.HTML(200, "index.html", nil)
}

在ws目录下新建 websocket.go

package ws

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

func InitWebSocket(c *gin.Context) {
	var upgrader = websocket.Upgrader{
		ReadBufferSize:  1024,
		WriteBufferSize: 1024,
		CheckOrigin: func(r *http.Request) bool {
			log.Println("升级协议", r.Header["User-Agent"])
			return true
		},
	}

	conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
	if err != nil {
		log.Println(err)
		return
	}
	defer conn.Close()
	userId := c.Query("id")
	log.Println("用户id:", userId)

	for {
		mt, message, err := conn.ReadMessage()

		log.Println("获取客户端发送的消息:" + string(message))
		fmt.Println(mt)
		if err != nil {
			log.Println(err)
			break
		}

		var msg = "春风得意马蹄疾,一日看尽长安花"
		err2 := conn.WriteMessage(websocket.TextMessage, []byte(msg))
		if err2 != nil {
			log.Println("write:", err2)
			break
		}
	}

}

在项目根目录下新建 main.go

golang Gin实现websocket

main.go内容

package main

import (
	"github.com/gin-gonic/gin"
	"go-gin-websocket/controller"
	"go-gin-websocket/ws"
)

func main() {
	e := gin.Default()
	//html页面位置
	e.LoadHTMLGlob("templates/*")
	//静态文件位置
	e.Static("/static", "./static")

	e.GET("/", controller.Index)
	e.GET("/ws", ws.InitWebSocket)

	e.Run("0.0.0.0:8080")
}

3、运行测试

浏览器请求 http://localhost:8080/

golang Gin实现websocket

4、添加session

添加session用来存储在线用户

这里使用一个map用来保存,key是用户id,value是websocket连接,再加一个读写锁保证线程安全

package ws

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/gorilla/websocket"
	"log"
	"net/http"
	"sync"
)

var connects = make(map[string]*websocket.Conn)
var lock sync.RWMutex

func addSession(id string, conn *websocket.Conn) {
	lock.Lock()
	connects[id] = conn
	defer lock.Unlock()
}
func getSession(id string) *websocket.Conn {
	lock.RLock()
	defer lock.RUnlock()
	return connects[id]
}
func removeSession(id string) {
	lock.Lock()
	delete(connects, id)
	defer lock.Unlock()
}

func InitWebSocket(c *gin.Context) {
	var upgrader = websocket.Upgrader{
		ReadBufferSize:  1024,
		WriteBufferSize: 1024,
		CheckOrigin: func(r *http.Request) bool {
			log.Println("升级协议", r.Header["User-Agent"])
			return true
		},
	}

	conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
	if err != nil {
		log.Println(err)
		return
	}
	defer conn.Close()
	userId := c.Query("id")
	log.Println("用户id:", userId)

	//添加session
	addSession(userId, conn)

	for {
		mt, message, err := conn.ReadMessage()

		log.Println("获取客户端发送的消息:" + string(message))
		fmt.Println(mt)
		if err != nil {
			log.Println(err)
			break
		}

		var msg = "春风得意马蹄疾,一日看尽长安花"
		err2 := conn.WriteMessage(websocket.TextMessage, []byte(msg))
		if err2 != nil {
			log.Println("write:", err2)
			break
		}
	}

}

至此完文章来源地址https://www.toymoban.com/news/detail-462591.html

到了这里,关于golang Gin实现websocket的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

    ElasticSearch 是一个基于 Lucene 的 搜索服务器 ,它提供了一个 分布式多用户 能力的 全文搜索引擎 ,基于 RESTful web 接口,Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎,设计用于云计算中,能够达到 实时搜索 , 稳定 , 可靠

    2024年02月11日
    浏览(58)
  • [golang gin框架] 26.Gin 商城项目-前台自定义商品列表模板, 商品详情数据渲染,Markdown语法使用

    当在首页分类点击进入分类商品列表页面时,可以根据后台分类中的分类模板跳转到对应的模板商品列表页面 (1).商品控制器方法Category()完善 修改controllers/frontend/productController.go中的方法Category(), 判断分类模板,如果后台没有设置,则使用默认模板 (2).模板页面案例 先来回顾一

    2024年02月01日
    浏览(55)
  • Golang gin middleware的编写与使用 context.Next函数

    在web应用服务中,完整的一个业务处理在技术上包含 客户端操作、服务器端处理、返回处理结果给客户端三个步骤。 在实际的业务开发和处理中,会有更负责的业务和需求场景。一个完整的系统可能要包含鉴权认证、权限管理、安全检查、日志记录等多维度的系统支持。 鉴

    2024年02月09日
    浏览(55)
  • Gin+WebSocket实战——在线聊天室WebSocketDemo详细使用教程

    Github:https://github.com/palp1tate/WebsocketDemo 欢迎star!😎 利用 Gin + WebSocket 实现的在线聊天室 Demo 项目,支持加入/离开聊天室广播、给其他用户发送消息等。 进入项目根目录,执行命令 go run . 命令,结果如下: 可以看到们的 HTTP 服务已经启动成功并运行在了 8080 端口上。 接下

    2024年04月26日
    浏览(74)
  • Golang实现简单WebSocket服务

    我们每天接触到各类应用,如社交、在线文档、直播等,后端都需要使用WebSocket技术提供实时通信能力。本文介绍如何使用Golang实现实时后端WebSocket服务,首先使用Gin框架搭建http服务,然后使用 gorilla/websocket 库实现简单后端WebSocket服务,示例实现从0到1的过程,适合初学者快

    2024年02月16日
    浏览(43)
  • golang中的websocket,使用wireshark抓包

    websocket 是一个长连接协议,全双工通信,主要应用在及时通信:实时聊天,游戏,在线文档等等。 简单示例 客户端 服务端 运行 go run server.go 访问 http://xxx.xxx.xxx.xxx:8080/ 请求头 响应头 websocket 是在 http 的基础上改造而成的,首先客户端改造成上面的请求头,服务端先要构建

    2024年02月09日
    浏览(41)
  • Golang 搭建 WebSocket 应用(三) - 实现一个消息推送中心

    有了前两篇的铺垫,相信大家已经对 Golang 中 WebSocket 的使用有一定的了解了, 今天我们以一个更加真实的例子来学习如何在 Golang 中使用 WebSocket 。 在实际的项目中,往往有一些任务耗时比较长,然后我们会把这些任务做异步的处理,但是又要及时给客户端反馈任务的处理进

    2024年01月23日
    浏览(41)
  • golang微框架Gin

    Gin是一个golang的微框架,基于httprouter,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点 Gin特征 速度快:基于基数树的路由,内存占用小,没有反射,可预测的APi性能 中间件支持 传入的http请求可以有中间件链和最终操作处理,例如:Logger,Aut

    2024年02月09日
    浏览(43)
  • [golang gin框架] 39.Gin商城项目-微服务实战之微服务架构

    单体架构在 中小企业内部 用的是非常多的,当 业务不复杂 , 团队规模不大 的时候,单体架构比微服务架构具有 更高的生产率 单体架构 当 业务比较复杂 , 并发量 比较大, 团队规模扩大的时候, 就需要引入微服务架构了,它比单体架构 具有 更高的生产率, 可以 节省成本 , 解

    2024年02月12日
    浏览(43)
  • Golang中Gin 自定义验证方法

    1.怎样写一个自定义验证方法 2. 怎样管理自定义验证方法 1. 怎样写一个自定义验证方法 在Gin框架中,可以使用 binding 标签实现参数的校验。但有些特殊的需求,可能需要自己定义一些校验方法。下面是一些例子: 》自定义验证正则表达式: 可以通过 binding 标签中的自定义函

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包