如何构build相对于页面URI的WebSocket URI?

我想在浏览器端构build一个相对于页面URI的WebSocket URI。 说,在我的情况下,转换HTTP URI像

http://example.com:8000/path https://example.com:8000/path 

 ws://example.com:8000/path/to/ws wss://example.com:8000/path/to/ws 

我现在正在做的是用“ws”replace前4个字母“http”,并附加“/ to / ws”。 有没有更好的办法呢?

如果您的Web服务器支持WebSocket(或WebSocket处理程序模块),那么您可以使用相同的主机和端口,只需更改您所显示的scheme即可。 有许多选项可以将Web服务器和Websocket服务器/模块一起运行。

我build议你看一下window.location全局的各个部分,并将它们连接在一起,而不是盲目的replacestring。

 var loc = window.location, new_uri; if (loc.protocol === "https:") { new_uri = "wss:"; } else { new_uri = "ws:"; } new_uri += "//" + loc.host; new_uri += loc.pathname + "/to/ws"; 

请注意,某些Web服务器(即基于Jetty的Web服务器)当前使用path(而不是升级头)来确定是否应将特定的请求传递给WebSocket处理程序。 所以你可能会受到限制,你是否可以按照你想要的方式改变path。

这是我的版本,它添加的TCP端口的情况下,不是80或443:

 function url(s) { var l = window.location; return ((l.protocol === "https:") ? "wss://" : "ws://") + l.hostname + (((l.port != 80) && (l.port != 443)) ? ":" + l.port : "") + l.pathname + s; } 

编辑1:通过@kanaka的build议改进版本:

 function url(s) { var l = window.location; return ((l.protocol === "https:") ? "wss://" : "ws://") + l.host + l.pathname + s; } 

编辑2:现在我创buildWebSocket这个:

 var s = new WebSocket(((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + "/ws"); 

假设您的WebSocket服务器正在侦听与请求页面相同的端口,我会build议:

 function createWebSocket(path) { var protocolPrefix = (window.location.protocol === 'https:') ? 'wss:' : 'ws:'; return new WebSocket(protocolPrefix + '//' + location.host + path); } 

那么,你的情况,如下所示:

 var socket = createWebSocket(location.pathname + '/to/ws'); 

在本地主机上,你应该考虑上下文path。

 function wsURL(path) { var protocol = (location.protocol === 'https:') ? 'wss://' : 'ws://'; var url = protocol + location.host; if(location.hostname === 'localhost') { url += '/' + location.pathname.split('/')[1]; // add context path } return url + path; } 

简单:

 window.location.href.replace('http', 'ws') + '/to/ws'