2016-08-28 58 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 
}