##下载websocket包
$ go get golang.org/x/net/websocket
如果下载失败,可能是被墙了。
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.)
可以尝试
$ go get -u github.com/golang/net/websocket
下载后记得将路径改成golang.org/x/net/websocket
1$ cd $GOPATH 2$ mkdir -p golang.org/x/net 3$ cp github.com/golang/net/websocket/ golang.org/x/net/ -R
实例
###服务端代码 server.go
1package main 2 3import ( 4 5 "fmt" 6 7 "golang.org/x/net/websocket" 8 9 "html/template" //支持模板html 10 11 "log" 12 13 "net/http" 14 15) 16 17func Echo(ws *websocket.Conn) { 18 19 var err error 20 21 for { 22 23 var reply string 24 25 //websocket接受信息 26 27 if err = websocket.Message.Receive(ws, &reply); err != nil { 28 29 fmt.Println("receive failed:", err) 30 31 break 32 33 } 34 35 fmt.Println("reveived from client: " + reply) 36 37 msg := "received:" + reply 38 39 fmt.Println("send to client:" + msg) 40 41 //这里是发送消息 42 43 if err = websocket.Message.Send(ws, msg); err != nil { 44 45 fmt.Println("send failed:", err) 46 47 break 48 49 } 50 51 } 52 53} 54 55func web(w http.ResponseWriter, r *http.Request) { 56 57 //打印请求的方法 58 59 fmt.Println("method", r.Method) 60 61 if r.Method == "GET" { //如果请求方法为get显示login.html,并相应给前端 62 63 t, _ := template.ParseFiles("websocket.html") 64 65 t.Execute(w, nil) 66 67 } else { 68 69 //否则走打印输出post接受的参数username和password 70 71 fmt.Println(r.PostFormValue("username")) 72 73 fmt.Println(r.PostFormValue("password")) 74 75 } 76 77} 78 79func main() { 80 81 //接受websocket的路由地址 82 83 http.Handle("/websocket", websocket.Handler(Echo)) 84 85 //html页面 86 87 http.HandleFunc("/web", web) 88 89 if err := http.ListenAndServe(":1234", nil); err != nil { 90 91 log.Fatal("ListenAndServe:", err) 92 93 } 94 95}
###客户端代码 websocket.html
1<!DOCTYPE html> 2 3 <html> 4 5<head> 6 7 <meta charset="utf-8"/> 8 9 <title>go测试socket</title> 10 11</head> 12 13<body> 14 15 <script type="text/javascript"> 16 17 var sock = null; 18 19 var wsuri = "ws://127.0.0.1:1234/websocket"; 20 21 window.onload = function() { 22 23 console.log("onload"); 24 25 sock = new WebSocket(wsuri); 26 27 sock.onopen = function() { 28 29 console.log("connected to " + wsuri); 30 31 } 32 33 sock.onclose = function(e) { 34 35 console.log("connection closed (" + e.code + ")"); 36 37 } 38 39 sock.onmessage = function(e) { 40 41 console.log("message received: " + e.data); 42 43 } 44 45 }; 46 47 function send() { 48 49 var msg = document.getElementById('message').value; 50 51 sock.send(msg); 52 53 }; 54 55 </script> 56 57 <h1>WebSocket Echo Test</h1> 58 59 <form> 60 61 <p> 62 63 Message: <input id="message" type="text" value="Hello, world!"> 64 65 </p> 66 67 </form> 68 69 <button onclick="send();">Send Message</button> 70 71</body> 72 73</html>
##测试
启动服务端
$ ./server
启动浏览器 输入http://127.0.0.1:1234/web

网络通信内容如图所示,首先加载页面,接着使用HTTP建立websocket连接,后续通信直接使用websocket进行。
点击 页面中SendMessage按钮
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