2010-09-03 26 views
8

के साथ एक फ्लैश सॉकेट का उपयोग करके मैं केवल gimite/web-socket-js का उपयोग कर रहा हूं ताकि क्रोम और सफारी के विकास के निर्माण के बाद वेबस्केट को कार्यान्वित किया जा सके। मैं रूबी सर्वर से और Node.js. पर दूर जाना चाहता हूँ। अचानक यह क्रोम के अलावा कुछ भी काम नहीं करता है।Node.js

मुझे संदेह है कि इसे Flash Socket Policy फ़ाइल के साथ करना है जिसे मुझे कार्यान्वित करने की आवश्यकता है। मैं इसे बाहरी नोड.जेएस प्रक्रिया के रूप में कार्यान्वित करना चाहता हूं ताकि मूल एप्लिकेशन के साथ गड़बड़ न हो। मैं Node.js के साथ वेबसॉकेट प्रोटोकॉल को लागू करने के लिए node-websocket-server का उपयोग कर रहा हूं, और फिर मैं गड़बड़ करना पसंद करूंगा।

sys:334 
    ctor.prototype = Object.create(superCtor.prototype, { 
          ^
TypeError: Object prototype may only be an Object or null 
    at Function.create (native) 
    at Object.inherits (sys:334:29) 
    at Object.<anonymous> (/Users/me/Projects/testing/websocket/node-websocket-server/flashsocket.js:10:16) 
    at Module._compile (node.js:472:23) 
    at Module._loadScriptSync (node.js:479:10) 
    at Module.loadSync (node.js:349:12) 
    at Object.runMain (node.js:532:24) 
    at node.js:762:10 

यहाँ हम सुंदर गुप्त त्रुटियों Node.js के लिए प्यार में चलाने:

यह flashsocket.js चलाने के लिए किया जाएगा करने का सबसे आसान बात है, लेकिन चल रहा है कि मुझे निम्न त्रुटि देता है की तरह लग रहा था।

मेरा प्रश्न यह है कि वैश्विक फ्लैश सॉकेट नीति सर्वर अकेले खड़ा है, मैं या तो नोड.जेएस या किसी अन्य एप्लिकेशन से भाग सकता हूं? मेरी समझ यह है कि मुझे केवल पोर्ट 843 पर रहने की आवश्यकता है। या नोड.जेएस के लिए एक और वेबस्केट लाइब्रेरी है जो रूबी सर्वर की तरह फ्लैश पॉलिसी को संभालेगी?

उत्तर

6
Node.js मेलिंग सूची से मदद का एक सा के साथ

मैं निम्नलिखित के साथ आया था:

var net = require("net"), 
    domains = ["localhost:8081"]; 

net.createServer(
    function(socket) 
    { 
     socket.write("<?xml version=\"1.0\"?>\n"); 
     socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n"); 
     socket.write("<cross-domain-policy>\n"); 

     domains.forEach(
      function(domain) 
      { 
       var parts = domain.split(':'); 
       socket.write("<allow-access-from domain=\""+parts[0]+"\"to-ports=\""+(parts[1]||'80')+"\"/>\n"); 
      } 
     ); 

     socket.write("</cross-domain-policy>\n"); 
     socket.end(); 
    } 
).listen(843); 

मैं भी WebSockets applications using Flash Sockets के लिए लिखा था एक (संक्षिप्त) ट्यूटोरियल।

+0

ट्यूटोरियल अब पाया जा सकता है [http://www.joshuakehn.com/2010/9/22/WebSocket-Tutorial-with-Nodejs.html) – Phylliida

1

स्ट्रीम के श्रोताओं (सॉकेट के श्रोताओं) को ओवरराइड करना बेहतर है। अन्यथा आपके सर्वर दुर्घटनाग्रस्त होगा आप की तरह कोई त्रुटि है जब:

socket.setEncoding("utf8"); 
socket.addListener("end", function() {socket.end();}); 
socket.addListener("error", function (exception) {socket.end();}); 
socket.addListener("timeout", function() {socket.end();}); 
socket.addListener("close", function (had_error) {socket.end();}); 

देखें प्रलेखन पर: http://nodejs.org/api.html ("net.Stream" पर)

8
यह को रोकने के लिए

ECONNRESET, Connection reset by peer

कार्यान्वयन का नमूना

फ्लैश नीति अनुरोधों का भी उसी पोर्ट पर इनलाइन का उत्तर दिया जा सकता है जैसे वेबसाकेट सेवा जो आप प्रदान कर रहे हैं। Socket.IO node.js मॉड्यूल में this change देखें। यह कनेक्शन को सर्वर से सुनता है जो उसी पोर्ट पर नीति सर्वर अनुरोधों का उत्तर देता है। इस तरह आपको पोर्ट 843 पर कुछ चलाने की ज़रूरत नहीं है (जिसे आमतौर पर रूट विशेषाधिकारों की आवश्यकता होती है)।

वैकल्पिक रूप से, आप भी socat का उपयोग कर एक बहुत ही सरल (2 लाइन) नीति अनुरोध सर्वर चला सकते हैं (यह मानते हुए कि आप एक * nix प्रणाली पर हैं): http://github.com/kanaka/noVNC/blob/master/docs/flash_policy.txt

अद्यतन (@Josh कश्मीर के जवाब):

यह एक आम गलतफहमी है कि पोर्ट 843 फ्लैश पॉलिसी अनुरोधों के लिए प्राथमिक स्थान है और उसी बंदरगाह के अनुरोध एक गिरावट हैं और वे टाइमआउट के कारण धीमे हैं। यह संभवतः आमतौर पर उद्धृत http://www.lightsphere.com/dev/articles/flash_socket_policy.html पर आधारित है और यह भी कि एडोब के दस्तावेज़ को ट्रैक करना (और पढ़ना) मुश्किल है। यहां उनकी सुरक्षा नीति पर एडोब दस्तावेज़ है: http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html

वास्तविकता पोर्ट 843 में एक ही बंदरगाह प्रतिक्रिया से अलग-अलग उद्देश्य पर कार्य करता है।पोर्ट 843 मेटा-पॉलिसी (साइट-पॉलिसी) के लिए है। समान पोर्ट नीतियों पर प्राथमिकता होती है। व्यवस्थापक पूरी प्रणाली के लिए फ्लैश नीतियों को परिभाषित करने के लिए इसका उपयोग कर सकता है और गैर-विशेषाधिकार प्राप्त उपयोगकर्ताओं को इनबाउंड फ्लैश सॉकेट कनेक्शन की अनुमति देने से इनकार कर सकता है। यही कारण है कि यह बंदरगाह 843 (जो विशेषाधिकार प्राप्त सीमा में है) पर है ताकि केवल सिस्टम प्रशासक उस बंदरगाह पर सेवा लॉन्च कर सके।

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

वेबसॉकेट सर्वर के साथ, समान पोर्ट नीति प्रतिक्रिया का एक अतिरिक्त लाभ यह है कि आप फ़्लैश नीति और वेबसाकेट हैंडशेक के बीच मूल नीति कॉन्फ़िगरेशन को अधिक आसानी से समन्वयित कर सकते हैं।

+0

हां, उन्हें इनलाइन का उत्तर दिया जा सकता है लेकिन यह है ** सलाह नहीं दी ** क्योंकि फ्लैश पोर्ट 843 पहले जांच करेगा। यह 3 सेकंड के बाद प्रतिक्रिया प्राप्त नहीं करता है, यह वास्तविक बंदरगाह का प्रयास करेगा। 843 पर एक साफ एफपीएस चलाना बेहतर है और आपका आवेदन अपने स्वयं के बंदरगाह पर है। –

+0

फ़्लैश नीति पर दिलचस्प जानकारी, +1। –

+0

ध्यान दें कि सॉकेट.आईओ केवल फ्लैशसेट सक्षम होने पर पॉलिसी सर्वर सक्षम करेगा। – Nick