Golang websocket协议使用浅析
作者:Sahm5k
WebSocket与HTTP协议的主要区别
HTTP 和 WebSocket 协议的区别 HTTP 是单向的,而 WebSocket 是双向的。
在客户端和服务器之间的通信中,每个来自客户端的 HTTP 请求都会建立一个新的连接,并在从服务器收到响应后关闭,而WebSocket连接只建立一次,并在服务器或客户端终止连接之前重复使用。
HTTP 的空闲连接的超时时间为 60 秒。可用于响应时间非常短的调用。
WebSocket 空闲连接的超时时间为 3600 秒(1 小时),可应用于响应时间长于 60 秒的调用,最大连接数为 250。
WebSocket服务器
首先,创建一个 HTTP 服务器。在这个服务器中,创建一个用于处理 WebSocket 连接的函数 handleWebSocket。
其实就是开启一个http服务器。
func HandleWebSocket(w http.ResponseWriter, r *http.Request) { } func main() { http.HandleFunc("/ws", HandleWebSocket) http.ListenAndServe(":8080", nil) }
然后在该函数中,使用 gorilla/websocket 包来处理 WebSocket 连接。
1.建立upgrade变量。
websocket协议建立连接的握手过程就是http协议的头部加入了upgrade字段(upgrade:websocket)。
首先要导入"github.com/gorilla/websocket"包
var upgrade = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { return true }, }
2.升级http连接成websocket连接,处理websocket连接
将http连接头部加入upgrade字段,成为websocket协议。
func HandleHome(w http.ResponseWriter, r *http.Request) { //升级成websocket conn, err := upgrade.Upgrade(w, r, nil) if err != nil { log.Println(err) } //websocket读写逻辑 for { messageType, p, err := conn.ReadMessage() if err != nil { log.Println(err) return } log.Println("receive:", string(p)) conn.WriteMessage(messageType, []byte("hello, i am server")) } }
WebSocket客户端
客户端主要是用来测试websocket服务器是否正确工作的,下面提供两种websocket服务器。
html+js实现
<!DOCTYPE html> <html> <head> <title>WebSocket Test</title> </head> <body> <script> var ws = new WebSocket("ws://localhost:8080/ws"); ws.onopen = function() { console.log("WebSocket connection opened."); ws.send("Hi From the Client!") }; ws.onmessage = function(event) { console.log("Received message: " + event.data); }; ws.onclose = function() { console.log("WebSocket connection closed."); }; ws.onerror = function(event) { console.log("WebSocket error: " + event.data); }; </script> </body> </html>
利用golang websocket包实现
func WebSocketClient() { conn, _, err := websocket.DefaultDialer.Dial("ws://127.0.0.1:8080/ws", nil) if err != nil { panic(err) } defer conn.Close() for { time.Sleep(time.Second) conn.WriteMessage(websocket.TextMessage, []byte("hi i am client")) _, p, err := conn.ReadMessage() if err != nil { log.Println(err) } println("client recv:", string(p)) } }
到此这篇关于Golang websocket协议使用浅析的文章就介绍到这了,更多相关Go websocket内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!