2014-04-07 4 views
13

मुझे यह जांचने की ज़रूरत है कि मेरे websocket सर्वर से कनेक्शन स्थापित है या नहीं।क्या मैं एक असफल वेबसाइकिल कनेक्शन के लिए "कनेक्शन स्थापित नहीं कर सकता" त्रुटि पकड़ सकता हूं?

इस समय, मैं सर्वर से कनेक्ट कर सकता हूं, लेकिन मैं उस सर्वर की संभावना को पकड़ने में सक्षम होना चाहता हूं, इसलिए यह सवाल यह है कि वेबसाइकिल कनेक्शन स्थापित नहीं किया जा सकता है या जब यह समय पूरा हुआ।

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

Firefox can't establish a connection to the server at ws://192.168.0.1/. 

क्या मैं अब तक की कोशिश की है: अपने ही window.timeout अगर onopen हैंडलर अभी तक या नहीं बुलाया गया है की जाँच करता है कि जोड़कर

  • रोकें 20 सेकंड का समय समाप्त, लेकिन जो जावास्क्रिप्ट त्रुटि को रोकता नहीं है।
  • बलपूर्वक बंद करें मेरे अपने समय समाप्ति के अंत में WebSocket, लेकिन अब मैं दो JavaScript त्रुटियों मिल - मूल प्लस:

    The connection to ws://192.168.0.1/ was interrupted while the page was loading.

  • मेरे कोड को try {} catch(e) {} जोड़ा जा रहा है, दोनों जब सॉकेट जोड़ने और इसे बंद करना - कोई बदलाव नहीं।

ब्राउज़र में वेबसाइकिल त्रुटियों को कैसे प्राप्त करने के बारे में कोई विचार नहीं है?

+0

आप केवल दिखाए जाने से WebSocket त्रुटियों को रोकने के लिए चाहते हैं या सभी त्रुटियों संदेशों पर प्रतिबंध लगाने चाहते हैं क्या ठीक हो? यहां का जवाब उपयोगी हो सकता है: http://stackoverflow.com/questions/7120290/how-to-suppress-all-javascript-runtime-errors – Greg

+0

इस समय, मैं केवल वेबकेट त्रुटियों को रोकने के लिए पसंद करूंगा - अगर वह है बिल्कुल संभव है। यदि नहीं, तो मुझे आपके द्वारा पोस्ट किए गए विकल्प का उपयोग करना पड़ सकता है। धन्यवाद! – semmelbroesel

+0

दुर्भाग्य से मैं विशेष रूप से उन त्रुटियों के लिए फ़िल्टर करने के तरीके की अनुशंसा करने के लिए websockets के साथ पर्याप्त परिचित नहीं हूं। हालांकि शुभकामनाएँ! – Greg

उत्तर

7

मैं अब तक क्या learnd है: आप नहीं कर सकते: ... 0 (

क्योंकि यह कुछ हद तक ब्राउज़र विशिष्ट व्यवहार है ...

  • तो केवल एक चीज आप कर सकते हैं उपयोग कर रहा है ws पर कॉलबैक वस्तु और प्रार्थना ...
  • या बस के ऊपर लिख console.log; 0)
कोड मैं तथापि किया साथ

मुझे मिल गया कुछ त्रुटि संदेशों में से छुटकारा, हो सकता है यह मदद करेंगे;)

जैसे:

  • क्रोम मृत सर्वर के बारे में शिकायत नहीं करेगा और चुपचाप फिर से कनेक्ट करने का प्रयास करें ..
  • IE 11 अभी भी स्क्रिप्ट त्रुटि
  • देता है
  • आदि ..

एक बुनियादी कक्षा WS रैप करने के लिए: कॉलबैक पर एक नज़र डालें!

/** 
* Socket Class 
*/ 
Client.Source.Network.Socket.Class = new Class({ implements: [Client.Source.Network.Socket.Interface] },function(Host, Port){ 

var Configuration = { 
    Server: { 
     Protocol: 'ws', 
     Host: Host, 
     Port: Port 
    }, 
    Event: { 
     Open: function(){}, 
     Error: function(){}, 
     Message: function(){}, 
     Close: function(){} 
    } 
}; 

var Socket = null; 

/** 
* @return {string} 
*/ 
var HostUrl = function() { 
    return Configuration.Server.Protocol + '://' + Configuration.Server.Host + ':' + Configuration.Server.Port + '/Connection' 
}; 

/** 
* @returns {boolean} 
*/ 
var IsSupported = function() { 
    return "WebSocket" in window; 
}; 

this.Open = function() { 
    if(IsSupported()) { 
     Socket = new WebSocket(HostUrl()); 
     Socket.onopen = Configuration.Event.Open; 
     Socket.onerror = Configuration.Event.Error; 
     Socket.onmessage = Configuration.Event.Message; 
     Socket.onclose = Configuration.Event.Close; 
    } else { 

    } 
}; 

this.Send = function(Text) { 
    Socket.send(Text); 
}; 

this.Close = function() { 
    Socket.close(); 
}; 

this.onOpen = function(Callback) { 
    Configuration.Event.Open = Callback; 
}; 
this.onError = function(Callback) { 
    Configuration.Event.Error = Callback; 
}; 
this.onMessage = function(Callback) { 
    Configuration.Event.Message = Callback; 
}; 
this.onClose = function(Callback) { 
    Configuration.Event.Close = Callback; 
}; 

}); 

कनेक्ट() पर एक नज़र डालें:(), OnClose() onError समारोह

/** 
* Network Class 
*/ 
Client.Source.Network.Class = new Class({ implements: [Client.Source.Network.Interface] },function(){ 

var _Self = this; 
var Socket = null; 

this.Connect = function(Host, Port) { 
    Socket = new Client.Source.Network.Socket.Class(Host, Port); 
    Socket.onOpen(function(){ 
     _Self.Gui().Create(Client.Module.Client.Gui()); 
     Client.Module.Chat.Message('Connected', 'green', 11); 
     Client.Module.Audio.Play('Client.Resource.Audio.Chat.UserOnline', 0.2); 
    }); 
    Socket.onMessage(Response); 
    Socket.onError(function(){ 
     Client.Module.Chat.Message('Connection Error', 'red', 11); 
    }); 
    Socket.onClose(function(){ 
     _Self.Gui().Destroy(); 
     Client.Module.Chat.Message('Disconnected', 'darkred', 11); 
     Client.Module.Chat.Message('Connecting...', 'orange', 11); 
     window.setTimeout(function() { 
      _Self.Connect(Host, Port); 
     }, 2000); 
    }); 
    Socket.Open(); 
}; 

this.Request = function(Application, Request, Data) { 
    Socket.Send(JSON.stringify({ Application: Application, Request: Request, Data: Data })); 
}; 
var Response = function(Message) { 
    Message = JSON.parse(Message.data); 
    Library[Message.Application].Execute(Message.Request, Message.Data); 
}; 

var Library = {}; 
this.Protocol = function(Application, Callback) { 
    Library[Application] = Callback; 
}; 

var GuiObject = null; 
this.Gui = function Gui() { 
    if(GuiObject === null) { 
     GuiObject = new Client.Source.Network.Gui(); 
    } 
    return GuiObject; 
}; 
}); 
+0

+1! लेकिन क्या आप संक्षेप में बता सकते हैं कि उपर्युक्त क्या करता है? (* जो प्रमुख रेखाएं हैं जो जाल त्रुटियों। *) (और एक साइड नोट के रूप में, कोड में 'वेबस्केट' क्यों नहीं है और जैसा कि आपने उल्लेख किया है, 'कंसोल' को ओवरराइड नहीं करता है?) – Jodes

+0

Thx:) मैंने अपने पुस्तकालयों में से एक उदाहरणों को काट दिया है, इसलिए यह कॉपी/पेस्ट काम नहीं करेगा, यह सिर्फ चीजों को समझाने के लिए है .. पहला कोड ब्लॉक वेबस्केट ऑब्जेक्ट के लिए एक रैपर क्लास है। यह 'नई वेबसॉकेट (HostUrl()) को कॉल करता है;' इस में। ओपन(); '। दूसरी कोड ब्लॉक में फँसाने को बाहर संभाला जाता है, इसलिए कृपया 'सॉकेट.ऑनरर' कॉलबैक पर एक नज़र डालें। यह 'कंसोल' को ओवरराइड नहीं करता है क्योंकि ऐसा करने का इरादा नहीं है .. अगर त्रुटियां पॉप-अप होती हैं और कॉलबैक द्वारा नियंत्रित नहीं होती हैं तो आप _may_ console.log को ओवरराइड करते हैं लेकिन यह ब्राउज़र डीबग सुविधा को मारता है, इसलिए यह डिफ़ॉल्ट रूप से वहां नहीं है;) – DerDu

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