Maison > développement back-end > Golang > Implémentation du serveur Websocket à l'aide de la bibliothèque x/net trowing 403

Implémentation du serveur Websocket à l'aide de la bibliothèque x/net trowing 403

WBOY
Libérer: 2024-02-13 17:03:08
avant
980 Les gens l'ont consulté

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

PHP Editor Banana vous présentera une méthode utilisant la bibliothèque x/net pour implémenter un serveur Websocket qui renvoie une erreur 403. Websocket est un protocole de communication qui établit une connexion persistante entre un client et un serveur, et une erreur 403 signifie que le serveur a rejeté la demande du client. En utilisant la bibliothèque x/net, nous pouvons facilement créer un serveur Websocket et rejeter les requêtes en lançant une erreur 403 si nécessaire. Cette méthode est simple et efficace et convient aux scénarios dans lesquels les demandes doivent être autorisées ou l'accès restreint.

Contenu de la question

J'essaie d'implémenter un serveur websocket en utilisant la x/net/websocket bibliothèque standard.

Mes tentatives jusqu'à présent sont les suivantes :

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()
}

Copier après la connexion

Essayez d'utiliser plusieurs clients ws pour vous connecter à ws://localhost:3000/ws 时,我总是收到相同的错误:403-Forbidden. J'ai même essayé l'exemple de la documentation officielle mais je l'obtiens toujours. Est-ce que j'ai raté quelque chose d'évident ? Comme le blocage de port par défaut ou quelque chose comme ça ?

Merci d'avance.

EDIT : vous devrez peut-être utiliser un autre port pour reproduire le problème. Utiliser 3000 dans mon exemple interrompra simplement l'exécution du programme s'il n'est pas disponible.

Edit 2 : Vous pouvez utiliser un client comme websocat et exécuter websocat 'ws://localhost:3000/ws' pour essayer de vous connecter au serveur

Solution de contournement

J'ai abandonné, mais j'ai de bonnes idées : Si vous êtes comme moi et que vous suivez la Procédure pas à pas de création d'un serveur Websocket en déplacement à partir de zéro d'Anthony GG, ne le faites pas. La vidéo est obsolète et, même si elle fournit une bonne intuition sur la façon de créer des vidéos, il est préférable (et sans honte) d'apprendre à utiliser la bibliothèque Websocket de Gorilla.

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()
}

Copier après la connexion

J'utilise également gorilla/mux pour utiliser les paramètres de chemin (je ne sais pas pourquoi le gestionnaire http ne le peut pas). Remarquez comment j'ai ajouté http.Handle 更改为 mux.Router.HandleFunc. Comme l'a souligné l'utilisateur @Cerise dans les commentaires, le package x/net/websocket 包不在标准库中,但仅添加 Origin n'est pas dans la bibliothèque standard, mais le simple ajout de l'en-tête Origin n'a pas non plus résolu le problème d'origine.

J'espère que cela évitera une partie des problèmes que d'autres personnes comme moi rencontrent lors de l'apprentissage du Go.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal