ইউআরআই পৃষ্ঠার তুলনায় কীভাবে ওয়েবসকেট ইউআরআই বানাবেন?


96

আমি ব্রাউজারের পাশের পৃষ্ঠার ইউআরআই সম্পর্কিত একটি ওয়েবসকেট ইউআরআই তৈরি করতে চাই। বলুন, আমার ক্ষেত্রে এইচটিটিপি ইউআরআই পছন্দ করে

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

প্রতি

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

আমি বর্তমানে যা করছি তা হ'ল "ডাব্লু" দ্বারা প্রথম 4 টি অক্ষর "HTTP" প্রতিস্থাপন করা হবে এবং এতে "/ to / ws" যুক্ত করুন। এর জন্য আর কোন ভাল উপায় আছে কি?


4
আপনি কি বলতে চাইছেন path/to/ws? এটি ঠিক কোথায় বাড়ে? ধন্যবাদ
শুক্রবার

"WS: //" + + window.location.host + + ": 6666" -done
Fattie

উত্তর:


99

যদি আপনার ওয়েব সার্ভারের ওয়েবস্কটস (বা একটি ওয়েবসকেট হ্যান্ডলার মডিউল) এর জন্য সমর্থন থাকে তবে আপনি একই হোস্ট এবং পোর্টটি ব্যবহার করতে পারেন এবং কেবল আপনার মতো স্কিমটি পরিবর্তন করতে পারবেন। ওয়েব সার্ভার এবং ওয়েবসাইটসকেট সার্ভার / মডিউল একসাথে চালানোর জন্য অনেকগুলি বিকল্প রয়েছে।

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি উইন্ডোটির পৃথক টুকরো তাকান oc লোকেশন বিশ্বব্যাপী এবং অন্ধ স্ট্রিং প্রতিস্থাপনের পরিবর্তে এগুলিতে আবার যোগদান করুন।

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

নোট করুন যে কিছু ওয়েব সার্ভার (যেমন জেটি ভিত্তিক একটি) ওয়েবসকেট হ্যান্ডলারের কাছে নির্দিষ্ট অনুরোধটি প্রেরণ করা উচিত কিনা তা নির্ধারণ করতে বর্তমানে (আপগ্রেড শিরোনামের চেয়ে) পাথটি ব্যবহার করে। সুতরাং আপনি নিজের পথে যেভাবে পথটি পরিবর্তন করতে পারবেন তা সীমাবদ্ধ হতে পারে।


পথের নাম ব্যবহার করে আমি এই জাতীয় url পেয়েছি: 'ws: // লোকালহস্ট: 8080 / চ্যাট / সূচক html / চ্যাট'। এবং এটি অনিয়ন্ত্রিত ইউআরএল।
Denis535

4
@ wishmaster35 কীভাবে পরিচালনা করা হয় তা আপনার ব্যবহারের কেস এবং সেটআপের উপর নির্ভর করবে। কোন নিশ্চিত ছুঁড়াত্তয়ালা পথ যদি নির্ধারণ করতে নেই example.com/part1/part2 একটি ডিরেক্টরি নামক part1 মধ্যে Part2 নামের একটি ফাইল নির্দেশ করে, অথবা Part2 খাসি part1 মধ্যে একটি ডিরেক্টরি অথবা সম্পূর্ণ ভিন্ন কিছু নয় (যেমন part1 এবং Part2 মধ্যে কি হয় একটি অবজেক্ট ডাটাবেস)। কোনও URL এর "পাথ" এর অর্থ ওয়েব সার্ভার এবং এর কনফিগারেশন অবধি। আপনি যে অনুমান করতে পারেন যে "* .html" এ শেষ হওয়া উচিত। তবে আবার এটি আপনার নির্দিষ্ট সেটআপ এবং প্রয়োজনীয়তার উপর নির্ভর করবে।
কানাকা

4
@ সকেটপায়ার নং, বন্দর আছে window.location.host এ হোস্টনাম এবং পোর্ট রয়েছে (পজিশন হস্টনামটি কেবল হোস্টনাম)।
কানাকা

আমি কি বাইরে যেতে পারি "/to/ws"? যদি তা না হয় তবে সেই অংশটির মান কত হওয়া উচিত?
টিইটি

4
প্রাথমিক স্তরের ওয়েবসকেট সংযোগ স্থাপনের সময় এটি জিইটি অনুরোধের পথটি (যেমন HTTP জিইটি পাথ) ব্যবহৃত হয় t এটি ব্যবহৃত হয় বা না আপনার সেটআপের উপর নির্ভর করে। যদি আপনার একক উদ্দেশ্য ওয়েবসকেট সার্ভার থাকে (এটি স্ট্যাটিক ওয়েব ফাইলগুলিও পরিবেশন করতে পারে) তবে সম্ভবত এটি এড়ানো হবে। আপনার যদি ডেডিকেটেড ওয়েব সার্ভারের পিছনে একাধিক ওয়েবসকেট সার্ভার থাকে তবে ডানটি সম্ভবত সঠিক ওয়েবসকেট সার্ভারে যাওয়ার জন্য ব্যবহৃত হচ্ছে। পথটি ওয়েবসকেট সার্ভার যেমন টোকেন (যেমন ক্যোয়ারী প্যারামের মাধ্যমে) পাস করার মাধ্যমে অন্যান্য উদ্দেশ্যে ব্যবহার করা যেতে পারে
কানাকা

33

এখানে আমার সংস্করণটি টিসিপি পোর্টটি 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: আজকাল আমি এটি তৈরি করি WebSocket:

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

14
আপনার পোর্ট ম্যাংলিং করার দরকার নেই, কেবলমাত্র অবস্থানের পরিবর্তে অবস্থানের শোধকটি ব্যবহার করুন ost হোস্ট নেম
কানাকা

25

উইন্ডো.ইউআরএলআইপি এআইপিআই ব্যবহার করে - https://developer.mozilla.org/en-US/docs/Web/API/Window/URL

Http (গুলি), বন্দর ইত্যাদি দিয়ে কাজ করে

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

আমার উল্লেখ করা উচিত যে এটি https / wss এর সাথেও কাজ করে ('http' কে 'ws' => 'https' => 'wss' দিয়ে প্রতিস্থাপন করুন)
ইডজ

7

আপনার ওয়েবসকেট সার্ভারটি যে একই পৃষ্ঠা থেকে অনুরোধ করা হচ্ছে একই বন্দরে শুনছে বলে ধরে নিচ্ছি, আমি পরামর্শ দেব:

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

লোকেশন.পথ সঠিক নয়। আপনার পথ নাম ব্যবহার করা উচিত।
Denis535

@ wishmaster35: ভাল ধরা! স্থির।
পাভেল

4

সহজ:

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

আমি ব্যবহার করেন /^http/পরিবর্তে 'http'শুধু মামলা httpURL বারে ভিতরে নেই।
পিএইচকে

window.location.href পুরো পথটি অন্তর্ভুক্ত করে, যাতে আপনি শেষ
পৃষ্ঠার

আপনার অবস্থানে HTTP থাকলে সমস্যা হতে পারে। উদাহরণস্বরূপ: testhttp.com/http.html
কিস

4
কেবল 'http: //' কে 'ডাব্লুএস: //' দিয়ে প্রতিস্থাপন করুন যে সাধারণ ধারণাটি কোনও বিকাশকারী, এমনকি জুনিয়রদের কাছেও স্পষ্ট হওয়া উচিত
মাকসিম কোস্টরমিন

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

4
প্রসঙ্গ পথ কি?
amirouche

2

টাইপস্ক্রিপ্টে:

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

0

মৃত সহজ সমাধান, ডাব্লুএস এবং পোর্ট পরীক্ষা করা হয়েছে:

var ws = new WebSocket("ws://" + window.location.host + ":6666");

ws.onopen = function() { ws.send( .. etc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.