2012-05-02 5 views
68

मैं ब्राउज़र पक्ष में पेज URI का एक WebSocket यूआरआई रिश्तेदार का निर्माण करना चाहते हैं। कहो, मेरे मामले में कन्वर्ट HTTP यूआरआई तरहकैसे पेज URI का एक WebSocket यूआरआई रिश्तेदार के निर्माण के लिए?

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 'द्वारा पहले 4 पत्र" http "से बदल दें और संलग्न है"/के लिए/ws "करने के लिए। क्या इसके लिए कोई बेहतर तरीका है?

+1

क्या आप 'path/to/ws' द्वारा मतलब है? यह वास्तव में कहां जाता है? ws ':: धन्यवाद – slevin

उत्तर

66

अपने वेब सर्वर WebSockets (या एक WebSocket हैंडलर मॉड्यूल) के लिए समर्थन है, तो आप एक ही मेजबान और बंदरगाह का उपयोग कर सकते हैं और बस योजना को बदलने की तरह आप दिखा रहे हैं। वेब सर्वर और वेबसाइट्स सर्वर/मॉड्यूल को एक साथ चलाने के लिए कई विकल्प हैं।

मुझे लगता है कि आप विंडो स्थान वैश्विक की व्यक्तिगत टुकड़े को देखने का सुझाव देते हैं और अंधा स्ट्रिंग प्रतिस्थापन करने का उन्हें वापस शामिल होने के साथ बजाय होगा।

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

ध्यान दें कि कुछ वेब सर्वर (अर्थात जेट्टी आधारित वाले) वर्तमान में यह निर्धारित करने के लिए एक विशेष अनुरोध WebSocket हैंडलर को पारित किया जाना चाहिए कि उस पथ (बजाय उन्नयन हेडर) का उपयोग करें। तो आप इस बात से सीमित हो सकते हैं कि आप जिस तरीके से मार्ग चाहते हैं उसे बदल सकते हैं।

+0

पथ नाम का उपयोग करते हुए मैं ऐसे यूआरएल पाने // स्थानीय होस्ट: 8080/चैट/सूचकांक।html/चैट '। और यह uncorrct यूआरएल है। – wishmaster35

+1

@ wishmaster35 इसे कैसे प्रबंधित किया जाता है, यह आपके उपयोग के मामले और सेटअप पर निर्भर करेगा। यह निर्धारित करने के लिए कोई निश्चित तरीका नहीं है कि http://example.com/part1/part2 part1 नामक निर्देशिका में part2 नामक फ़ाइल को संदर्भित करता है, या गीले भाग 2 भाग 1 के भीतर एक निर्देशिका है, या कुछ पूरी तरह से अलग है (उदाहरण के लिए part1 और part2 ऑब्जेक्ट डेटाबेस के भीतर कुंजी हैं)। यूआरएल में "पथ" का अर्थ वेब सर्वर और इसकी कॉन्फ़िगरेशन पर है। आप अनुमान लगा सकते हैं कि "* .html" में समाप्त होने वाली कुछ भी छीन ली जानी चाहिए। लेकिन फिर, यह आपके विशिष्ट सेटअप और आवश्यकताओं पर निर्भर करेगा। – kanaka

+0

आप पोर्ट भी भूल गए !!! – socketpair

27

यहाँ मेरी संस्करण जो मामले में टीसीपी पोर्ट कहते हैं यह 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:

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

संपादित करें 2: @kanaka के सुझाव के रूप में उन्नत संस्करण:

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

आपको पोर्ट मैंगलिंग करने की आवश्यकता नहीं है, बस स्थान.hostname – kanaka

4

मानते हुए अपने WebSocket सर्वर ओ सुन रहा है: आजकल मैं WebSocket इस बनाने n एक ही बंदरगाह के रूप में जहाँ से पृष्ठ का अनुरोध किया जा रहा है, मेरा सुझाव है:

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'); 
+0

स्थान के बजाय location.host का उपयोग करें। रास्ता सही नहीं है। आपको पथनाम का उपयोग करना चाहिए। – wishmaster35

+0

@ wishmaster35: अच्छा पकड़ो! फिक्स्ड। – Pavel

2

स्थानीय होस्ट आप संदर्भ पथ पर विचार करना चाहिए पर।

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

संदर्भ पथ क्या है? – amirouche

0

आसान:

location.href.replace(/^http/, 'ws') + '/to/ws' 
// or if you hate regexp: 
location.href.replace('http://', 'ws://').replace('https://', 'wss://') + '/to/ws' 
+0

मैं 'http' के बजाय 'http' 'के बजाय'/^ http/'का उपयोग करता हूं, बस 'http' यूआरएल बार के अंदर है। – phk

+0

window.location.href में पूरा पथ शामिल है, ताकि आप /page.html/path/to/ws – Eadz

+0

समाप्त कर सकें यदि आपके स्थान में http शामिल है तो समस्याग्रस्त हो सकता है। उदाहरण के लिए: http://testhttp.com/http.html –

0

Window.URL एपीआई का उपयोग करना - 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 
0

टाइपप्रति में:

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")); 
संबंधित मुद्दे