Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了golang websocket大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_4@

项目名称:websocketa

1. server.go

package main

import (
    "github.com/gin-gonic/gin"
    "websocketa/middleware"
    "websocketa/controllers"
)

func main() {
    route := gin.Default()
    route.Use(middleware.WsMiddlewarE)
    route.GET("ws",controllers.Wstest)
    route.Run("0.0.0.0:5000")
}
@H_404_4@

2. 处理函数:controllers/controller.go

package controllers

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"
    "github.com/json-iterator/go"
    "sync"
    "time"
    "reflect"
    "log"
)

type dataClient struct {
    Conn     *websocket.Conn
    reciveParam   []String
    exitChan chan struct{}
}
func (wc *dataClient) Close() {
    wc.Conn.Close()
}
func (wc *dataClient) StartAndWait() {
    wc.exitChan = make(chan struct{})
    defer close(wc.exitChan)

    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        defer wg.Done()
        wc.listen()
    }()
    go func() {
        defer wg.Done()
        wc.write()
    }()
    wg.Wait()
}

func (wc *dataClient) write() {
    ticker := time.NewTicker(time.Second * 5)
    defer ticker.Stop()
    for {
        SELEct {
        case <-wc.exitChan:
            return
        default:
            wc.send()
            <-ticker.C
        }
    }
}

func (wc *dataClient) listen() {
    for {
        _,msg,err := wc.Conn.Readmessage()
        if err != nil {
            wc.exitChan <- struct{}{}
            return
        }

        param := String(msg)
        fmt.Println(reflect.TypeOf(param),param)
        err = jsoniter.Unmarshal(msg,wc.reciveParam)
        log.Println(err)
        //wc.send()  // 可以单独发一次消息
    }
}

func (wc *dataClient) send() {
    var result String
    if len(wc.reciveParam) == 0{
        // 逻辑
        result = "reciveParam is empty"
    }else {
        // 拿到客户端发过来的参数,逻辑操作
        result = fmt.Sprintf("reciveParam is %v",wc.reciveParam)
    }
    returnBytes,_ := jsoniter.Marshal(result)
    fmt.Println(String(returnBytes))
    wc.Conn.Writemessage(websocket.Textmessage,returnBytes)
}

func Wstest(ctx *gin.Context) {
    cli := dataClient{
        Conn: ctx.MustGet("websocketConnection").(*websocket.Conn),exitChan:make(chan struct{}),}
    defer cli.Close()
    cli.StartAndWait()
    fmt.Println(44)
}
@H_404_4@

3. 中间件:middlewares/middleware.go

package middleware

import (
    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"
    "net/http"
    "time"
)

var wsUpgrade = websocket.Upgrader{
    ReadBufferSize:   1024,WriteBufferSize:  1024,HandshakeTimeout: 5 * time.Second,checkOrigin: func(r *http.request) bool {
        return true
    },EnableCompression: true,}

// websocket中间件
func WsMiddleware(ctx *gin.Context) {
    conn,err := wsUpgrade.Upgrade(ctx.Writer,ctx.request,nil)
    if err != nil {
        ctx.AbortWithStatusJSON(400,gin.H{})
    } else {
        ctx.Set("websocketConnection",conn)
        ctx.Next()
    }
}
@H_404_4@

4. 测试:wsTest.html

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>title</title>
</head>
<body>

</body>
<script type="text/javascript">
    let websocket = new WebSocket("ws://localhost:5000/ws");
    websocket.onmessage = function (E) {
        console.log(e.data);
    }
    // websocket.onopen = function () {
        // websocket.send(JSON.Stringify([
        //     "hahaha",
        // ]));
        // websocket.send(JSON.Stringify([
        //     "item1",
        //     "item2",
        // ]));
    // }
</script>
</html>
@H_404_4@ @H_404_4@
@H_404_4@
@H_404_4@
本图文内容来源于网友网络收集整理提供,作为学习参使用,版权属于原作者。

猜你在找的Go相关文章

方法和接收者 Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self。 Go 语言中同时
函数是组织好的、可重复使用的、用于执行指定任务的代码块。 Go语言中支持函数、匿名函数和闭包,并且函数在Go语言中属于“一等公民”。 函数定义 Go语言中定义函数使用func关键字,具体格式如下: f
面向对象的三大特征: 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式 继承:使得子类具有父类的属性和方法或者重新定义、追加属性和方法等 多态:不同对象中同种行为的不同实现方式 Go并不是一个纯
在工程化的开发项目中,Go语言的源码复用是建立在包(package)基础之上的。 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言提供了很多内置包,如fmt、os、io等。
为什么要学 Go 性能优越感;Go 极其地快,其性能与 Java 或 C++相似。在使用中,Go 一般比 Python 要快 30 倍; 序列化/去序列化、排序和聚合中表现优异; 开发者效率较高;多种
什么是反射 官方关于反射定义: Reflection in compuTing is the ability of a program to examine its own structure, pa
因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性。 func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ su
接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。 接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型。 interface是

大佬总结

以上是大佬教程为你收集整理的golang websocket全部内容,希望文章能够帮你解决golang websocket所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。