考虑以下示例
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?
答案 0 :(得分:3)
您已将websocket.Handler
分配给DefaultServeMux
,但仅使用FileServer
来电中的ListenAndServe
处理程序。
将FileServer处理程序添加到DefaultServe多路复用器,并使用一些非冲突的前缀:
func main() {
http.Handle("/s", websocket.Handler(Echo))
http.Handle("/f", http.FileServer(http.Dir("web"))
err := http.ListenAndServe(":8081", nil)
checkError(err)
}