Rumah > pembangunan bahagian belakang > Golang > Pembangunan Golang: menggunakan Websocket untuk melaksanakan aplikasi sembang masa nyata

Pembangunan Golang: menggunakan Websocket untuk melaksanakan aplikasi sembang masa nyata

WBOY
Lepaskan: 2023-09-20 13:15:28
asal
802 orang telah melayarinya

Pembangunan Golang: menggunakan Websocket untuk melaksanakan aplikasi sembang masa nyata

Pembangunan Golang: Aplikasi sembang masa nyata menggunakan Websocket

Dalam era Internet hari ini, komunikasi masa nyata telah menjadi bahagian yang sangat diperlukan dalam kehidupan orang ramai. Sama ada pemesejan segera, sembang masa nyata atau kemas kini masa nyata, kaedah komunikasi yang cekap dan stabil diperlukan untuk mencapainya. Websocket ialah protokol yang sangat sesuai untuk komunikasi masa nyata.

Golang ialah bahasa pengaturcaraan yang ringkas dan cekap dengan prestasi serentak yang sangat baik dan sangat sesuai untuk membangunkan aplikasi komunikasi masa nyata. Artikel ini akan memperkenalkan cara menggunakan perpustakaan Websocket Golang untuk melaksanakan aplikasi sembang masa nyata dan memberikan contoh kod yang sepadan.

Pertama, kita perlu mencipta projek Golang dan memperkenalkan perpustakaan Websocket Golang.

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)
Salin selepas log masuk

Seterusnya, kita perlu menentukan beberapa pembolehubah dan struktur global.

var clients = make(map[*websocket.Conn]bool) // 客户端集合
var broadcast = make(chan Message)           // 广播消息通道

// 消息结构体
type Message struct {
    Username string `json:"username"`
    Message  string `json:"message"`
}
Salin selepas log masuk

Kemudian, kita perlu melaksanakan fungsi yang mengendalikan sambungan Websocket.

func handleWebSocket(w http.ResponseWriter, r *http.Request) {
    // 升级HTTP连接为Websocket连接
    upgrader := websocket.Upgrader{}
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }

    // 将连接添加到客户端集合中
    clients[conn] = true

    // 关闭连接时,从客户端集合中移除
    defer func() {
        delete(clients, conn)
        conn.Close()
    }()

    // 循环接收和发送消息
    for {
        var message Message
        err := conn.ReadJSON(&message)
        if err != nil {
            log.Printf("error: %v", err)
            delete(clients, conn)
            break
        }
        broadcast <- message
    }
}
Salin selepas log masuk

Seterusnya, kita perlu melaksanakan fungsi yang menyiarkan mesej kepada semua pelanggan.

func broadcastMessages() {
    for {
        // 从广播通道中接收消息
        message := <-broadcast

        // 将消息发送给所有客户端
        for client := range clients {
            err := client.WriteJSON(message)
            if err != nil {
                log.Printf("error: %v", err)
                client.Close()
                delete(clients, client)
            }
        }
    }
}
Salin selepas log masuk

Akhir sekali, kita perlu memulakan pelayan Websocket dalam fungsi utama.

func main() {
    // 设置静态文件目录
    fs := http.FileServer(http.Dir("public"))
    http.Handle("/", fs)

    // 设置Websocket路由
    http.HandleFunc("/ws", handleWebSocket)

    // 启动Websocket服务器
    go broadcastMessages()

    // 开始监听端口
    log.Println("Server started on :8080")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal(err)
    }
}
Salin selepas log masuk

Seterusnya, kita boleh membuat halaman HTML untuk melaksanakan antara muka pengguna.

<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>实时聊天应用</title>
</head>

<body>
  <h1>实时聊天应用</h1>
  
  <div id="message-container"></div>
  
  <form>
    <input type="text" id="username" placeholder="请输入用户名">
    <input type="text" id="message" placeholder="请输入消息">
    <button type="button" onclick="sendMessage()">发送</button>
  </form>

  <script>
    // 创建Websocket连接
    var socket = new WebSocket("ws://localhost:8080/ws");
    
    // 监听连接事件
    socket.onopen = function() {
      console.log("连接成功");
    };
    
    // 监听消息事件
    socket.onmessage = function(event) {
      var message = JSON.parse(event.data);
      var username = message.username;
      var content = message.message;
      var container = document.getElementById("message-container");
      container.innerHTML += "<p><b>" + username + ":</b>" + content + "</p>";
    };
    
    // 监听错误事件
    socket.onerror = function(error) {
      console.log("出现错误:" + error);
    }
    
    // 监听关闭事件
    socket.onclose = function(event) {
      console.log("连接关闭");
    }
    
    // 发送消息
    function sendMessage() {
      var username = document.getElementById("username").value;
      var message = document.getElementById("message").value;
      if (username && message) {
        var data = {
          username: username,
          message: message
        };
        socket.send(JSON.stringify(data));
        document.getElementById("message").value = "";
      }
    }
  </script>
</body>

</html>
Salin selepas log masuk

Pada ketika ini, kami telah melengkapkan contoh penggunaan perpustakaan Websocket Golang untuk melaksanakan aplikasi sembang masa nyata. Melalui contoh ini, kami dapat memahami dengan mendalam prinsip kerja Websocket dan mempelajari cara menggunakan Golang untuk membangunkan aplikasi komunikasi masa nyata.

Sudah tentu, terdapat banyak butiran dan pertimbangan keselamatan dalam projek sebenar, seperti mengesahkan mesej, menggunakan penyulitan SSL, dsb. Tetapi dengan contoh ini, anda sudah mempunyai titik permulaan yang baik untuk membina aplikasi sembang langsung anda sendiri. Selamat mengekod!

Atas ialah kandungan terperinci Pembangunan Golang: menggunakan Websocket untuk melaksanakan aplikasi sembang masa nyata. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan