websocket 简单连接

64 阅读1分钟

golang

package main

import (
   "fmt"
   "golang.org/x/net/websocket"
   "log"
   "net/http"
)

func Echo(ws *websocket.Conn) {
   var err error

   for {
      var reply string

      if err = websocket.Message.Receive(ws, &reply); err != nil {
         fmt.Println("Can't receive")
         break
      }
      fmt.Println("Received back from client: " + reply)

      msg := "Received: " + reply
      fmt.Println("Sending to client: " + msg)

      if err = websocket.Message.Send(ws, msg); err != nil {
         fmt.Println("Can't send")
         break
      }
   }
}

func main() {
   http.Handle("/", websocket.Handler(Echo))
   if err := http.ListenAndServe(":1234", nil); err != nil {
      log.Fatal("ListenAndServe:", err)
   }
}

js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>websocket</title>
</head>
<body>
    <h1>WebSocket Echo Test</h1>
    <form>
        <p>
            Message: <input id="message" type="text" value="Hello, world!">
        </p>
    </form>
    <button onclick="send()">Send Message</button>
<script>
    let websocket = null
    let wsurl = "ws://127.0.0.1:1234"

    window.onload = function() {
        websocket = new WebSocket(wsurl)

        websocket.onopen = function() {
            console.log("connected to " + wsurl)
        }

        websocket.onclose = function(e) {
            console.log("connection closed (" + e.code + ")")
        }

        websocket.onmessage = function(e) {
            console.log("message received: " + e.data)
        }
    }

    function send() {
        let msg = document.getElementById("message").value
        websocket.send(msg)
    }
</script>
</body>
</html>

因为 Web Socket使用了自定义协议,所以 URL方案(scheme)稍有变化:不能再使用 http://或 https://,而要使用 ws://和 wss://。前者是不安全的连接,后者是安全连接。

注意,必须给 WebSocket 构造函数传入一个绝对 URL。同源策略不适用于 Web Socket,因此可以打开到任意站点的连接。至于是否与来自特定源的页面通信,则完全取决于服务器。

注意,golang.org/x/net/websocket 访问方法,可看我上篇博客 如何访问golang.org/x/net/websocket

学习来源《Go Web 编程》、《JavaScript高级程序设计(第4版 中文高清)》书籍