以下是一个简单的 Golang WebSocket 示例,实现了服务端等待客户端连接,并在客户端连接后接收和发送消息的功能。

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

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

func main() {
    http.HandleFunc("/ws", wsHandler)
    log.Println("Starting server on :8080")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println("Upgrade:", err)
        return
    }
    defer conn.Close()

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Println("ReadMessage:", err)
            return
        }
        log.Printf("Received message: %s\n", message)

        reply := fmt.Sprintf("Received: %s", message)
        err = conn.WriteMessage(websocket.TextMessage, []byte(reply))
        if err != nil {
            log.Println("WriteMessage:", err)
            return
        }
    }
}

客户端代码如下:

package main

import (
    "fmt"
    "log"
    "net/url"
    "os"
    "os/signal"
    "syscall"

    "github.com/gorilla/websocket"
)

func main() {
    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM)

    u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
    log.Printf("Connecting to %s", u.String())

    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()

    done := make(chan struct{})

    go func() {
        defer close(done)
        for {
            _, message, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                return
            }
            log.Printf("Received message: %s\n", message)
        }
    }()

    for {
        select {
        case <-done:
            return
        case <-interrupt:
            log.Println("interrupt")
            err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
            if err != nil {
                log.Println("write close:", err)
                return
            }
            select {
            case <-done:
            case <-interrupt:
                log.Println("interrupt")
                return
            }
        }
    }
}

在服务端启动后,客户端连接到服务端并发送消息,服务端接收到消息并回复。如果客户端在服务端启动前启动,服务端会一直等待客户端连接并接收消息,直到客户端连接并发送消息后才会回复。

Golang WebSocket 示例:服务端等待客户端连接并接收消息

原文地址: https://www.cveoy.top/t/topic/k43H 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录