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

时间:2014-07-29 16:51:50

标签: go

考虑以下示例

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?

1 个答案:

答案 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)
}