15.11 与 websocket 通信

备注:Go 团队决定从 Go 1 起,将 websocket 包移出 Go 标准库,转移到 code.google.com/p/go 下的子项目 websocket,同时预计近期将做重大更改。

import "websocket" 这行要改成:

import websocket "code.google.com/p/go/websocket"

与 http 协议相反,websocket 是通过客户端与服务器之间的对话,建立的基于单个持久连接的协议。然而在其他方面,其功能几乎与 http 相同。在示例 15.24 中,我们有一个典型的 websocket 服务器,他会自启动并监听 websocket 客户端的连入。示例 15.25 演示了 5 秒后会终止的客户端代码。当连接到来时,服务器先打印 new connection,当客户端停止时,服务器打印 EOF => closing connection

示例 15.24 websocket_server.go

package main

import (
    "fmt"
    "net/http"
    "websocket"
)

func server(ws *websocket.Conn) {
    fmt.Printf("new connection\n")
    buf := make([]byte, 100)
    for {
        if _, err := ws.Read(buf); err != nil {
            fmt.Printf("%s", err.Error())
            break
        }
    }
    fmt.Printf(" => closing connection\n")
    ws.Close()
}

func main() {
    http.Handle("/websocket", websocket.Handler(server))
    err := http.ListenAndServe(":12345", nil)
    if err != nil {
        panic("ListenAndServe: " + err.Error())
    }
}

示例 15.25 websocket_client.go

package main

import (
    "fmt"
    "time"
    "websocket"
)

func main() {
    ws, err := websocket.Dial("ws://localhost:12345/websocket", "",
        "http://localhost/")
    if err != nil {
        panic("Dial: " + err.Error())
    }
    go readFromServer(ws)
    time.Sleep(5e9)
    ws.Close()
}

func readFromServer(ws *websocket.Conn) {
    buf := make([]byte, 1000)
    for {
        if _, err := ws.Read(buf); err != nil {
            fmt.Printf("%s\n", err.Error())
            break
        }
    }
}

链接

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「IT平头哥联盟」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""