一、了解WebSocket服务及其特点

WebSocket服务概述

WebSocket是一种HTML5的API,提供了一种在单个TCP连接上进行全双工通信的机制。

与HTTP协议不同的是,WebSocket是一个独立的协议。在建立连接后,WebSocket客户端和服务器之间可以非常快速地双向通信。它可以在客户端和服务器之间建立一个套接字,并用于在客户端和服务器之间发送/接收消息。

WebSocket可以在Web应用程序中创建实时通信,并且可以与任何服务器端语言一起使用,如PHP、Java、Node.js等。最常见的用例是实时聊天应用程序、协作式编辑工具、在线游戏等。

WebSocket服务的特点

WebSocket服务提供了许多特点,其中一些是:

  1. 全双工通信:客户端和服务器可以同时发送和接收消息。
  2. 实时性:消息可以立即发送和接收,无需轮询。
  3. 跨域支持:使用WebSocket可以在不同域名之间进行通信,而不需要任何代理。
  4. 节省带宽:WebSocket使用较少的带宽,因为它使用二进制协议而不是文本协议。
  5. 可靠性:WebSocket连接会保持活动状态,直到客户端或服务器关闭它。
二、使用golang实现WebSocket服务

Go语言实现WebSocket服务

package main

import (
    "fmt"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        fmt.Println("websocket upgrade error:", err)
        return
    }

    for { // 不断地读取客户端的消息
        _, message, err := conn.ReadMessage()
        if err != nil {
            fmt.Println("websocket read message error:", err)
            return
        }
        fmt.Printf("收到客户端消息:%s\n", message)

        reply := []byte("收到客户端的消息")
        if err = conn.WriteMessage(websocket.TextMessage, reply); err != nil {
            fmt.Println("websocket write message error:", err)
            return
        }
    }
}

func main() {
    http.HandleFunc("/websocket", wsHandler)

    if err := http.ListenAndServe(":8888", nil); err != nil {
        fmt.Println("start server error:", err)
    }
}

Golang实现WebSocket服务端说明

  1. 导入websocket包,并通过Upgrader创建WebSocket连接。
  2. 在wsHandler函数中,通过Upgrader.Upgrade(w, r, nil)升级HTTP连接为WebSocket连接,建立WebSocket通信。
  3. 通过for循环读取客户端的消息,收到消息后打印,并通过conn.WriteMessage回复消息给客户端。
  4. 最后通过http.HandleFunc注册WebSocket服务端。
三、使用WebSocket客户端测试

WebSocket客户端测试


WebSocket测试页面



WebSocket客户端测试页面

WebSocket客户端测试说明

  1. 在JavaScript中实例化WebSocket对象,并通过ws.onopen()、ws.onmessage()、ws.onclose()、ws.onerror()函数处理WebSocket客户端的状态。
  2. 通过ws.send()函数发送消息给WebSocket服务端,通过evt.data获取从WebSocket服务端返回的消息。