GO语言gin框架实战-04-websocket链接

文章目录

1.1 语法

– 升级接口

  • 语法
func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header) (*Conn, error)
  • 语法示例
ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)

– 关闭

  • 语法
func (c *Conn) Close() error
  • 语法示例
defer ws.Close()

– 接收前端信息

  • 语法
func (c *Conn) ReadMessage() (messageType int, p []byte, err error)
  • 语法示例
_, message, err := ws.ReadMessage()

1.2 完整示例

package router

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

func GetLog(c *gin.Context) {

    ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)

    if err != nil {
        fmt.Print("升级websocket连接错误:", err)
        return
    }
    defer ws.Close()

    var sshInfo service.SshInfo
    sshInfo.UserName = c.DefaultQuery("user_name","root")
    sshInfo.SshPort = c.DefaultQuery("ssh_port","22")
    sshInfo.IpAddr = c.Query("ip_addr")
    sshInfo.ProjectName = c.Query("project_name")
    sshInfo.ServiceName = c.Query("service_name")

    _, message, err := ws.ReadMessage()
    if err != nil {
        fmt.Println("接收错误:", err)
    } else {
        fmt.Println("接收到前端消息:", string(message))
        err := service.SendCmd(ws,sshInfo)
        if err !=nil {
            c.JSON(400,gin.H{"status":"END"} )
            return
        }

        log.Println("停止发送")
    }
}
  1. 获取信息从websocket传出

2.1 语法

func (c *Conn) WriteMessage(messageType int, data []byte) error
  • 语法示例
err = conn.WriteMessage(websocket.TextMessage,[]byte(txt))

2.2 完整示例

接前边的示例,ssh到服务器,将docker-compose的实时日志传入 websocket

package service
import (
    "context"
    "crow-logger/config"
    "github.com/gorilla/websocket"
    "github.com/yahoo/vssh"
    "log"
    "time"
)

func SendCmd(conn *websocket.Conn,sshInfo SshInfo)(err error)  {

    vs := vssh.New().Start()
    log.Println(sshInfo)
    config,err := vssh.GetConfigPEM(sshInfo.UserName,config.IdRSAFilePath)
    if err !=nil {
        return err
    }
    for _, addr := range []string{sshInfo.IpAddr+":"+sshInfo.SshPort} {
        err := vs.AddClient(addr, config, vssh.SetMaxSessions(10))
        if err != nil {
            log.Println(err)
        }
    }
    vs.Wait()

    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    cmd:= "cd /data/"+sshInfo.ProjectName+"/"+sshInfo.ServiceName +" && docker-compose logs -f"
    log.Println(cmd)

    timeout, _ := time.ParseDuration("10m")
    respChan := vs.Run(ctx,cmd,timeout)

    resp :=  respChan
    if err = resp.Err(); err != nil {
        log.Fatal(err)
    }

    stream := resp.GetStream()
    defer stream.Close()

    for stream.ScanStdout() {
        txt := stream.TextStdout()
        log.Println(txt)

        err := conn.WriteMessage(websocket.TextMessage,[]byte(txt))
        if err != nil{
            log.Println("写入错误",err)
            return err
        }
    }
    return nil
}
  1. 配置router

gin的router设置没有特别之处,和之前一样。

package router

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

func ServerWebsocket()  {
    r := gin.Default()
    ......
    deployment := r.Group("/api/v1/logger")
    {
        deployment.GET("/",GetLog)
        ......
    }
    r.Run(":1911")
}
  1. 前端调用测试

一个简约的前端测试代码,和后端建立websocket链接。根据需要修改地址和传参:

DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>TestWebsockettitle>

    <script type="text/javascript">
        function LinkServer() {

            var Server_Com;
            if ("WebSocket" in window) {
                Server_Com = new WebSocket("ws://127.0.0.1:1911/api/v1/logger/?user_name=root&ssh_port=22&ip_addr=10.10.239.97&project_name=crust&service_name=gis-server");
                console.log("新建连接到->127.0.0.1:1911");
            }

            Server_Com.onopen = function() {

                Server_Com.send("Hello Server!");
                console.log("已连接上服务器");
            }

            Server_Com.onmessage = function(event) {
                var recv_msg = event.data;

                if (recv_msg == "Hello Client!") {
                    console.log("接收到服务器的问候: " + recv_msg);
                } else {
                    document.getElementById("Time").textContent = recv_msg;
                    console.log("接收到服务器数据: " + recv_msg);
                }
            }
        }
    script>
head>

<body>
    <p>接收到的信息:p>
    <p id="Time">crow-logger测试p>

    <button onclick="LinkServer()">连接button>

body>

html>
  • 结果
    GO语言gin框架实战-04-websocket链接

GO语言gin框架实战-04-websocket链接

Original: https://blog.csdn.net/xingzuo_1840/article/details/127744279
Author: 开发运维玄德公
Title: GO语言gin框架实战-04-websocket链接

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/660461/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球