Gin: support realtime?

Created on 5 Apr 2018  路  2Comments  路  Source: gin-gonic/gin

I know it uses HTTP protocol but I'm wondering if somehow it is possible to make real-time API server with gin. is it possible?

Most helpful comment

You can use https://github.com/gorilla/websocket for websocket stuff.
Check out this example:

package main

import (
    "log"
    "net/http"
    "time"

    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"
)

var (
    upgrader = websocket.Upgrader{
        ReadBufferSize:   1024,
        WriteBufferSize:  1024,
        CheckOrigin:      func(r *http.Request) bool { return true },
        HandshakeTimeout: time.Duration(time.Second * 5),
    }
)

func handleWebsocket(c *gin.Context) {
    conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
    if err != nil {
        log.Println("cant upgrade connection:", err)
        return
    }

    for {
        msgType, msgData, err := conn.ReadMessage()
        if err != nil {
            log.Println("cant read message:", err)

            switch err.(type) {
            case *websocket.CloseError:
                return
            default:
                return
            }
        }

        // Skip binary messages
        if msgType != websocket.TextMessage {
            continue
        }

        log.Printf("incoming message: %s\n", msgData)
    }
}

func main() {
    router := gin.Default()
    router.GET("/websocket", handleWebsocket)
    router.Run(":5000")
}

Once the server is running, you can use something like wscat to send test messages.

All 2 comments

You can use https://github.com/gorilla/websocket for websocket stuff.
Check out this example:

package main

import (
    "log"
    "net/http"
    "time"

    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"
)

var (
    upgrader = websocket.Upgrader{
        ReadBufferSize:   1024,
        WriteBufferSize:  1024,
        CheckOrigin:      func(r *http.Request) bool { return true },
        HandshakeTimeout: time.Duration(time.Second * 5),
    }
)

func handleWebsocket(c *gin.Context) {
    conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
    if err != nil {
        log.Println("cant upgrade connection:", err)
        return
    }

    for {
        msgType, msgData, err := conn.ReadMessage()
        if err != nil {
            log.Println("cant read message:", err)

            switch err.(type) {
            case *websocket.CloseError:
                return
            default:
                return
            }
        }

        // Skip binary messages
        if msgType != websocket.TextMessage {
            continue
        }

        log.Printf("incoming message: %s\n", msgData)
    }
}

func main() {
    router := gin.Default()
    router.GET("/websocket", handleWebsocket)
    router.Run(":5000")
}

Once the server is running, you can use something like wscat to send test messages.

It's awesome!
thank #sosedoff 's examle.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

gplume picture gplume  路  3Comments

sofish picture sofish  路  3Comments

rawoke083 picture rawoke083  路  3Comments

olegsobchuk picture olegsobchuk  路  3Comments

iiinsomnia picture iiinsomnia  路  3Comments