$ go get golang.org/x/net/websocket
若是下載失敗,多是被牆了。javascript
package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket" (https fetch: Get https://golang.org/x/net/websocket?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.)html
能夠嘗試前端
$ go get -u github.com/golang/net/websocket
下載後記得將路徑改爲golang.org/x/net/websocketjava
$ cd $GOPATH $ mkdir -p golang.org/x/net $ cp github.com/golang/net/websocket/ golang.org/x/net/ -R
server.gogit
package main import ( "fmt" "golang.org/x/net/websocket" "html/template" //支持模板html "log" "net/http" ) func Echo(ws *websocket.Conn) { var err error for { var reply string //websocket接受信息 if err = websocket.Message.Receive(ws, &reply); err != nil { fmt.Println("receive failed:", err) break } fmt.Println("reveived from client: " + reply) msg := "received:" + reply fmt.Println("send to client:" + msg) //這裏是發送消息 if err = websocket.Message.Send(ws, msg); err != nil { fmt.Println("send failed:", err) break } } } func web(w http.ResponseWriter, r *http.Request) { //打印請求的方法 fmt.Println("method", r.Method) if r.Method == "GET" { //若是請求方法爲get顯示login.html,並相應給前端 t, _ := template.ParseFiles("websocket.html") t.Execute(w, nil) } else { //不然走打印輸出post接受的參數username和password fmt.Println(r.PostFormValue("username")) fmt.Println(r.PostFormValue("password")) } } func main() { //接受websocket的路由地址 http.Handle("/websocket", websocket.Handler(Echo)) //html頁面 http.HandleFunc("/web", web) if err := http.ListenAndServe(":1234", nil); err != nil { log.Fatal("ListenAndServe:", err) } }
websocket.htmlgithub
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>go測試socket</title> </head> <body> <script type="text/javascript"> var sock = null; var wsuri = "ws://127.0.0.1:1234/websocket"; window.onload = function() { console.log("onload"); sock = new WebSocket(wsuri); sock.onopen = function() { console.log("connected to " + wsuri); } sock.onclose = function(e) { console.log("connection closed (" + e.code + ")"); } sock.onmessage = function(e) { console.log("message received: " + e.data); } }; function send() { var msg = document.getElementById('message').value; sock.send(msg); }; </script> <h1>WebSocket Echo Test</h1> <form> <p> Message: <input id="message" type="text" value="Hello, world!"> </p> </form> <button onclick="send();">Send Message</button> </body> </html>
啓動服務端golang
$ ./server
啓動瀏覽器
輸入http://127.0.0.1:1234/webweb
網絡通訊內容如圖所示,首先加載頁面,接着使用HTTP創建websocket鏈接,後續通訊直接使用websocket進行。瀏覽器
點擊 頁面中SendMessage按鈕websocket
server端輸出:
method GET
reveived from client: Hello, world!
send to client:received:Hello, world!
瀏覽器輸出:
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/08.2.md
https://github.com/ukai/go-websocket-sample/blob/master/websocket_echo_sample.go