2016-08-28 59 views
1

我正在使用Gorilla/websocket運行一個Go web服務器用於實時象棋/聊天應用程序。據我所知,我在兩個位置定義了地址端口,這個功能是Go http.ListenAndServer()方法和Javascript new Websocket();功能。這可以在同一臺主機上的瀏覽器上很好地工作,但是當試圖通過內部網絡擴展功能時會變得棘手。所以我用,例如:內部網絡需要靜態IP的Websockets地址?

轉到:

PORT := "0.0.0.0:8080" 
// ... 
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) { 
    h.serveWs(hub, w, r) // h is a chessboard Handler wrapper 
}) 
//... 
http.ListenAndServe(PORT, nil) 

的Javascript:

conn = new WebSocket("ws://0.0.0.0:8080/ws"); 

在我的努力得到超過我已經嘗試使用網絡的不同設備這方面的工作,而不是0.0.0.0地址,localhost或我的hostname和我的主機的內部IP(例如)10.232.44.20;對於後者,內部IP硬編碼,它可以工作,但其他嘗試不會。我想到用0.0.0.0將接受來自網絡,這是我從這個答案聚集內所有連接: What is the difference between 0.0.0.0, 127.0.0.1 and localhost?

我應該如何編程ListenAndServe以及new Websocket,這樣我可以在內部網絡訪問服務器,而無需硬編碼我的內部IP地址?我應該從Js和Go以編程方式訪問該數字嗎?最後,我希望能夠在不需要配置的情況下在多種網絡上運行此服務器,並且只需要即可工作。我錯過了什麼?

回答

3

如果網頁和WebSocket的端點由同一臺主機提供,然後創建一個使用用於獲取網頁主機的WebSocket:

conn = new WebSocket("ws://" + window.location.host + "/ws"); 

這將只是在所有網絡配置工作。

至於Go代碼而言,最簡單的方法是將監聽所有網絡:

if err := http.ListenAndServe(":8080", nil); err != nil { 
    // handle error 
}