Rumah >pembangunan bahagian belakang >Golang >Pelaksanaan pelayan websocket menggunakan perpustakaan x/net trowing 403

Pelaksanaan pelayan websocket menggunakan perpustakaan x/net trowing 403

WBOY
WBOYke hadapan
2024-02-13 17:03:08983semak imbas

使用 x/net 库 trowing 403 的 Websocket 服务器实现

PHP Editor Banana akan memperkenalkan anda kepada kaedah menggunakan perpustakaan x/net untuk melaksanakan pelayan Websocket yang menimbulkan ralat 403. Websocket ialah protokol komunikasi yang mewujudkan sambungan berterusan antara pelanggan dan pelayan, dan ralat 403 bermakna pelayan menolak permintaan pelanggan. Dengan menggunakan perpustakaan x/net, kami boleh membuat pelayan Websocket dengan mudah dan menolak permintaan dengan membuang ralat 403 apabila diperlukan. Kaedah ini mudah dan berkesan serta sesuai untuk senario di mana permintaan perlu dibenarkan atau akses terhad.

Kandungan soalan

Saya cuba melaksanakan pelayan soket web menggunakan x/net/websocket perpustakaan standard.

Percubaan saya setakat ini adalah seperti berikut:

package main

import (
    "fmt"
    "net/http"

    "golang.org/x/net/websocket"
)

type Server struct {
    baseUri     string
    connections map[string][]*websocket.Conn
}

func initServer(baseUri string) *Server {
    return &Server{
        baseUri: baseUri,
    }
}

func (server *Server) handleConnections() {
    http.Handle("/ws", websocket.Handler(server.listenConnections))
    http.ListenAndServe(":3000", nil)
}

func (server *Server) listenConnections(ws *websocket.Conn) {
    fmt.Println("New connection established")
    for {
        fmt.Println("FOO")
    }
}

func main() {
    server := initServer("/ws")
    server.handleConnections()
}

Cuba gunakan berbilang pelanggan ws untuk menyambung ke ws://localhost:3000/ws 时,我总是收到相同的错误:403-Forbidden. Saya juga mencuba contoh dari dokumentasi rasmi tetapi masih mendapatnya. Adakah saya kehilangan sesuatu yang jelas? Seperti penyekatan pelabuhan lalai atau sesuatu seperti itu?

Terima kasih terlebih dahulu.

EDIT: Anda mungkin perlu menggunakan port lain untuk menghasilkan semula isu tersebut. Menggunakan 3000 dalam contoh saya hanya akan mengganggu pelaksanaan program jika ia tidak tersedia.

Edit 2: Anda boleh menggunakan klien seperti websocat dan laksanakan websocat 'ws://localhost:3000/ws' untuk cuba menyambung ke pelayan

Penyelesaian

Saya menyerah, tetapi mempunyai pandangan yang baik: Jika anda seperti saya dan anda mengikuti Walkthrough Anthony GG untuk Mencipta Pelayan Websocket on Go from Scratch , jangan. Video sudah lapuk, dan walaupun ia memberikan intuisi yang baik tentang cara mencipta video, adalah lebih baik (dan tidak malu) untuk belajar menggunakan perpustakaan soket web gorila.

package main

import (
    "fmt"
    "net/http"
    "time"

    "github.com/gorilla/mux"
    "github.com/gorilla/websocket"
)

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

type Server struct {
    baseUri     string
    connections map[string][]*websocket.Conn
    router      *mux.Router
    setup       *http.Server
}

func initServer(baseUri string) *Server {
    router := mux.NewRouter()
    return &Server{
        baseUri: baseUri,
        router:  router,
        setup: &http.Server{
            Handler:      router,
            Addr:         "127.0.0.1:8000",
            WriteTimeout: 15 * time.Second,
            ReadTimeout:  15 * time.Second,
        },
    }
}

func (server *Server) handleConnections() {
    server.router.HandleFunc("/ws/{var}", server.listenConnections)
    server.setup.ListenAndServe()
}

func (server *Server) listenConnections(w http.ResponseWriter, r *http.Request) {
    connection, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        fmt.Println(err)
        return
    }
    for {
        _, message, err := connection.ReadMessage()
        if err != nil {
            break
        }

        connection.WriteMessage(websocket.TextMessage, message)
        go messageHandler(message)
    }
    fmt.Println("Out of loop")
}

func messageHandler(message []byte) {
    fmt.Println(string(message))
}

func main() {
    server := initServer("/ws")
    server.handleConnections()
}

Saya juga menggunakan gorilla/mux untuk menggunakan parameter laluan (tidak pasti mengapa pengendali http tidak boleh). Perhatikan cara saya menambah http.Handle 更改为 mux.Router.HandleFunc. Seperti yang ditunjukkan oleh pengguna @Cerise dalam ulasan, pakej x/net/websocket 包不在标准库中,但仅添加 Origin tiada dalam pustaka standard, tetapi hanya menambah pengepala Origin tidak menyelesaikan masalah asal sama ada.

Semoga ini dapat menyelamatkan beberapa masalah orang lain seperti saya yang ingin belajar Go.

Atas ialah kandungan terperinci Pelaksanaan pelayan websocket menggunakan perpustakaan x/net trowing 403. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam