Golang实现WebSocket服务的项目实践

 更新时间:2023年05月22日 10:52:43   作者:梦想画家  
本文介绍如何使用Golang实现实时后端WebSocket服务,首先使用Gin框架搭建http服务,然后使用gorilla/websocket库实现简单后端WebSocket服务,具有一定的参考价值,感兴趣的可以了解一下

我们每天接触到各类应用,如社交、在线文档、直播等,后端都需要使用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 在 MongoDB 中常用查询与修改的操作

    Go 在 MongoDB 中常用查询与修改的操作

    这篇文章主要介绍了Go 在 MongoDB 中常用查询与修改的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • golang中byte和rune用法及新手易错点总结

    golang中byte和rune用法及新手易错点总结

    golang内置类型有rune类型和byte类型,下面这篇文章主要给大家介绍了关于golang中byte和rune用法及新手易错点总结的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • 7分钟读懂Go的临时对象池pool以及其应用场景

    7分钟读懂Go的临时对象池pool以及其应用场景

    这篇文章主要给大家介绍了关于如何通过7分钟读懂Go的临时对象池pool以及其应用场景的相关资料,文中通过示例代码介绍的非常详细,对大家学习或使用Go具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-11-11
  • golang xorm日志写入文件中的操作

    golang xorm日志写入文件中的操作

    这篇文章主要介绍了golang xorm日志写入文件中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang中的int类型和uint类型到底有多大?

    Golang中的int类型和uint类型到底有多大?

    int和uint类型在我们日常开发中经常会用到,但有个疑问就是这两个类型有多大,通过各种尝试最终得到了答案,所以下面这篇文章主要给大家介绍了关于Golang中的int类型和uint类型到底有多大的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-12-12
  • Golang Time包与日期函数的用法详解

    Golang Time包与日期函数的用法详解

    在golang中,time包提供了时间的显示和测量用的函数,下面小编就来和大家详细聊聊Golang中Time包与日期函数的具体用法,快跟随小编一起学习一下吧
    2023-07-07
  • Go语言的变量、函数、Socks5代理服务器示例详解

    Go语言的变量、函数、Socks5代理服务器示例详解

    这篇文章主要介绍了Go语言的变量、函数、Socks5代理服务器的相关资料,需要的朋友可以参考下
    2017-09-09
  • Golang使用cobra实现命令行程序的示例代码

    Golang使用cobra实现命令行程序的示例代码

    Cobra 是 Go 语言中一个强大的命令行应用库,它提供了创建命令行工具所需的基本结构和功能,被许多开发者用于构建各种命令行工具和应用程序,本文将给大家介绍Golang使用cobra实现命令行程序,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • Golang指针的操作以及常用的指针函数

    Golang指针的操作以及常用的指针函数

    本文主要介绍了Golang指针的操作以及常用的指针函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • go语言区块链实战实现简单的区块与区块链

    go语言区块链实战实现简单的区块与区块链

    这篇文章主要为大家介绍了go语言区块链的实战学习,来实现简单的区块与区块链示例过程,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10

最新评论