+++ title = “WebSocket Recipe” description = “WebSocket recipe / example for Echo” url=”/cookbook/websocket” [menu.side] name = “WebSocket” parent = “cookbook” weight = 10 +++
WebSocket
使用 net 库的 WebSocket
服务端
server.go
package mainimport ("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 {// Writeerr := websocket.Message.Send(ws, "Hello, Client!")if err != nil {log.Fatal(err)}// Readmsg := ""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 mainimport ("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 {// Writeerr := 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!
