golang框架怎么添加websocket的功能

基本上这个基础框架拿到手之后就可以做一些自己想要做的改动了,比如你想添加个队列的插件,你可以在相应的目录里面进行修改了,但我想让它更通用一些,本篇文章将会启动一个websocket服务,并且把配置文件改成yaml格式。

修改配置

之所以想要把配置从json改为yaml,有以下几点原因:

  1. json主要是用于信息传输,而yaml更适合作为配置文件的格式来使用,两者的用途不一样;
  2. yaml格式看起来比json更加清晰;
  3. 在yaml文件中可以添加注释,让配置更加易懂。

在此,解析yaml文件用的包是"gopkg.in/yaml.v2",例子可以在github上找到,文末可以找到本项目的链接。

为框架添加websocket的服务

我希望这个项目能够尽可能地涵盖一些基础的功能,所以我为它添加了websocket的接口,来看看我具体是怎么做的。

之前说过本项目的具体处理逻辑都会在process/controller下进行,而接口层面则是在http和rpc目录下去分发。在添加websocket进到这个框架之前,我们要先知道一点:websocket是一种协议,一种在http上升级的协议,所以它并不像我们之前开启http服务一样,直接监听端口,而是在http服务上开一个接口,通过接口去实现服务端与客户端的连接,好了,明确了这一点之后,我们来看看代码方面如何实现。

首先,我们添加一个路由。

engine.GET("/ws", Ws)

然后,实现路由指向的handler–Ws。

func Ws(ctx *gin.Context) {
    ws, err := upGrader.Upgrade(ctx.Writer, ctx.Request, nil)
    if err != nil {
        return
    }
    defer ws.Close()
    for {
        //读取数据
        mt, message, err := ws.ReadMessage()
        if err != nil {
            break
        }
        if string(message) == "ping" {
            message = []byte("pong")
        }
        if string(message) == "server_time" {
            resp, _, _ := controller.GetServerTime()
            serverTime := strconv.FormatInt(resp.ServerTime, 10)
            message = []byte(serverTime)
        }
        //写入数据
        err = ws.WriteMessage(mt, message)
        if err != nil {
            break
        }
    }
}

注意一下,这一句代码:

ws, err := upGrader.Upgrade(ctx.Writer, ctx.Request, nil)

前面说了,websocket是一个协议,一个http之上的协议,因此,我们对http“升级”了。代码中还用了一个for循环,这就很像是http的监听一样。为了统一,我们调用了controller.GetServerTime()来获取系统时间,这就让http接口和ws接口都统一了,真正的实现逻辑都在controller。

再来,我们写一个客户端来测试:

func TestWs(t *testing.T) {
    var dialer *websocket.Dialer

    conn, _, err := dialer.Dial("ws://127.0.0.1:8080/ws", nil)
    if err != nil {
        fmt.Println(err)
        return
    }

    go timeWriter(conn)

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            fmt.Println("read:", err)
            return
        }

        fmt.Printf("received: %s\n", message)
    }
}

func timeWriter(conn *websocket.Conn) {
    for {
        time.Sleep(time.Second * 2)
        conn.WriteMessage(websocket.TextMessage, []byte(time.Now().Format("2006-01-02 15:04:05")))
        conn.WriteMessage(websocket.TextMessage, []byte("ping"))
        conn.WriteMessage(websocket.TextMessage, []byte("server_time"))
    }
}

到此为止,我们就为这个框架添加了websocket的功能,并且把配置文件的格式从json改为了yaml,看起来更加清晰了。

原创文章,作者:YBEYU,如若转载,请注明出处:https://www.beidanyezhu.com/a/26239.html

(0)
YBEYU的头像YBEYU
上一篇 2025-01-01 17:24:57
下一篇 2025-01-01 17:24:59

相关推荐

  • golang中导入包的方法

    这篇文章运用简单易懂的例子给大家介绍golang中导入包的方法,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 import Go 使用包(package)作为…

  • go语言中gin框架的错误处理

    默认的错误处理是 errors.New("错误信息"),这个信息通过 error 类型的返回值进行返回。 举个简单的例子: func hello(name st…

  • 如何升级golang的版本

    升级Golang 主要步骤: 1、卸载旧版本 2、下载新版本 3、安装新版本 4、配置环境变量 详细步骤: 1、卸载旧版本 首先,执行 go env,列出关于go的环境信息,查看 …

  • Golang实现REST API架构

    有一种说法,golang 编写的 API 不能像其他语言那样简单和通用。但实际上,我遇到很多 REST API 的代码,非常多的抽象,使得代码库变得混乱和复杂,最终伤害了可读性和可…

    2025-01-03
  • golang有哪些数据类型

    这期内容当中小编将会给大家带来有关golang有哪些数据类型,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 在 Go 编程语言中,数据类型用于声明函数和变量。…

  • golang是什么

    golang是什么?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。 Go(又称Golang)是Google开发的一种静态…

  • 如何用golang实现约瑟夫环

    约瑟夫环概念: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从…

    2025-01-02
  • golang的字符串操作

    Go语言简介 Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。 罗伯特·格瑞史莫(Robert Griesemer),罗勃…

  • go语言有哪些Web框架

    Go是一门正在快速增长的编程语言,专为构建简单、快速且可靠的软件而设计。下面给大家介绍介绍几款Go语言快速开发的web框架,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有…

    2025-01-02
  • golang中的链接link是什么

    链接(link) 我们编写的程序可能会使用其他程序或程序库( library ) 正如我们在helloworld程序中使用的fmt package 我们编写的程序必须与这些程序或程…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部