为了账号安全,请及时绑定邮箱和手机立即绑定

Websocket 握手失败 404(golang 服务器)

Websocket 握手失败 404(golang 服务器)

Go
不负相思意 2021-12-07 18:34:47
我有一个简单的 go web 服务器,它在端口 localhost:8080 上提供一个公共文件夹,其中包含一个 html 文件以及一个带有 websocket 逻辑的客户端脚本。在我的main.go 文件中listener, err := net.listen("tcp", "localhost:8080")if err != nil {    log.Fatal(err)}//full code in gist https://gist.github.com/Kielan/98706aaf5dc0be9d6fbe然后在我的客户端脚本中try {    var sock = new WebSocket("ws://127.0.0.1:8080");    console.log("Websocket - status: " + sock.readyState);    sock.onopen = function(message) {    console.log("CONNECTION opened..." + this.readyState);    //onmessage, onerr, onclose, ect...}我在 chrome 中遇到错误WebSocket connection to 'ws://127.0.0.1:8080/' failed: Error during WebSocket handshake: Unexpected response code: 200和火狐Firefox can't establish a connection to the server at ws://127.0.0.1:8080/.我发现这篇文章指的是 node.js 指示将 /websocket 添加到我的客户端 websocket 字符串,尽管它没有解决问题并导致 404我认为响应代码 200 很好,我是否需要以某种方式将请求转换为 websocket,也许它默认为 http?如果是这样,我该怎么做?
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

就像 JimB 指出的那样,您还没有处理 http 或 websocket 连接。


您可以使用包进行 websocket 处理github.com/gorilla/websocket 这是一个简单的设置:


package main


import (    

    "log"

    "net/http"

    "github.com/gorilla/websocket"

)


// wsHandler implements the Handler Interface

type wsHandler struct{}


func main() {

    router := http.NewServeMux()

    router.Handle("/", http.FileServer(http.Dir("./webroot"))) //handles static html / css etc. under ./webroot

    router.Handle("/ws", wsHandler{}) //handels websocket connections


    //serving

    log.Fatal(http.ListenAndServe("localhost:8080", router))

}


func (wsh wsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

    // upgrader is needed to upgrade the HTTP Connection to a websocket Connection

        upgrader := &websocket.Upgrader{

            ReadBufferSize:  1024,

            WriteBufferSize: 1024,

        }


        //Upgrading HTTP Connection to websocket connection

        wsConn, err := upgrader.Upgrade(w, r, nil)

        if err != nil {

            log.Printf("error upgrading %s", err)

            return

        }


        //handle your websockets with wsConn

}

在您的 Javascript 中,您var sock = new WebSocket("ws://localhost/ws:8080");显然需要


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 317 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信