- 是什么:全双工通信协议。
- 能做什么:服务端可以主动的发送数据给客户端
- golang应用到的包
go get github.com/gorilla/websocket
server.go
package main import ( "fmt" "github.com/gorilla/websocket" "log" "net/http" ) //设置合适读取字节 var upgrader = websocket.Upgrader{ ReadBufferSize: 10240, WriteBufferSize: 10240, CheckOrigin: func(r *http.Request)bool { return true //解决跨域 }, } func init() { log.SetFlags(log.Ltime|log.Lshortfile) } func ServerHttp(w http.ResponseWriter,r *http.Request){ log.Printf("客户端地址: %v", r.RemoteAddr) conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Printf("将连接升级为websocket失败: %v \n", err) } //for循环不断的接收信息 for{ messageType, p, err := conn.ReadMessage() if err != nil { log.Printf("读取客户端发送信息是吧:%v\n", err) return } log.Printf("客户端发送的数据类型: %d, 发送的数据: %v", messageType, string(p)) //客户端发送数据给服务端 if err := conn.WriteMessage(messageType, p); err != nil { log.Printf("发送数据失败: %v", err) return } } } func main(){ fmt.Printf("websocket的简单应用") http.HandleFunc("/ws", ServerHttp) if err := http.ListenAndServe(":8080", nil); err != nil { log.Printf("打开服务有误: %v", err) } }
js调用:
<script> var ws = new WebSocket("ws://localhost:8080/ws"); ws.onopen = function(evt) { //绑定连接事件 console.log("Connection open ..."); ws.send("发送的数据"); }; ws.onmessage = function(evt) {//绑定收到消息事件 console.log( "Received Message: " + evt.data); }; ws.onclose = function(evt) { //绑定关闭或断开连接事件 console.log("Connection closed."); }; </script>