目录
问题内容
解决方法
首页 后端开发 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 包不在标准库中,但仅添加 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.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 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++ 中获取绝对值的方法有两种:1. 使用内置函数 abs(),获取整型或浮点型的绝对值;2. 使用泛型函数 std::abs(),获取各类支持绝对值运算数据类型的绝对值。

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

std 是 C++ 中包含标准库组件的命名空间。为了使用 std,需要使用 "using namespace std;" 语句。直接使用 std 命名空间中的符号可以简化代码,但建议仅在需要时使用,以避免命名空间污染。

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

prime 是 C++ 中的关键字,表示质数类型,只能被 1 和本身整除,用作布尔类型指示给定值是否为质数,为质数则为 true,否则为 false。

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

fabs() 函数是 C++ 中的一个数学函数,用于计算浮点数的绝对值,去除负号并返回正值。它接受一个浮点参数,并返回一个 double 类型的绝对值。例如,fabs(-5.5) 将返回 5.5。该函数适用于浮点数,其精度受底层硬件影响。

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

Config 在 Java 中表示配置信息,用于调整应用程序行为,通常存储在外部文件中或数据库中,可通过 Java Properties、PropertyResourceBundle、Java Configuration Framework 或第三方库进行管理,其好处包括解耦、灵活性、环境意识、可管理性、可扩展性。

_complex在c语言中的用法 _complex在c语言中的用法 May 08, 2024 pm 01:27 PM

complex 类型用于表示 C 语言中的复数,包含实部和虚部。其初始化形式为 complex_number = 3.14 + 2.71i,实部可通过 creal(complex_number) 访问,虚部可通过 cimag(complex_number) 访问。该类型支持常用的数学运算,如加、减、乘、除和取模。此外,还提供了一组用于处理复数的函数,如 cpow、csqrt、cexp 和 csin。

c++中min是什么意思 c++中min是什么意思 May 08, 2024 am 12:51 AM

C++ 中的 min 函数可返回多个值中的最小值。其语法为:min(a, b),其中 a 和 b 为要比较的值。还可以指定一个比较函数,以支持不支持 < 运算符的类型。C++20 引入了 std::clamp 函数,可处理三个或更多值的最小值。

c++中绝对值怎么打 c++中绝对值怎么打 May 06, 2024 pm 06:21 PM

在 C++ 中求绝对值有三种方法:使用 abs() 函数,可计算任何类型数字的绝对值。使用 std::abs() 函数,可计算整数、浮点数和复数的绝对值。手动计算绝对值,适用于简单的整数。

See all articles