Jak zbudować WebSocket URI względem Uri strony?

Chcę skonstruować URI WebSocket względem Uri strony po stronie przeglądarki. Powiedzmy, w moim przypadku Konwertuj Uri HTTP jak

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

Do

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

Obecnie robię zastąpienie pierwszych 4 liter "http" przez "ws "i dołączenie do niego" /to/ws". Jest na to jakiś lepszy sposób?

Author: neuront, 2012-05-02

7 answers

Jeśli Twój serwer WWW ma wsparcie dla WebSockets (lub modułu obsługi WebSocket), możesz użyć tego samego hosta i portu i po prostu zmienić schemat, jak pokazujesz. Istnieje wiele opcji uruchomienia serwera WWW i Websocket server / module razem.

Sugerowałbym, żebyś spojrzał na poszczególne części okna.lokalizacja globalna i połączyć je z powrotem razem zamiast robić ślepe podstawianie ciągów.
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";

Zauważ, że niektóre serwery www (tj. oparte na Jetty) obecnie używaj ścieżki (zamiast nagłówka upgrade), aby określić, czy konkretne żądanie powinno zostać przekazane do obsługi WebSocket. Więc możesz być ograniczony w tym, czy możesz przekształcić ścieżkę w sposób, w jaki chcesz.

 75
Author: kanaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-25 13:18:06

Oto moja wersja, która dodaje port tcp w przypadku, gdy nie jest to 80 lub 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;
}

Edit 1: Improved version as by suggestion of @kanaka:

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

Edit 2: Obecnie tworzę WebSocket to:

var s = new WebSocket(((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + "/ws");
 29
Author: yglodt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-04 20:18:47

Zakładając, że serwer WebSocket nasłuchuje na tym samym porcie, z którego żądana jest strona, sugerowałbym:

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

Następnie, dla Twojego przypadku, nazwij to następująco:

var socket = createWebSocket(location.pathname + '/to/ws');
 7
Author: Pavel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-25 17:54:27

Za pomocą okna.URL API - https://developer.mozilla.org/en-US/docs/Web/API/Window/URL

Działa z http (s), portami itp.

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
 3
Author: Eadz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-24 11:59:44

Na localhost powinieneś rozważyć ścieżkę kontekstową.

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;
}
 2
Author: wishmaster35,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-10 04:57:30

W maszynopisie:

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 "";
        }
    }
}

Użycie:

alert(WebsocketUtils.websocketUrlByPath("/websocket"));
 0
Author: Dániel Kis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-02 17:51:03

Easy:

location.href.replace(/^http/, 'ws') + '/to/ws'
// or if you hate regexp:
location.href.replace('http://', 'ws://').replace('https://', 'wss://') + '/to/ws'
 0
Author: Maksim Kostromin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-10 20:03:16