回答:
WebサーバーがWebSockets(またはWebSocketハンドラーモジュール)をサポートしている場合は、同じホストとポートを使用して、表示されているようにスキームを変更できます。WebサーバーとWebsocketサーバー/モジュールを一緒に実行するための多くのオプションがあります。
ブラインド文字列置換を行う代わりに、window.locationグローバルの個々の部分を見て、それらを結合することをお勧めします。
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ベースのサーバーなど)では、(アップグレードヘッダーではなく)パスを使用して、特定の要求をWebSocketハンドラーに渡すかどうかを決定しています。したがって、パスを希望どおりに変換できるかどうかに制限がある場合があります。
"/to/ws"
か?そうでない場合、その部分の値は何であるべきですか?
以下は、80または443でない場合に備えてtcpポートを追加する私のバージョンです。
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の提案による改良バージョン:
function url(s) {
var l = window.location;
return ((l.protocol === "https:") ? "wss://" : "ws://") + l.host + l.pathname + s;
}
編集2:今日私はWebSocket
これを作成します:
var s = new WebSocket(((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + "/ws");
Window.URL APIの使用-https : //developer.mozilla.org/en-US/docs/Web/API/Window/URL
http(s)、ポートなどで動作します
var url = new URL('/path/to/websocket', window.location.href);
url.protocol = url.protocol.replace('http', 'ws');
url.href // => ws://www.example.com:9999/path/to/websocket
WebSocketサーバーがページがリクエストされているのと同じポートでリッスンしていると仮定すると、次のことをお勧めします。
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');
簡単:
location.href.replace(/^http/, 'ws') + '/to/ws'
// or if you hate regexp:
location.href.replace('http://', 'ws://').replace('https://', 'wss://') + '/to/ws'
/^http/
代わりに使用します。'http'
http
localhostでは、コンテキストパスを考慮する必要があります。
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;
}
typescriptの場合:
export class WebsocketUtils {
public static websocketUrlByPath(path) {
return this.websocketProtocolByLocation() +
window.location.hostname +
this.websocketPortWithColonByLocation() +
window.location.pathname +
path;
}
private static websocketProtocolByLocation() {
return window.location.protocol === "https:" ? "wss://" : "ws://";
}
private static websocketPortWithColonByLocation() {
const defaultPort = window.location.protocol === "https:" ? "443" : "80";
if (window.location.port !== defaultPort) {
return ":" + window.location.port;
} else {
return "";
}
}
}
使用法:
alert(WebsocketUtils.websocketUrlByPath("/websocket"));
path/to/ws
ですか?これは正確にどこにつながるのですか?ありがとう