我正在运行一个Play框架应用程序,其中一个javascript需要连接到服务器上的websocket。 服务器在Play应用程序前面运行带有SSL的nginx代理,具有以下设置:
var chatSocket = new WS("@routes.HomeController.connectChat().webSocketURL(request)");
javascript如下所示:
public LegacyWebSocket<JsonNode> connectChat() {
return new LegacyWebSocket<JsonNode>() {
public void onReady(WebSocket.In<JsonNode> in, WebSocket.Out<JsonNode> out){
// Some internal code here
}
};
}
connectChat方法如下所示:
req.body
当一切都在localhost上时,这很好用,但是现在服务器在云端,我在Chromium中收到以下错误:
与'wss:// backend / messages / socket /'的WebSocket连接失败:连接建立错误:net :: ERR_NAME_NOT_RESOLVED
我也尝试将proxy_pass指令地址从后端切换到127.0.0.1:9001,然后我得到了ERR_CONNECTION_REFUSED。
如果我尝试使用“proxy_pass http://backend”并在代理后面切换到非SSL,则浏览器会说websocket连接不安全且无法连接。
这里有什么问题? websockets必须能够直接连接到代理URL吗?支持SSL的websockets不能以这种方式工作吗?
答案 0 :(得分:0)
问题在于此代码
var chatSocket = new WS("@routes.HomeController.connectChat().webSocketURL(request)")
在服务器上解析,因此出现ERR_NAME_NOT_RESOLVED错误。当客户端无法解析您的情况下后端的主机并且浏览器无法解析主机时,这是DNS错误。
尝试使用以下代码替换它,看看它是否有效
var chatSocket = new WS("messages/socket/");
<强>更新强> 似乎上面的代码是不够的。以下是从文档对象
获取主机的方法var webSocketURL = 'wss://' + window.location.host + '/messages/socket/';
var chatSocket = new (webSocketURL);