2016-01-08 5 views
5

मुझे जो कुछ करने की कोशिश कर रहा है उस पर थोड़ा सा पृष्ठभूमि दें।जावास्क्रिप्ट के साथ एक आईपी के लिए एक टीसीपी कनेक्शन करने का कोई तरीका है?

मैं किसी उपकरण (चिप और पिन टर्मिनल) एक स्थानीय आईपी पते है कि है, यह कुछ डेटा प्राप्त करते हैं और यह प्रक्रिया करने के लिए प्रोग्राम किया गया है।

उदाहरण: मैं हेक्स "30 35" में स्ट्रिंग "05" भेजता हूं और टर्मिनल इसे पढ़ता है और फिर से शुरू कर देगा।

मैं SockJS-Client का उपयोग कर के साथ-साथ WebSockets में बनाया कोशिश की है।

WebSockets हालांकि का उपयोग कर रहा है कि नोटिस ब्राउज़र भेज रहा है:

GET/HTTP/1.1 
Host: IP:PORT 
Connection: Upgrade 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade: websocket 
Origin: MYIP 
Sec-WebSocket-Version: 13 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 
Sec-WebSocket-Key: A1CeTMFnQCZv4GNZbLFnyQ== 
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 

मेरे कोड इस तरह दिखता है:

var exampleSocket = new WebSocket("ws://IP:PORT"); 

exampleSocket.send("05"); 

मैं इस के लिए कोड को बदलते हैं:

var exampleSocket = new WebSocket("wss://IP:PORT"); 

exampleSocket.send("05"); 

मुझे सिर्फ 3 टैग भेजे गए हैं जो भेजे गए हैं: SYN(0x0016) ETX(0x0003) SOH(0x0001)

अब मुझे यकीन नहीं है कि आपको आने वाले डेटा की व्याख्या करने में सक्षम होने के लिए वेबस्केट सेवर होना चाहिए या नहीं।

SockJS ही है और broswer के बारे में अतिरिक्त जानकारी भेज कर एक ही बात करता है:

GET /info?t=1452272641278 HTTP/1.1 
Host: IP:PORT 
Connection: keep-alive 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36 
Origin: MYIP 
Accept: */* 
Referer: MYIP 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 

तो मुझे लगता है कि मेरे सवाल है। क्या मुझे बस वही भेजने का कोई तरीका है जो मैं चाहता हूं? बिना किसी अतिरिक्त डेटा के?

मैं ऑब्जेक्टिव-सी के साथ ही सी # में इस पूरी कर ली है, मैं बस नहीं यकीन है कि अगर जावास्क्रिप्ट यह कर सकते हैं कर रहा हूँ?

कृपया पूछते हैं कि कुछ भी स्पष्ट नहीं है और मैं स्पष्ट करने की कोशिश करेंगे।

+0

जेएस के माध्यम से स्थानीय नेटवर्क डिवाइस से कनेक्ट करना क्यों महत्वपूर्ण है? सर्वर पर ऐसा करना संभव नहीं होगा और AJAX घटनाओं के माध्यम से लेनदेन का संचालन करना संभव नहीं होगा? – Nathan

+0

किसी अन्य भाषा को चुनें, बस किसी अन्य भाषा के बारे में, और इसके अपेक्षाकृत सीधा, लेकिन (ब्राउज़र) जावास्क्रिप्ट बस डिज़ाइन द्वारा ऐसा नहीं करता है। अन्यथा यह परिलक्षित हमले करने के लिए बच्चे का खेल होगा। – symcbean

उत्तर

0

मुझे अंततः एक समाधान मिला।

मुझे जो करना था वह एक विंडोज़ एप्लीकेशन बनाना था जो वेबस्केट सर्वर के रूप में कार्य करेगा।

जब कार्यक्रम यह एक URL स्कीम बनाएगा तरह myapp://start

यहाँ एक लिंक से खुद को कॉल करने के लिए सक्षम होने के लिए कोड को स्थापित करने से है एक कस्टम URL स्कीम को जोड़ने के लिए रजिस्ट्री को संपादित करने के लिए:

static void Main(string[] args) { 

      try { 

       // SET PATH OF SERVER 
       String path = Environment.GetCommandLineArgs()[0]; 

       // GET KEY 
       RegistryKey key = Registry.ClassesRoot.OpenSubKey("myApp"); 

       // CHECK FOR KEY 
       if (key == null) { 


        // SET KEY 
        key = Registry.ClassesRoot.CreateSubKey("myApp"); 
        key.SetValue(string.Empty, "URL: myApp Protocol"); 
        key.SetValue("URL Protocol", string.Empty); 

        // SET COMMAND 
        key = key.CreateSubKey(@"shell\open\command"); 
        key.SetValue(string.Empty, path + " " + "%1"); 
        //%1 represents the argument - this tells windows to open this program with an argument/parameter 


       } 

       // CLOSE 
       key.Close(); 

      } catch (Exception ex) { 
       Console.WriteLine(ex.Message); 
       Console.ReadKey(); 

      } 



} 

फिर ब्राउज़र में यह उस यूआरएल को कॉल करेगा जो प्रोग्राम शुरू करता है। वेबसाईट बनाया जाएगा और इसे स्थानीयहोस्ट पर भेज देगा: पोर्ट सर्वर प्रोग्राम जो चल रहा है।

विंडोज प्रोग्राम डेटा प्राप्त करने के लिए सबकुछ करेगा, फिर इसे टर्मिनल पर कच्चे टीसीपी/आईपी बाइट्स के रूप में भेजें। एक बार जब टर्मिनल विंडोज प्रोग्राम पर डेटा भेजता है, तो विंडोज प्रोग्राम फिर ब्राउज़र को जानकारी को संभालने के लिए वेबसाईट पर भेज देगा।

तब विंडोज़ प्रोग्राम सभी कनेक्शनों को मार देगा और छोड़ देगा।

0

आप इस तरह का उपयोग करने की कोशिश की है:

var exampleSocket = new WebSocket('wss://IP:PORT', ['soap', 'xmpp']); 

// When the connection is open, send some data to the server 
exampleSocket.onopen = function() { 
    exampleSocket.send('05'); 
}; 

// Log errors 
exampleSocket.onerror = function (error) { 
    console.log('WebSocket Error ' + error); 
}; 

// Log messages from the server 
exampleSocket.onmessage = function (e) { 
    console.log('Server: ' + e.data); 
}; 

आशा मैं मददगार हो सकता है!

+0

जब मैं अपना कोड बदलता हूं, तो मुझे लगता है कि यह वही टैग भेज रहा है, SYN ETX SOH – Derek

+0

यह एक ASCII प्रतिक्रिया है !! SYN-> सिंक्रोनस निष्क्रिय, ईटीएक्स-> पाठ का अंत और एसओएच-> शीर्षक की शुरुआत .. यह मेरे लिए ज्यादा समझ में नहीं आता है ... यह चिप आपको "05" के साथ क्या करना चाहिए जिसे आप भेज रहे हैं? चिप द्वारा किए गए प्रतिक्रिया का प्रोटोकॉल क्या है? –

+0

टर्मिनल हेक्स में "05" पढ़ेगा, जो "3035" है, मशीन उस कमांड को जान लेगी और खुद को पुनरारंभ करेगी। मैं पुन: प्रोग्राम नहीं कर सकता कि टर्मिनल डेटा प्राप्त करने के साथ कैसे इंटरैक्ट करता है। मुझे बस पता है कि मुझे पाठ की शुरुआत या पाठ के अंत के लिए कोई अतिरिक्त हेक्स वर्ण भेजने की आवश्यकता नहीं है। क्या इसे अलग करने के लिए वैसे भी है, इसलिए मैं बिना अतिरिक्त टैग के "कच्चे" डेटा भेजता हूं? – Derek

6

आप एक ऐसे ब्राउज़र आप अपने खुद के डेटा स्वरूप या प्रोटोकॉल में डेटा भेजने के लिए अनुमति देगा में जावास्क्रिप्ट से एक सादे TCP कनेक्शन नहीं कर सकता। ब्राउज़र बस इसका समर्थन नहीं करता है।

यह केवल आप अजाक्स अनुरोध और WebSocket कनेक्शन बनाने के लिए अनुमति देता है। अजाक्स और वेबसाकेट दोनों अनुरोध एक HTTP अनुरोध के रूप में जीवन शुरू करते हैं। वेबसॉकेट अनुरोध के मामले में, HTTP अनुरोध को दोनों पक्षों के सहमत होने के बाद वेबसाकेट प्रोटोकॉल में "अपग्रेड" किया जा सकता है, लेकिन सर्वर पर भेजा गया प्रारंभिक डेटा कानूनी HTTP अनुरोध होगा। वेबसाकेट प्रोटोकॉल वास्तविक पैकेट प्रारूप से कनेक्शन से कैसे काम करता है, इसकी पूरी रूपरेखा के लिए आप this MDN reference देख सकते हैं। एक बार इसे वेबसाकेट प्रोटोकॉल में अपग्रेड करने के बाद भी, इसे here वर्णित सभी डेटा के लिए वेबसॉकेट फ़्रेमिंग प्रारूप का उपयोग करना होगा।

0     1     2     3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-------+-+-------------+-------------------------------+ 
|F|R|R|R| opcode|M| Payload len | Extended payload length | 
|I|S|S|S| (4) |A|  (7)  |    (16/64)   | 
|N|V|V|V|  |S|    | (if payload len==126/127) | 
| |1|2|3|  |K|    |        | 
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + 
|  Extended payload length continued, if payload len == 127 | 
+ - - - - - - - - - - - - - - - +-------------------------------+ 
|        |Masking-key, if MASK set to 1 | 
+-------------------------------+-------------------------------+ 
| Masking-key (continued)  |   Payload Data   | 
+-------------------------------- - - - - - - - - - - - - - - - + 
:      Payload Data continued ...    : 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 
|      Payload Data continued ...    | 
+---------------------------------------------------------------+ 

तो, जब तक कि आपके endpoint HTTP या WebSocket प्रोटोकॉल बोलता है, तो आप सीधे इसे करने के लिए ब्राउज़र में Javascript से कनेक्ट नहीं कर सकता:

यहाँ WebSocket डेटा फ्रेम प्रारूप की एक रूपरेखा है।

प्रारंभिक HTTP अनुरोध के रूप में आप अपने प्रश्न में क्या देख रहे हैं वेबसाकेट कनेक्शन की शुरुआत है। यह वैसे काम करता है।

यदि आप node.js जैसे गैर-ब्राउज़र वातावरण में जावास्क्रिप्ट का उपयोग करते हैं, तो आप एक सादा टीसीपी सॉकेट बनाने के लिए "नेट" मॉड्यूल का उपयोग कर सकते हैं, जिसके बाद आप जो भी प्रोटोकॉल चाहते हैं उसका उपयोग कर सकते हैं।

+0

उत्कृष्ट स्पष्टीकरण। संक्षेप में, ब्राउज़र में, एक शुद्ध टीसीपी कनेक्शन स्थापित करना संभव नहीं है क्योंकि प्रोटोकॉल एक उच्च अनुप्रयोग परत HTTP है। –

+0

डाउनवोट क्यों? इसका क्या हिस्सा सही नहीं है या सुधार की जरूरत है? – jfriend00

संबंधित मुद्दे