जावास्क्रिप्ट का उपयोग करके ब्राउज़र से टीसीपी सॉकेट से कनेक्ट करना


111

मेरे पास एक vb.net एप्लिकेशन है जो एक सॉकेट खोलता है और उस पर सुनता है।

मुझे एक ब्राउज़र पर चलने वाली जावास्क्रिप्ट का उपयोग करके इस सॉकेट के माध्यम से उस एप्लिकेशन तक संचार करना होगा। मुझे इस सॉकेट पर कुछ डेटा भेजने की आवश्यकता है ताकि जो ऐप इस सॉकेट पर सुन रहा है, वह डेटा ले सके, कुछ सामान कुछ रिमोट कॉल का उपयोग कर सके और कुछ और डेटा प्राप्त कर उसे सॉकेट पर वापस रख सके, जिसे मेरी जावास्क्रिप्ट की आवश्यकता है ब्राउज़र में इसे पढ़ें और प्रिंट करें।

Ive की कोशिश की, socket.io, websockify लेकिन कोई भी उपयोगी साबित नहीं हुआ है।

इसलिए सवाल यह है कि क्या मैं भी संभव है? क्या कोई ऐसा तरीका है जो किसी ब्राउज़र में चलने वाली जावास्क्रिप्ट tcp सॉकेट से कनेक्ट हो सकता है और कुछ डेटा भेज सकता है और सॉकेट पर कुछ और डेटा प्रतिक्रिया के लिए इसे सुन सकता है और इसे ब्राउज़र पर प्रिंट कर सकता है।

यदि यह संभव है तो कोई मुझे सही दिशा में इंगित कर सकता है जिससे मुझे लक्ष्य स्थापित करने में मदद मिलेगी।


3
नहीं, आप
वेबसॉफ़्ट

2
@Bergi - HTTP tcp पर एक प्रोटोकॉल है, इसलिए एक TCP कनेक्शन क्यों बनाया जा सकता है लेकिन TCP नहीं?
एलिकएल्ज़िन-किलाका

@kilaka: क्योंकि (मानक) एक ब्राउज़र वातावरण में उपलब्ध एपीआई उन तक ही सीमित हैं
बरगी

संभावित डुप्लिकेट: stackoverflow.com/questions/9154035/…
AlikElzin-kilaka

6
मैं जावास्क्रिप्ट की रीढ़ को रेंगता हुआ एक नया मानक देखता हूं: w3.org/TR/raw-sockets
एलिकएल्ज़िन-किलाक जूल

जवाबों:


57

आपकी समस्या के लिए, वर्तमान में आपको इसके लिए XHR या वेबस्कैट पर निर्भर रहना होगा।

वर्तमान में किसी भी लोकप्रिय ब्राउज़र ने जावास्क्रिप्ट के लिए किसी भी ऐसे कच्चे सॉकेट्स एप को लागू नहीं किया है जो आपको कच्ची कुर्सियां ​​बनाने और उस तक पहुंचने देता है, लेकिन जावास्क्रिप्ट में कच्ची सॉकेट्स एपी के कार्यान्वयन के लिए एक मसौदा तैयार किया जा रहा है। इन लिंक पर एक नजर:
http://www.w3.org/TR/raw-sockets/
https://developer.mozilla.org/en-US/docs/Web/API/TCPSocket

क्रोम के पास अब अपने 'प्रायोगिक' एपीआई में कच्चे टीसीपी और यूडीपी सॉकेट के लिए समर्थन है। ये सुविधाएँ केवल एक्सटेंशन के लिए उपलब्ध हैं और हालाँकि, प्रलेखित हैं, फिलहाल छिपाए गए हैं। यह कहते हुए कि, कुछ डेवलपर्स पहले से ही इसका उपयोग करके दिलचस्प परियोजनाएँ बना रहे हैं, जैसे कि यह आईआरसी क्लाइंट

इस API तक पहुंचने के लिए, आपको अपने एक्सटेंशन के प्रदर्शन में प्रयोगात्मक ध्वज को सक्षम करना होगा। उदाहरण के लिए सॉकेट का उपयोग करना बहुत सरल है:

chrome.experimental.socket.create('tcp', '127.0.0.1', 8080, function(socketInfo) {
  chrome.experimental.socket.connect(socketInfo.socketId, function (result) {
        chrome.experimental.socket.write(socketInfo.socketId, "Hello, world!");         
    });
});

क्या ब्राउज़र कच्चे सॉकेट का समर्थन करते हैं?
एलिकएल्ज़िन-किलाका

2
Websockets और Rawsockets की तुलना में कोई प्रदर्शन बढ़ता है?
नीके न्यूमैन

3
क्या ब्राउज़र में जावास्क्रिप्ट को tcp पोर्ट, एक सुरक्षा छेद से कनेक्ट करने की अनुमति नहीं है? अपने फ़ायरफ़ॉक्स / क्रोम में जावास्क्रिप्ट की कल्पना करें कि आप स्थानीय रूप से चलने वाली किसी भी चीज़ से कनेक्ट करें (MySQL DB) और किसी बुरी साइट पर डेटा प्रकाशित करें?
अरुण अवनाथन

@ अरुनाथन आप जो भी करते हैं अजाक्स के साथ आप सॉकेट्स और वाइस-वर्सा के साथ कर सकते हैं ... मुझे लगता है कि कोई सुरक्षा मुद्दा नहीं है।
फ़राज़ अब्द अल्रहमान

1
@FirasAbdAlrahman मुझे लगता है कि HTTP / S के लिए ब्राउज़र व्यवहार को नियंत्रित करने वाली विभिन्न सुरक्षा नीतियां हैं । तो टीसीपी पर ब्राउज़र सॉकेट कनेक्शन HTTP / S के समान नहीं है।
अरुण अवनाथन

30

यह नीचे दिए गए अनुसार नेविगेटर इंटरफ़ेस के माध्यम से संभव होगा:

navigator.tcpPermission.requestPermission({remoteAddress:"127.0.0.1", remotePort:6789}).then(
  () => {
    // Permission was granted
    // Create a new TCP client socket and connect to remote host
    var mySocket = new TCPSocket("127.0.0.1", 6789);

    // Send data to server
    mySocket.writeable.write("Hello World").then(
        () => {

            // Data sent sucessfully, wait for response
            console.log("Data has been sent to server");
            mySocket.readable.getReader().read().then(
                ({ value, done }) => {
                    if (!done) {
                        // Response received, log it:
                        console.log("Data received from server:" + value);
                    }

                    // Close the TCP connection
                    mySocket.close();
                }
            );
        },
        e => console.error("Sending error: ", e)
    );
  }
);

अधिक विवरण w3.org tcp-udp-sockets प्रलेखन में उल्लिखित हैं।

http://raw-sockets.sysapps.org/#interface-tcpsocket

https://www.w3.org/TR/tcp-udp-sockets/

एक अन्य विकल्प क्रोम सॉकेट का उपयोग करना है

संबंध बनाना

chrome.sockets.tcp.create({}, function(createInfo) {
  chrome.sockets.tcp.connect(createInfo.socketId,
    IP, PORT, onConnectedCallback);
});

डेटा भेज रहा है

chrome.sockets.tcp.send(socketId, arrayBuffer, onSentCallback);

डेटा मिल रहा है

chrome.sockets.tcp.onReceive.addListener(function(info) {
  if (info.socketId != socketId)
    return;
  // info.data is an arrayBuffer.
});

आप उपयोग करने का प्रयास भी कर सकते हैं HTML5 Web Sockets(हालांकि यह प्रत्यक्ष टीसीपी संचार नहीं है):

var connection = new WebSocket('ws://IPAddress:Port');

connection.onopen = function () {
  connection.send('Ping'); // Send the message 'Ping' to the server
};

http://www.html5rocks.com/en/tutorials/websockets/basics/

आपका सर्वर भी एक WebSocket सर्वर जैसे pywebsocket के साथ सुन रहा होगा, वैकल्पिक रूप से आप अपने खुद के रूप में मोज़िला में उल्लिखित लिख सकते हैं


25
इस उत्तर पर थोड़ा और विस्तार करने के लिए: सर्वर को एक वेबसॉकेट सर्वर के साथ भी सुनना चाहिए। WebSockets सीधे एक कच्चे टीसीपी सॉकेट से कनेक्ट नहीं हो सकता है। websockify एक ऐसा उपकरण है जो WebSocket-to-TCP प्रॉक्सी के रूप में कार्य करता है: यह आपके सर्वर पर बैठता है और WebSocket कनेक्शन के लिए सुनता है, और फिर एक निर्दिष्ट TCP सॉकेट से और इसके लिए WebSocket संचार को आगे करता है।
14

58
यह सवाल का जवाब नहीं देता है - वेबसोकेट टीसीपी पर एक प्रोटोकॉल है (उदाहरण के लिए HTTP) और टीसीपी संचार को निर्देशित नहीं करता है।
एलिकएल्ज़िन-किलाका

1
लेकिन संदेश को ब्राउज़र विंडो में कैसे रखा जाए? :(
shzyincu

3
यह उत्तर पूरी तरह से गलत है और इसे हटा दिया जाना चाहिए।
ब्रैड

1
@ इस जवाब से मुझे मदद मिली और इसने कुछ लोगों को 22 अपवोट होने में भी मदद की होगी।
user1378687

6

ws2s प्रोजेक्ट का उद्देश्य ब्राउज़र-साइड js में सॉकेट लाना है। यह एक websocket सर्वर है जो websocket को सॉकेट में बदल देता है।

ws2s योजनाबद्ध आरेख

यहां छवि विवरण दर्ज करें

कोड नमूना:

var socket = new WS2S("wss://ws2s.feling.io/").newSocket()

socket.onReady = () => {
  socket.connect("feling.io", 80)
  socket.send("GET / HTTP/1.1\r\nHost: feling.io\r\nConnection: close\r\n\r\n")
}

socket.onRecv = (data) => {
  console.log('onRecv', data)
}

5

देखें jsocket । खुद इसका इस्तेमाल नहीं किया। पिछले अद्यतन (26/6/2014 तक) के बाद से 3 वर्ष से अधिक हो गए।

* फ़्लैश का उपयोग करता है :(

से प्रलेखन :

<script type='text/javascript'>
    // Host we are connecting to
    var host = 'localhost'; 
    // Port we are connecting on
    var port = 3000;

    var socket = new jSocket();

    // When the socket is added the to document 
    socket.onReady = function(){
            socket.connect(host, port);             
    }

    // Connection attempt finished
    socket.onConnect = function(success, msg){
            if(success){
                    // Send something to the socket
                    socket.write('Hello world');            
            }else{
                    alert('Connection to the server could not be estabilished: ' + msg);            
            }       
    }
    socket.onData = function(data){
            alert('Received from socket: '+data);   
    }

    // Setup our socket in the div with the id="socket"
    socket.setup('mySocket');       
</script>

0

आप जिस समाधान की तलाश कर रहे हैं वह वेब सॉकेट है। हालाँकि, क्रोमियम परियोजना ने कुछ नई तकनीकें विकसित की हैं जो प्रत्यक्ष टीसीपी कनेक्शन टीसीपी क्रोमियम हैं


0

आप जो चाहते हैं उसे प्राप्त करने के लिए, आपको दो एप्लिकेशन (उदाहरण के लिए जावा या पायथन में) लिखना होगा:

  1. ब्रिज ऐप जो क्लाइंट की मशीन पर बैठता है और टीसीपी / आईपी सॉकेट और वेबस्केट दोनों से निपट सकता है। यह प्रश्न में टीसीपी / आईपी सॉकेट के साथ बातचीत करेगा।

  2. सर्वर-साइड ऐप (जैसे कि एक JSP / सर्वलेट WAR) जो वेबसॉकेट्स से बात कर सकता है। इसमें कम से कम एक HTML पृष्ठ (सर्वर-साइड प्रोसेसिंग कोड सहित यदि आवश्यक हो) एक ब्राउज़र द्वारा एक्सेस किया जाना है।

कुछ इस तरह से इसे काम करना चाहिए

  1. ब्रिज वेब ऐप के लिए एक WS कनेक्शन खोलेगा (क्योंकि एक सर्वर ग्राहक से कनेक्ट नहीं हो सकता है)।
  2. वेब ऐप क्लाइंट को खुद की पहचान करने के लिए कहेगा
  3. ब्रिज क्लाइंट सर्वर को कुछ आईडी जानकारी भेजता है, जो ब्रिज की पहचान करने के लिए इसे स्टोर करता है।
    1. ब्राउज़र-देखने योग्य पृष्ठ जेएस का उपयोग करके WS सर्वर से कनेक्ट होता है।
    2. चरण 3 को दोहराएं, लेकिन JS- आधारित पृष्ठ के लिए
    3. जेएस-आधारित पेज सर्वर को एक कमांड भेजता है, जिसमें यह भी जाना चाहिए कि किस पुल पर जाना है।
    4. सर्वर ब्रिज पर कमांड को फॉरवर्ड करता है।
    5. पुल एक टीसीपी / आईपी सॉकेट खोलता है और इसके साथ बातचीत करता है (एक संदेश भेजता है, एक प्रतिक्रिया मिलती है)।
    6. पुल WS के माध्यम से सर्वर को एक प्रतिक्रिया भेजता है
    7. WS ब्राउज़र-देखने योग्य पृष्ठ की प्रतिक्रिया को आगे बढ़ाता है
    8. जेएस प्रतिक्रिया को संसाधित करता है और तदनुसार प्रतिक्रिया करता है
    9. जब तक ग्राहक डिस्कनेक्ट / अनलोड नहीं करता तब तक दोहराएं

नोट 1: उपरोक्त चरण एक विशाल सरलीकरण हैं और इसमें त्रुटि से निपटने और रखने के अनुरोधों के बारे में जानकारी शामिल नहीं है, इस घटना में कि या तो क्लाइंट समय से पहले डिस्कनेक्ट हो जाता है या सर्वर को ग्राहकों को सूचित करने की आवश्यकता होती है कि यह बंद हो रहा है / पुनरारंभ हो रहा है।

नोट 2: आपकी आवश्यकताओं के आधार पर, इन घटकों को एक में विलय करना संभव हो सकता है यदि प्रश्न में टीसीपी / आईपी सॉकेट सर्वर (जिसमें पुल वार्ता) सर्वर ऐप के समान मशीन पर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.