备注: Go 团队决定在 Go 1 版本中将 websocket 包从标准库移到 code.google.com/p/go 的 websocket 子库中。预计在不久的将来也会发生巨大的改变。
导入 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.gopackage mainimport ("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.gopackage mainimport ("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}}}
