gpt4 book ai didi

go - http 服务器 Websocket 并提供静态页面

转载 作者:IT王子 更新时间:2023-10-29 01:59:56 29 4
gpt4 key购买 nike

考虑以下示例

import (
"code.google.com/p/go.net/websocket"
"fmt"
"log"
"net/http"
"os"
)

type MessageReceived struct {
Name string
Nbmsg int
}

func Echo(ws *websocket.Conn) {
msg := new(MessageReceived)
for {
websocket.JSON.Receive(ws, &msg)
fmt.Printf("Received message: %+v\n", msg)
if err := websocket.JSON.Send(ws, msg); err != nil {
fmt.Println("Can't send echo")
break
}
//os.Exit(0)
}
}

func checkError(err error) {
if err != nil {
log.Printf("Fatal error: %s\n", err.Error())
os.Exit(1)
}
}

func main() {
http.Handle("/s", websocket.Handler(Echo))
fs := http.FileServer(http.Dir("web"))
err := http.ListenAndServe(":8081",fs)
checkError(err)
}

页面和静态文件得到服务,但是当我尝试从 javascript 连接到 websocket 时,我得到了

WebSocket connection to 'ws://localhost:8081/s' failed: Error during WebSocket handshake: Unexpected response code: 404 

我能让它工作的唯一方法是从不同的 go 应用程序服务器提供静态文件,并使用本地主机上的 2 个不同端口从单独的服务器应用程序提供 websocket,我在上面的示例中缺少什么?我如何从同一台服务器提供文件和 websocket?

最佳答案

您正在分配 websocket.HandlerDefaultServeMux , 但只使用 FileServer你的处理程序 ListenAndServe打电话。

也将 FileServer 处理程序添加到 DefaultServe mux,并带有一些不冲突的前缀:

func main() {
http.Handle("/s", websocket.Handler(Echo))
http.Handle("/f", http.FileServer(http.Dir("web"))
err := http.ListenAndServe(":8081", nil)
checkError(err)
}

关于go - http 服务器 Websocket 并提供静态页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25020802/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com