Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan WebSocket dalam golang untuk visualisasi data masa nyata

Cara menggunakan WebSocket dalam golang untuk visualisasi data masa nyata

PHPz
PHPzasal
2023-12-17 18:29:001090semak imbas

Cara menggunakan WebSocket dalam golang untuk visualisasi data masa nyata

Cara menggunakan WebSocket untuk mencapai visualisasi data masa nyata dalam golang

Pengenalan:
Kini, visualisasi data masa nyata memainkan peranan penting dalam banyak bidang, dan WebSocket ialah kaedah yang digunakan untuk berkomunikasi antara pelayar web dan pelayan Protokol untuk komunikasi dua hala masa nyata. Artikel ini akan memperkenalkan cara menggunakan perpustakaan WebSocket dalam golang untuk mencapai visualisasi data masa nyata dan menyediakan contoh kod khusus.

1. Pasang perpustakaan golang dan WebSocket
Pertama, kita perlu memasang golang dan perpustakaan WebSocket yang sepadan dalam persekitaran setempat. Pergi ke tapak web rasmi golang untuk memuat turun dan memasang golang, kemudian gunakan arahan berikut untuk memasang perpustakaan WebSocket dalam bahasa go:
pergi dapatkan github.com/gorilla/websocket

Kedua, buat pelayan WebSocket
Kami mula-mula membuat pelayan WebSocket mudah untuk memproses sambungan dan pemesejan Pelanggan. Berikut ialah contoh kod mudah:

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan []byte)
var upgrader = websocket.Upgrader{} // 使用默认的Upgrader

func main() {
    fs := http.FileServer(http.Dir("static"))
    http.Handle("/", fs)

    http.HandleFunc("/ws", handleConnections)

    go handleMessages()

    log.Println("Server started on :8000")
    err := http.ListenAndServe(":8000", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func handleConnections(w http.ResponseWriter, r *http.Request) {
    // 建立WebSocket连接
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }
    // 关闭连接
    defer conn.Close()

    clients[conn] = true

    for {
        // 读取来自客户端的消息
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Printf("Error: %v", err)
            delete(clients, conn)
            break
        }
        // 将消息放入广播通道中
        broadcast <- message
    }
}

func handleMessages() {
    for {
        // 从广播通道中读取消息
        message := <-broadcast

        // 将消息发送给所有连接的客户端
        for client := range clients {
            err := client.WriteMessage(websocket.TextMessage, message)
            if err != nil {
                log.Printf("Error: %v", err)
                client.Close()
                delete(clients, client)
            }
        }
    }
}

3. Buat klien WebSocket
Seterusnya, kami mencipta klien WebSocket mudah untuk menghantar mesej kepada dan menerima mesej daripada pelayan. Berikut ialah contoh kod mudah:

// 在HTML文件中通过JavaScript创建WebSocket连接
const socket = new WebSocket('ws://localhost:8000/ws');

// 监听连接成功事件
socket.onopen = function (event) {
    console.log('Connected to WebSocket server');
};

// 监听收到消息事件
socket.onmessage = function (event) {
    const message = event.data;
    console.log('Received message:', message);
    // 在此处可进行实时数据可视化的操作
};

// 向服务器发送消息
function sendMessage(message) {
    socket.send(message);
}

4. Visualisasi data masa nyata
Penghantaran data masa nyata direalisasikan melalui WebSocket Kami boleh melakukan operasi visualisasi data masa nyata selepas pelanggan menerima mesej daripada pelayan. Berikut ialah contoh mudah untuk mencipta carta garis masa nyata daripada data yang diterima melalui perpustakaan D3.js:

// 在HTML文件中通过JavaScript使用D3.js库创建折线图
const margin = { top: 20, right: 20, bottom: 30, left: 50 },
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom;

const svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

const x = d3.scaleLinear()
    .range([0, width]);

const y = d3.scaleLinear()
    .range([height, 0]);

const line = d3.line()
    .x(function (d) { return x(d.x); })
    .y(function (d) { return y(d.y); });

// 数据存储数组
let data = [];

socket.onmessage = function (event) {
    const message = JSON.parse(event.data);
    // 在此处进行数据处理
    data.push({ x: message.x, y: message.y });

    // 更新坐标轴范围
    x.domain(d3.extent(data, function (d) { return d.x; }));
    y.domain([0, d3.max(data, function (d) { return d.y; })]);

    // 渲染折线图
    svg.selectAll("*").remove(); // 首先清空原有内容
    svg.append("path")
        .data([data])
        .attr("class", "line")
        .attr("d", line);
}

Kesimpulan:
Dengan kod di atas, kami boleh menggunakan WebSocket dalam golang untuk mencapai visualisasi data masa nyata. Pelanggan menyambung ke pelayan melalui WebSocket, dan pelayan menerima mesej daripada klien dan menghantarnya kepada semua pelanggan yang disambungkan. Selepas pelanggan menerima mesej daripada pelayan, kami boleh melakukan pemprosesan data masa nyata dan operasi visualisasi untuk mencapai paparan dan analisis data masa nyata.

Atas ialah kandungan terperinci Cara menggunakan WebSocket dalam golang untuk visualisasi data masa nyata. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn