我正在使用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以编程方式访问该号码吗?最后,我希望能够在各种网络上运行此服务器,无需配置,并让它正常工作。我错过了什么?
答案 0 :(得分:3)
如果网页和websocket端点由同一主机提供服务,则使用用于获取网页的主机创建websocket:
conn = new WebSocket("ws://" + window.location.host + "/ws");
这将适用于所有网络配置。
就Go代码而言,最简单的方法是监听所有网络:
if err := http.ListenAndServe(":8080", nil); err != nil {
// handle error
}