2013-11-21 7 views
6

फेंकता मैं दो सी # प्रोग्राम हैं जो WebSockets (भी कीमिया का प्रयोग करके) और अब (जावास्क्रिप्ट ग्राहकों के साथ) थोड़ी देर के लिए किया गया है सर्वर पूरी तरह से काम कर रहा है पर संवाद करना चाहिए। हालांकि एक कीमिया WebSocketClient को जोड़ने से परिणाम NullReferenceException क्लाइंट पक्ष पर फेंक दिया जा रहा है।कीमिया-WebSockets - WebSocketClient एक NullReferenceException

कुछ डीबगिंग के बाद मुझे पता चला कि _context.Connection.Connected कॉल की वजह से WebSocketClient.cs की लाइन 187 पर अपवाद फेंक दिया गया है। _context.Connection स्थानीय _client के समान उदाहरण है और उनमें से कोई भी समय पर उस बिंदु पर शून्य नहीं है। Msdn.microsoft.com पर TcpClient.Connected पृष्ठ पर सूचीबद्ध कोई संभावित अपवाद नहीं है (मुझे संकेत है कि इसे किसी भी अपवाद को फेंकना नहीं चाहिए)।

आगे जा रहे हैं वापस मैंने देखा है कि _client वर्ग वैरिएबल का इंस्टेंस अपवादों के साथ भरा करने के लिए एक सामान्य लग रही उदाहरण से WebSocketClient.cs की लाइन 176 पर बदल गई है:

से पहले पंक्ति 176 Before line 176

के बाद लाइन 176 After line 176

इस लाइन के ठीक बाद निपटान() Context कि बस लाइन 187 पर जोड़ा गया है की विधि डिस्कनेक्ट करने कहा जाता हो जाता है Connection (जो _client कि मैं Context.cs की लाइन 131 पर पहले उल्लेख किया है के रूप में ही उदाहरण है।

मेरा प्रश्न है: क्यों हो रहा है और मैं इसे कैसे होने से रोक सकता है और सफलतापूर्वक वांछित WebSocketServer से कनेक्ट?

आप किसी भी अधिक जानकारी की जरूरत है मुझे टिप्पणी में पूछने के लिए संकोच नहीं करते कृपया।

संपादित करें 1

अपवाद केवल तब होता है जब सर्वर वास्तव में, सुन रहा है, तो सर्वर निष्क्रिय लाइन है WebSocketClient.cs 176 तक पहुँच नहीं है (यह सही व्यवहार क्योंकि OnRunClient() कहा जाता है जब के लिए कनेक्शन सर्वर बनाया गया है)।

संपादित 2

रूप StackTrace का अनुरोध:

System.NullReferenceException was unhandled 
    HResult=-2147467261 
    Message=Object reference not set to an instance of an object. 
    Source=System 
    StackTrace: 
     at System.Net.Sockets.TcpClient.get_Connected() 
     at Alchemy.WebSocketClient.SetupContext(Context context) in C:\...\Alchemy\WebSocketClient.cs:regel 187 
     at Alchemy.WebSocketClient.HandleClientThread() in C:\...\Alchemy\WebSocketClient.cs:regel 94 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+0

त्रुटि होने से पहले कोड पोस्ट करें – Florian

+0

यह सब WebSocketClient.cs और Context.cs फ़ाइलों में है (इन फ़ाइलों का उल्लेख उपरोक्त प्रश्न में लिंक हैं)। मैंने इन फ़ाइलों को किसी भी तरह से नहीं बदला है। – Manuel

उत्तर

2

मैं तुम्हें TcpClient उपयोग करके देख सकते हैं। यह वर्ग डाटा ट्रांसफर के लिए सॉकेट क्लास का उपयोग करता है (टीसीपी क्लाइंट में ऐसा क्षेत्र है)। जहां तक ​​मुझे कुछ मामलों में पता है कि यह क्षेत्र शून्य हो सकता है। टीसीपी क्लाइंट से जुड़ी संपत्ति आंतरिक सॉकेट इंस्टेंस की कनेक्टेड प्रॉपर्टी का उपयोग करती है। कुछ ऐसा:

public bool Connected 
{ 
    get 
    { 
     return _socket.Connected; // Possible NullRef here!!! 
    } 
} 

तो जब यह फ़ील्ड शून्य है तो आपको NullReferenceException मिलेगा। जहां तक ​​मुझे पता है कि यह तब हो सकता है जब कनेक्शन सफलतापूर्वक स्थापित नहीं हुआ था।

उदाहरण के लिए मैं अपने कोड में यह देखें: कनेक्शन गलत हो जाता है

try 
{ 
    _client.EndConnect(result); 
} 
catch (Exception ex) 
{ 
    Disconnect(); 
    connectError = true; 
} 

using (_context = new Context(null, _client)) 
{ 
     _context = new Context(null, _client); 
     _context.BufferSize = 512; 
     // some code 
} 

यदि आप एक अपवाद मिल जाएगा और कुछ कार्रवाई करेंगे, लेकिन इस मामले में अपने _client अंदर सॉकेट क्षेत्र आरंभ नहीं किया गया होगा। संदर्भ कन्स्ट्रक्टर में आप इसे फ़ील्ड (कनेक्टेड प्रॉपर्टी में) का उपयोग करने का प्रयास करेंगे और आपको NullReferenceException मिलेगा।

मुझे लगता है कि आपको पकड़ ब्लॉक में वापसी जोड़ने की आवश्यकता है।

या

चेक इस तरह से अपनी TcpClient (http://msdn.microsoft.com/ru-ru/library/system.net.sockets.tcpclient.client(v=vs.110).aspx) की संपत्ति क्लाइंट अंतर्निहित:

if (_client.Client != null && _client.Connected) 
{ 
    // do what you need 
} 

आशा यह आप में मदद मिलेगी।

+0

मुझे पता है कि क्लाइंट कनेक्ट/शून्य है या नहीं, मुझे यह जानने की ज़रूरत है कि यह सब कुछ करने से रोकने के लिए कैसे है। – Manuel

+0

@ dragon112 क्षमा करें, मैं अब आपको समझ में नहीं आता। मैंने लगभग 2 कमजोर अंक लिखे थे। पहला यह है कि 'टीसीपी क्लाइंट' कुछ "विशिष्ट" कोड (और परावर्तक मेरे साथ सहमत) के साथ लिखा गया है और हम इसके साथ कुछ भी नहीं कर सकते हैं, हम केवल वर्कअराउंड का उपयोग कर सकते हैं। और सेकंड जो आप 'संदर्भ' बनाते हैं चाहे कनेक्शन सफल था या नहीं (क्यों?), यह अजीब है, लेकिन आप इसे ठीक कर सकते हैं। – Tony

+0

यह मेरा कोड नहीं है, यह एक पुस्तकालय है जिसका मैं उपयोग करता हूं। – Manuel

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