websocket初体验

114 阅读3分钟

WebSocket 为开发者提供了一种在单个连接上进行全双工通信的方式。本文将简要探讨 WebSocket 的主要内容,包括其定义、工作原理、应用场景以及如何实现。

1. WebSocket 简介

WebSocket 是一个网络通信协议,提供了浏览器与服务器之间的全双工通信能力。与传统的 HTTP 协议相比,WebSocket 允许服务器主动向客户端发送消息,而不需要客户端不断地发起请求,避免长轮询。

1.1 特点

  • 全双工通信:数据可以在客户端和服务器之间双向流动,无需等待请求-响应周期。
  • 持久连接:一旦建立,连接可以保持开放状态,直到客户端或服务器决定关闭它。
  • 低延迟:WebSocket 旨在减少通信延迟,适用于需要快速响应的应用。

1.2 与 HTTP 的比较

  • HTTP:请求-响应模式,每次通信都需要建立新的连接。
  • WebSocket:建立一次连接后,可以进行多次双向通信。

2. WebSocket 的工作原理

2.1 握手过程

WebSocket 通信始于一个 HTTP 请求,客户端通过发送一个特殊的 GET 请求来请求建立 WebSocket 连接。服务器在收到请求后,如果支持 WebSocket,会响应一个升级(Upgrade)请求,从而切换到 WebSocket 协议。

2.2 数据传输

一旦握手成功,客户端和服务器之间的通信就不再依赖 HTTP 协议。数据可以通过 WebSocket 连接直接发送和接收,这些数据可以是文本或二进制格式。

2.3 连接关闭

WebSocket 连接可以通过客户端或服务器端的请求来关闭。关闭过程遵循特定的帧格式,确保连接的优雅关闭。

3. 应用场景

WebSocket 因其实时性和低延迟特性,被广泛应用于以下场景:

  • 在线游戏:实时更新游戏状态,提供流畅的游戏体验。
  • 实时聊天应用:如即时消息服务,允许用户实时交流。
  • 股票交易平台:实时更新股票价格和市场动态。
  • 协作工具:如在线文档编辑,允许多人同时编辑文档。

4. 实现 WebSocket

4.1 客户端实现

在浏览器中,可以通过 WebSocket API 轻松实现 WebSocket 连接。以下是一个简单的示例:

javascript
var socket = new WebSocket('ws://example.com/socket');
socket.onopen = function(event) {
    console.log('Connection established!');
};
socket.onmessage = function(event) {
    console.log('Received:', event.data);
};
socket.onclose = function(event) {
    console.log('Connection closed');
};

4.2 服务器端实现

服务器端的实现依赖于所使用的编程语言和框架。

  • 首先基于gin框架创建http server
r := gin.Default()

r.GET("/conn", func(c *gin.Context) {
        api.HandleWs(c.Writer, c.Request)
})
r.Run(":8080")
  • 实现websocket
var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    // CheckOrigin: func(r *http.Request) bool {
    //        return true
    // },
}

func HandleWs(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
            log.Println(err)
            return
    }
    for {
            messageType, p, err := conn.ReadMessage()
            if err != nil {
                    log.Println(err)
                    return
            }

            if err := conn.WriteMessage(messageType, append([]byte("reply: "), p...)); err != nil {
                    log.Println(err)
                    return
            }
    }
}

5. 安全性考虑

由于 WebSocket 连接是持久的,因此安全性尤为重要。使用 wss://(WebSocket Secure)协议可以确保数据传输的加密,类似于 HTTPS。

6. 结论

WebSocket 协议为实时通信提供了一个强大而灵活的方式,开发者可以构建更加动态和响应迅速的网络应用。