Golang实现简单WebSocket服务

这篇具有很好参考价值的文章主要介绍了Golang实现简单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.

首先看到第一行(连接成功打印的日志),然后是接收服务端发送的信息。最后关闭服务端程序,客户端打印连接断开日志。文章来源地址https://www.toymoban.com/news/detail-592953.html

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

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

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

相关文章

  • Golang 搭建 WebSocket 应用(三) - 实现一个消息推送中心

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

    2024年01月23日
    浏览(41)
  • golang --gin+websocket实现指定的数据点推送

    这里提到的endpointId是一个负载了数据的逻辑点,就像一根水管的出口,有新数据来就会根据后端记录的endpointId推送到用户正在查看的endpointId。用户没有正在查看的endpoint就不会有新数据推送。这里如果如果对endpoint加上权限就相当于实现对实时数据的准确推送。 这里的代码

    2024年02月01日
    浏览(43)
  • Golang 搭建 WebSocket 应用(一) - 初识 gorilla/websocket

    在本系列文章中,将会使用在 Go 中一个用得比较多的 WebSocket 实现 gorilla/websocket。 本文会涉及到一些原理讲解,其中比较关键的一个是 HTTP 与 WebSocket 的联系与区别,了解这个可以帮助我们更好地使用 WebSocket 。 如果我们此前已经使用过 WebSocket ,比如在 nginx 配置过 WebSocke

    2024年01月21日
    浏览(44)
  • Golang WebSocket 创建单独会话

    在互联网应用程序中,实时通信是一种非常重要的功能。WebSocket 是一种基于 TCP 的协议,它允许客户端和服务器之间进行双向通信。Golang 是一种高性能的编程语言,它提供了对 WebSocket 的原生支持,使得在 Golang 中创建 WebSocket 会话变得非常简单。本文将介绍如何使用 Golang 创

    2024年02月08日
    浏览(36)
  • golang网络编程学习-websocket

    golang网络编程学习-websocket 网络编程主要的内容是: 1.TCP网络编程 2.http服务 3.rpc服务 4.websocket服务 1.1服务端,代码来自网络,仅限于学习研究   服务端截图   1.2客户端,代码来自网络,仅限于学习研究      客户端浏览器运行内容信息    

    2024年02月17日
    浏览(50)
  • golang语言websocket百万长链接

    是简单demo测试 cup 最理想的处理大概是每秒100万次,已经到了极限 减少网络小包的发送,小包大概几百字节,把同一秒中的推送的条数合并成一条,合并后 每秒推送的次数 等于 连接数 , 打包json

    2023年04月13日
    浏览(38)
  • golang中的websocket,使用wireshark抓包

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

    2024年02月09日
    浏览(41)
  • Golang 实现一个简单的 RPC 服务

    分享一个简单的 rpc 服务框架 一、服务端实现 二、客户端实现

    2024年04月10日
    浏览(45)
  • 使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——简单应用

    在诸如广告、推荐等系统中,我们往往会涉及过滤、召回和排序等过程。随着系统业务变得复杂,代码的耦合和交错会让项目跌入难以维护的深渊。于是模块化设计是复杂系统的必备基础。这篇文章介绍的业务框架脱胎于线上多人协作开发、高并发的竞价广告系统,在实践中

    2024年02月14日
    浏览(44)
  • Java实现WebSocket客户端和服务端(简单版)

    天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 写在前面: WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket通信协议于

    2024年02月08日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包