15.11 与 websocket 通信

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

import "websocket" 这行要改成:

  1. 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

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "websocket"
  6. )
  7. func server(ws *websocket.Conn) {
  8. fmt.Printf("new connection\n")
  9. buf := make([]byte, 100)
  10. for {
  11. if _, err := ws.Read(buf); err != nil {
  12. fmt.Printf("%s", err.Error())
  13. break
  14. }
  15. }
  16. fmt.Printf(" => closing connection\n")
  17. ws.Close()
  18. }
  19. func main() {
  20. http.Handle("/websocket", websocket.Handler(server))
  21. err := http.ListenAndServe(":12345", nil)
  22. if err != nil {
  23. panic("ListenAndServe: " + err.Error())
  24. }
  25. }

示例 15.25 websocket_client.go

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "websocket"
  6. )
  7. func main() {
  8. ws, err := websocket.Dial("ws://localhost:12345/websocket", "",
  9. "http://localhost/")
  10. if err != nil {
  11. panic("Dial: " + err.Error())
  12. }
  13. go readFromServer(ws)
  14. time.Sleep(5e9)
  15. ws.Close()
  16. }
  17. func readFromServer(ws *websocket.Conn) {
  18. buf := make([]byte, 1000)
  19. for {
  20. if _, err := ws.Read(buf); err != nil {
  21. fmt.Printf("%s\n", err.Error())
  22. break
  23. }
  24. }
  25. }

链接