Go基础学习记录之WebSockets(二)

{app.params.name}}{app.params.name}}{app.params.name}}

Go中的WebSocket

go标准库不支持WebSockets。
然而,websocket包是go.net的一个子包,并且正式维护和支持。
使用go get来安装这个包:

go get golang.org/x/net/websocket

WebSockets同时具有客户端和服务器端。
让我们看一个简单的例子,用户在客户端输入一些信息并通过WebSocket将其发送到服务器,然后服务器将信息推送回客户端。客户端代码如下:

<html>
<head>Test Websocket</head>
<body>
  <script type="text/javascript">
    var sock = null;
    var wsuri = "ws://127.0.0.1:1234";

    window.onload = function() {

      console.log("onload");

      sock = new WebSocket(wsuri);

      sock.onopen = function() {
        console.log("connected to " + wsuri);
      }

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

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

    function send() {
        var msg = document.getElementById('message').value;
        sock.send(msg);
    };
  </script>
  <h1>WebSocket Echo Test</h1>
  <form>
    <p>
      Message: <input id="message" type="text" value="Hello, world!">
    </p>
  </form>
  <button onclick="send();">Send Message</button>
</body>
</html>

如您所见,使用客户端JavaScript函数建立连接非常容易。
在成功完成上述握手过程后触发onopen事件。
它告诉客户端已成功创建连接。
尝试打开连接的客户端通常绑定到四个事件:

1)onopen:连接建立后触发。
2)onmessage:收到消息后触发。
3)onerror:发生错误后触发。
4)onclose:连接关闭后触发。

服务器端代码如下:

package main

import (
    "golang.org/x/net/websocket"
    "fmt"
    "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)
    }
}

当客户端发送用户输入信息时,服务器接收它,并再次使用发送返回响应。

通过上面的例子,我们可以看到WebSockets的客户端和服务器端实现非常方便。
我们可以直接在Go中使用net包。
随着HTML5的快速发展,WebSockets将在现代Web开发中扮演更重要的角色;
我们都应该至少对它们有点熟悉。

版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/99


版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 小绒毛的足迹博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/99