Golang实现WebSocket服务的项目实践

 更新时间:2023年05月22日 10:52:43   作者:梦想画家  
本文介绍如何使用Golang实现实时后端WebSocket服务,首先使用Gin框架搭建http服务,然后使用gorilla/websocket库实现简单后端WebSocket服务,具有一定的参考价值,感兴趣的可以了解一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

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

Gin实现Web应用

创建Go工程,新增hello.go文件,编写下面代码:

package main
import "fmt"
func main() {
? ? ?fmt.Println("Hello, World!")
}

运行可以看到输出结果。下面增加Web服务功能。安装Gin库依赖:

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

修改上面hello.go文件内容:

package main
import (
? "fmt"
? "github.com/gin-gonic/gin"
)
func main() {
? ? fmt.Println("Hello, World!")
? ? // 创建Gin引擎实例
? ? r := gin.Default()
? ? // 增加路由ping,简单返回pong
? ? r.GET("/ping", func(c *gin.Context) {
? ? ? ? c.JSON(200, gin.H{
? ? ? ? ? ? "message": "pong",
? ? ? ? })
? ? })
? ? // listen and serve on 0.0.0.0:8080
? ? // 启动HTTP服务
? ? r.Run()?
}

运行程序,访问地址:http://localhost:8080/ping,返回结果:

{
"message": "pong"
}

实现WebSocket服务

创建server.go,修改hello.go文件的main方法为hello(),同一包下不能有两个main方法。需要安装相应的库:go get -u github.com/gorilla/websocket,增加下面内容:

package main
import (
? "fmt"
? "log"
? "net/http"
? "github.com/gin-gonic/gin"
? "github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
? // 解决跨域问题
? CheckOrigin: func(r *http.Request) bool {
? ? return true
? },
}?
func ws(c *gin.Context) {
? //更新get请求使用WebSocket协议
? ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)
? if err != nil {
? ?log. Print("upgrade:", err)
? ?return
? }
? defer ws.Close()
? // 监听 ws 消息
? for {
? ?// 从 ws 读取数据
? ?mt, message, err := ws.ReadMessage()
? ?if err != nil {
? ? log.Println("read:", err)
? ? break
? ?}
? ?log.Printf("recv: %s", message)
? ?//往 ws 写数据
? ?err = ws.WriteMessage(mt, message)
? ?if err != nil {
? ? log.Println("write:", err)
? ? break
? ?}
? }
}
func main() {
? ? fmt.Println("Websocket Server!")
? ? r := gin.Default()
? ? r.GET("/ws", ws)
? ? r.Run("localhost:8448")
}

核心逻辑为:收到消息后,往客户端写回相同内容。代码增加了注释,主要差异就是for循环中的读写消息。下面需要html文件进行交互,新建index.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
? ? ?<meta charset="UTF-8">
? ? ?<meta http-equiv="X-UA-Compatible" content="IE=edge">
? ? ?<meta name="viewport" content="width=device-width, initial-scale=1.0">
? ? ?<title>Univer Server</title>
</head>
<body>
? ? ?<script>
? ? ? ? ?var ws = new WebSocket("ws://localhost:8448/ws");
? ? ? ? ?//打开连接时触发
? ? ? ? ?ws.onopen = function(evt) {
? ? ? ? ? ? ?console.log("Connection open...");
? ? ? ? ? ? ?ws.send("Hello WebSockets!");
? ? ? ? ?};
? ? ? ? ?//接收到消息时触发
? ? ? ? ?ws.onmessage = function(evt) {
? ? ? ? ? ? ?console.log("Received Message: " + evt.data);
? ? ? ? ?};
? ? ? ? ?//连接关闭时触发
? ? ? ? ?ws.onclose = function(evt) {
? ? ? ? ? ? ?console.log("Connection closed.");
? ? ? ? ?};
? ? ?</script>
? ? ?Hello WebSocket.
</body>
</html>

script标签中定义了三个回调函数,连接ws后给服务端发送消息,服务端收到消息返回相同内容,最后时关闭连接时触发。

启动测试

首先启动ws,go run server.go, 启动服务端后等待客户端连接。下面启动客户端,我们可以使用vs code live server启动访问静态页面,也可以使用python启动http服务。在项目目录下打开命令行界面,输入下面命令,启用http服务:

python -m http.server 9000

通过浏览器访问 http://localhost:9000/index.html , 打开浏览器控制台可以看到信息:

Connection open...
index.html:21 Received Message: Hello WebSockets!
index.html:25 Connection closed.

首先看到第一行(连接成功打印的日志),然后是接收服务端发送的信息。最后关闭服务端程序,客户端打印连接断开日志。

到此这篇关于Golang实现WebSocket服务的项目实践的文章就介绍到这了,更多相关Golang WebSocket服务内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • Go语言LeetCode题解961在长度2N的数组中找出重复N次元素

    Go语言LeetCode题解961在长度2N的数组中找出重复N次元素

    这篇文章主要为大家介绍了Go语言LeetCode题解961在长度2N的数组中找出重复N次元素示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言中的延迟函数defer示例详解

    Go语言中的延迟函数defer示例详解

    众所周知golang的defer优雅又简洁, 是golang的亮点之一。所以下面这篇文章主要给大家介绍了关于Go语言中延迟函数defer的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-10-10
  • 利用golang的字符串解决leetcode翻转字符串里的单词

    利用golang的字符串解决leetcode翻转字符串里的单词

    这篇文章主要介绍了利用golang的字符串解决leetcode翻转字符串里的单词,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go map底层实现与扩容规则和特性分类详细讲解

    Go map底层实现与扩容规则和特性分类详细讲解

    这篇文章主要介绍了Go map底层实现与扩容规则和特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • Go?gRPC服务双向流式RPC教程

    Go?gRPC服务双向流式RPC教程

    这篇文章主要为大家介绍了Go?gRPC服务双向流式RPC教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Golang实现简易的命令行功能

    Golang实现简易的命令行功能

    这篇文章主要为大家详细介绍了如何通过Golang实现一个简易的命令行功能,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-02-02
  • Go项目与Docker结合实现高效部署深入探究

    Go项目与Docker结合实现高效部署深入探究

    在现代软件开发中,使用Docker部署应用程序已经成为一种标准实践,本文将深入探讨如何将Go项目与Docker结合,实现高效、可靠的部署过程,通过详细的步骤和丰富的示例,你将能够迅速掌握这一流程
    2023-12-12
  • golang通过递归遍历生成树状结构的操作

    golang通过递归遍历生成树状结构的操作

    这篇文章主要介绍了golang通过递归遍历生成树状结构的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 关于Golang获取当前项目绝对路径的问题

    关于Golang获取当前项目绝对路径的问题

    这篇文章主要介绍了Golang获取当前项目绝对路径的问题,通常的做法是go run用于本地开发,用一个命令中快速测试代码确实非常方便;在部署生产环境时,我们会通过go build构建出二进制文件然后上传到服务器再去执行,那么会产生什么问题呢?感兴趣的朋友一起看看吧
    2022-04-04
  • Go引用github包的详细流程步骤

    Go引用github包的详细流程步骤

    这篇文章主要给大家介绍了关于Go引用github包的详细流程步骤,文中通过图文介绍的非常详细,对大家学习或者使用Go具有一定的参考价值,需要的朋友可以参考下
    2024-02-02

最新评论

?


http://www.vxiaotou.com