网络编程
位置:首页>> 网络编程>> Go语言>> Golang websocket协议使用浅析

Golang websocket协议使用浅析

作者:Sahm5k  发布时间:2024-02-07 14:19:28 

标签:Go,GoLang,websocket,协议

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))
}
}

来源:https://blog.csdn.net/weixin_44866921/article/details/130736131

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com