内部网络上的Websockets地址需要静态IP吗?

时间:2016-08-28 19:00:17

标签: javascript go websocket network-programming localhost

我正在使用Gorilla/websocket运行Go网络服务器来进行实时国际象棋/聊天应用程序。据我所知,我在两个位置定义地址端口,即Go http.ListenAndServer()方法和Javascript new Websocket();功能。这在同一主机上的浏览器中运行良好,但在尝试通过内部网络扩展功能时会变得棘手。所以我使用,例如:

转到:

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以及我的主机&# 39; s内部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以编程方式访问该号码吗?最后,我希望能够在各种网络上运行此服务器,无需配置,并让它正常工作。我错过了什么?

1 个答案:

答案 0 :(得分:3)

如果网页和websocket端点由同一主机提供服务,则使用用于获取网页的主机创建websocket:

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

这将适用于所有网络配置。

就Go代码而言,最简单的方法是监听所有网络:

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