15.11. Websocket 通讯

未匹配的标注

备注: Go 团队决定在 Go 1 版本中将 websocket 包从标准库移到 code.google.com/p/gowebsocket 子库中。预计在不久的将来也会发生巨大的改变。

导入 websocket 包将变成这样:

import websocket “code.google.com/p/go/websocket”

websocket 协议与 http 协议相比,它是基于客户端与服务器端会话的持久链接,除此之外,功能几乎和 http 相同。在示例 15.24 中,是一个典型的 websocket 服务,启动它,然后监听一个来自 websocket 客户端的输入。示例 15.25 是一个客户端代码,它会在 5 秒后终止。当一个客户端与服务器端连接后,服务器端后打印: new connection;当客户端停止的时候,服务器端会打印: EOF => closing connection 。

译者注: 现在这个包已经被放在了 golang.org/x/net/websocket 中,要想使用它需要在命令行执行: go get golang.org/x/net/websocket

代码 15.24—websocket_server.go:

// websocket_server.go
package main

import (
    "fmt"
    "net/http"
    "code.google.com/p/go.net/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:

// websocket_client.go
package main

import (
    "fmt"
    "time"
    "code.google.com/p/go.net/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
        }
    }
}

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/the-way-to-go/1...

译文地址:https://learnku.com/docs/the-way-to-go/1...

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~