目錄
問題內容
解決方法
首頁 後端開發 Golang 使用 x/net 庫 trowing 403 的 Websocket 伺服器實現

使用 x/net 庫 trowing 403 的 Websocket 伺服器實現

Feb 13, 2024 pm 05:03 PM
標準函式庫

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

php小編香蕉為您介紹一種使用x/net函式庫的方法,用於實作一個拋出403錯誤的Websocket伺服器。 Websocket是一種在客戶端和伺服器之間建立持久連接的通訊協議,而403錯誤表示伺服器拒絕了客戶端的請求。透過使用x/net函式庫,我們可以輕鬆地建立一個Websocket伺服器,並在需要的時候拋出403錯誤,從而實現對請求的拒絕。這種方法簡單有效,適用於需要對請求進行授權或限制存取的場景。

問題內容

我正在嘗試使用 x/net/websocket 標準庫實作一個 websocket 伺服器。

到目前為止我的嘗試如下:

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

登入後複製

嘗試使用多個 ws 用戶端連線到 ws://localhost:3000/ws 時,我總是收到相同的錯誤:403-Forbidden。 我什至嘗試了官方文件的範例,但仍然得到它。我錯過了一些明顯的東西嗎?像預設連接埠阻塞或類似的嗎?

提前謝謝您。

編輯:您可能需要使用不同的連接埠來重現問題。在我的範例中使用 3000 ,如果不可用,只會中斷程式的執行。

編輯2:您可以使用像websocat這樣的客戶端並執行websocat 'ws://localhost:3000/ws' 來嘗試連線到伺服器

解決方法

我放棄了,但有很好的見解: 如果您像我一樣正在關注 Anthony GG 的從頭開始在 Go 上建立 Websocket 伺服器的演練 ,請不要。影片已經過時了,儘管它提供瞭如何創建影片的很好的直覺,但最好(並且沒有恥辱)使用 gorilla 的 websocket 庫進行學習。

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

登入後複製

我還使用 gorilla/mux 來使用路徑參數(不知道為什麼 http 處理程序不能)。 請注意我如何將 http.Handle 更改為 mux.Router.HandleFunc。 正如用戶 @Cerise 在評論中指出的那樣,x/net/websocket 套件不在標準庫中,但僅添加 Origin 標頭也沒有解決原始問題。

希望這能避免其他像我一樣學習 Go 的人遇到的一些麻煩。

以上是使用 x/net 庫 trowing 403 的 Websocket 伺服器實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

c++中絕對值怎麼用 c++中絕對值怎麼用 May 06, 2024 pm 06:15 PM

c++中絕對值怎麼用

iomanip在c語言中是什麼意思 iomanip在c語言中是什麼意思 May 02, 2024 pm 05:57 PM

iomanip在c語言中是什麼意思

c++中std::怎麼用 c++中std::怎麼用 May 09, 2024 am 03:45 AM

c++中std::怎麼用

c++中prime什麼意思 c++中prime什麼意思 May 07, 2024 pm 11:33 PM

c++中prime什麼意思

怎麼彈出窗口 怎麼彈出窗口 May 05, 2024 pm 08:15 PM

怎麼彈出窗口

config在java中什麼意思 config在java中什麼意思 May 07, 2024 am 02:39 AM

config在java中什麼意思

c++中fabs是什麼意思 c++中fabs是什麼意思 May 08, 2024 am 01:15 AM

c++中fabs是什麼意思

c++中絕對值怎麼打 c++中絕對值怎麼打 May 06, 2024 pm 06:21 PM

c++中絕對值怎麼打

See all articles