Echo Web框架

 主页   资讯   文章   代码   电子书 

WebSocket

使用 net 库的 WebSocket

服务端

server.go

package main

import (
    "fmt"
    "log"

    "github.com/labstack/echo"
    "github.com/labstack/echo/middleware"
    "golang.org/x/net/websocket"
)

func hello(c echo.Context) error {
    websocket.Handler(func(ws *websocket.Conn) {
        defer ws.Close()
        for {
            // Write
            err := websocket.Message.Send(ws, "Hello, Client!")
            if err != nil {
                log.Fatal(err)
            }

            // Read
            msg := ""
            err = websocket.Message.Receive(ws, &msg)
            if err != nil {
                log.Fatal(err)
            }
            fmt.Printf("%s\n", msg)
        }
    }).ServeHTTP(c.Response(), c.Request())
    return nil
}

func main() {
    e := echo.New()
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())
    e.Static("/", "../public")
    e.GET("/ws", hello)
    e.Logger.Fatal(e.Start(":1323"))
}

使用 gorilla 的 WebSocket

服务端

server.go

package main

import (
    "fmt"
    "log"

    "github.com/labstack/echo"

    "github.com/gorilla/websocket"
    "github.com/labstack/echo/middleware"
)

var (
    upgrader = websocket.Upgrader{}
)

func hello(c echo.Context) error {
    ws, err := upgrader.Upgrade(c.Response(), c.Request(), nil)
    if err != nil {
        return err
    }
    defer ws.Close()

    for {
        // Write
        err := ws.WriteMessage(websocket.TextMessage, []byte("Hello, Client!"))
        if err != nil {
            log.Fatal(err)
        }

        // Read
        _, msg, err := ws.ReadMessage()
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("%s\n", msg)
    }
}

func main() {
    e := echo.New()
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())
    e.Static("/", "../public")
    e.GET("/ws", hello)
    e.Logger.Fatal(e.Start(":1323"))
}

客户端

index.html

<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>WebSocket</title>
</head>

<body>
  <p id="output"></p>

  <script>
    var loc = window.location;
    var uri = 'ws:';

    if (loc.protocol === 'https:') {
      uri = 'wss:';
    }
    uri += '//' + loc.host;
    uri += loc.pathname + 'ws';

    ws = new WebSocket(uri)

    ws.onopen = function() {
      console.log('Connected')
    }

    ws.onmessage = function(evt) {
      var out = document.getElementById('output');
      out.innerHTML += evt.data + '<br>';
    }

    setInterval(function() {
      ws.send('Hello, Server!');
    }, 1000);
  </script>
</body>

</html>

输出示例

Client

Hello, Client!
Hello, Client!
Hello, Client!
Hello, Client!
Hello, Client!

Server

Hello, Server!
Hello, Server!
Hello, Server!
Hello, Server!
Hello, Server!