备注: 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.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
}
}
}