├── README └── websocket_echo_sample.go /README: -------------------------------------------------------------------------------- 1 | Sample program of golang websocket package 2 | 3 | $ go get code.google.com/p/go.net/websocket 4 | $ go run websocket_echo_sample.go 5 | 6 | Chrome 15.0.874.0: supports binary messaging 7 | Chrome 14.0.835.2: supports HyBi10 8 | Chrome 12.0.742.91: supports HyBi00 9 | -------------------------------------------------------------------------------- /websocket_echo_sample.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "fmt" 6 | "io" 7 | "net/http" 8 | "code.google.com/p/go.net/websocket" 9 | ) 10 | 11 | var port *int = flag.Int("p", 23456, "Port to listen.") 12 | 13 | // copyServer echoes back messages sent from client using io.Copy. 14 | func copyServer(ws *websocket.Conn) { 15 | fmt.Printf("copyServer %#v\n", ws.Config()) 16 | io.Copy(ws, ws) 17 | fmt.Println("copyServer finished") 18 | } 19 | 20 | // readWriteServer echoes back messages sent from client using Read and Write. 21 | func readWriteServer(ws *websocket.Conn) { 22 | fmt.Printf("readWriteServer %#v\n", ws.Config()) 23 | for { 24 | buf := make([]byte, 100) 25 | // Read at most 100 bytes. If client sends a message more than 26 | // 100 bytes, first Read just reads first 100 bytes. 27 | // Next Read will read next at most 100 bytes. 28 | n, err := ws.Read(buf) 29 | if err != nil { 30 | fmt.Println(err) 31 | break 32 | } 33 | fmt.Printf("recv:%q\n", buf[:n]) 34 | // Write send a message to the client. 35 | n, err = ws.Write(buf[:n]) 36 | if err != nil { 37 | fmt.Println(err) 38 | break 39 | } 40 | fmt.Printf("send:%q\n", buf[:n]) 41 | } 42 | fmt.Println("readWriteServer finished") 43 | } 44 | 45 | // sendRecvServer echoes back text messages sent from client 46 | // using websocket.Message. 47 | func sendRecvServer(ws *websocket.Conn) { 48 | fmt.Printf("sendRecvServer %#v\n", ws) 49 | for { 50 | var buf string 51 | // Receive receives a text message from client, since buf is string. 52 | err := websocket.Message.Receive(ws, &buf) 53 | if err != nil { 54 | fmt.Println(err) 55 | break 56 | } 57 | fmt.Printf("recv:%q\n", buf) 58 | // Send sends a text message to client, since buf is string. 59 | err = websocket.Message.Send(ws, buf) 60 | if err != nil { 61 | fmt.Println(err) 62 | break 63 | } 64 | fmt.Printf("send:%q\n", buf) 65 | } 66 | fmt.Println("sendRecvServer finished") 67 | } 68 | 69 | // sendRecvBinaryServer echoes back binary messages sent from clent 70 | // using websocket.Message. 71 | // Note that chrome supports binary messaging in 15.0.874.* or later. 72 | func sendRecvBinaryServer(ws *websocket.Conn) { 73 | fmt.Printf("sendRecvBinaryServer %#v\n", ws) 74 | for { 75 | var buf []byte 76 | // Receive receives a binary message from client, since buf is []byte. 77 | err := websocket.Message.Receive(ws, &buf) 78 | if err != nil { 79 | fmt.Println(err) 80 | } 81 | fmt.Printf("recv:%#v\n", buf) 82 | // Send sends a binary message to client, since buf is []byte. 83 | err = websocket.Message.Send(ws, buf) 84 | if err != nil { 85 | fmt.Println(err) 86 | break 87 | } 88 | fmt.Printf("send:%#v\n", buf) 89 | } 90 | fmt.Println("sendRecvBinaryServer finished") 91 | } 92 | 93 | type T struct { 94 | Msg string 95 | Path string 96 | } 97 | 98 | // jsonServer echoes back json string sent from client using websocket.JSON. 99 | func jsonServer(ws *websocket.Conn) { 100 | fmt.Printf("jsonServer %#v\n", ws.Config()) 101 | for { 102 | var msg T 103 | // Receive receives a text message serialized T as JSON. 104 | err := websocket.JSON.Receive(ws, &msg) 105 | if err != nil { 106 | fmt.Println(err) 107 | break 108 | } 109 | fmt.Printf("recv:%#v\n", msg) 110 | // Send send a text message serialized T as JSON. 111 | err = websocket.JSON.Send(ws, msg) 112 | if err != nil { 113 | fmt.Println(err) 114 | break 115 | } 116 | fmt.Printf("send:%#v\n", msg) 117 | } 118 | } 119 | 120 | func MainServer(w http.ResponseWriter, req *http.Request) { 121 | io.WriteString(w, ` 122 |
123 | 194 | 195 | 208 | 209 | 210 | `) 211 | } 212 | 213 | func main() { 214 | flag.Parse() 215 | http.Handle("/copy", websocket.Handler(copyServer)) 216 | http.Handle("/readWrite", websocket.Handler(readWriteServer)) 217 | http.Handle("/sendRecvText", websocket.Handler(sendRecvServer)) 218 | http.Handle("/sendRecvArrayBuffer", websocket.Handler(sendRecvBinaryServer)) 219 | http.Handle("/sendRecvBlob", websocket.Handler(sendRecvBinaryServer)) 220 | http.Handle("/json", websocket.Handler(jsonServer)) 221 | http.HandleFunc("/", MainServer) 222 | fmt.Printf("http://localhost:%d/\n", *port) 223 | err := http.ListenAndServe(fmt.Sprintf(":%d", *port), nil) 224 | if err != nil { 225 | panic("ListenANdServe: " + err.Error()) 226 | } 227 | } 228 | --------------------------------------------------------------------------------