2016-10-28 10 views
5

के लिए काम नहीं करता है मुझे ओएसएक्स पर एक सुरक्षित वेब सॉकेट क्लाइंट को लागू करने में समस्याएं आ रही हैं। मैं System.Net.WebSockets से ClientWebSocket का उपयोग कर रहा हूं। यहां कुछ परीक्षण कोड दिए गए हैं:एक्समरिन मोनो क्लाइंट वेबबॉकेट कार्यान्वयन सुरक्षित सॉकेट

static async Task RunLoop() 
    { 
     ClientWebSocket ws = new ClientWebSocket(); 
     await ws.ConnectAsync(new Uri("wss://echo.websocket.org"), CancellationToken.None); 

     do 
     { 
      Console.Write("Enter message:"); 
      var msg = Console.ReadLine(); 
      if (msg == "quit") 
      { 
       break; 
      } 

      var b = new ArraySegment<byte>(UTF8Encoding.UTF8.GetBytes(msg)); 
      await ws.SendAsync(b, WebSocketMessageType.Text, true, CancellationToken.None); 

      byte[] bb = new byte[2048]; 
      ArraySegment<byte> buffer = new ArraySegment<byte>(bb); 

      var result = await ws.ReceiveAsync(buffer, CancellationToken.None); 

      switch (result.MessageType) 
      { 
       case WebSocketMessageType.Text: 
        Console.WriteLine(UTF8Encoding.UTF8.GetString(buffer.Array)); 
        break; 
       case WebSocketMessageType.Close: 
        await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); 
        break; 
      } 

     } while (true); 
    } 

    static void Main(string[] args) 
    { 
     var task = RunLoop(); 
     task.Wait(); 
    } 

हर बार जब मुझे ReceiveAsync कहा जाता है तो मुझे यह अपवाद प्राप्त हुआ।

Cannot access a disposed object. 

ऑब्जेक्ट का नाम: 'System.Net.Sockets.NetworkStream'।

at System.Net.WebConnection.Read (System.Net.HttpWebRequest request, System.Byte[] buffer, System.Int32 offset, System.Int32 size) [0x0001f] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/System/System.Net/WebConnection.cs:1038 
    at System.Net.WebSockets.ClientWebSocket+<ReceiveAsync>c__AnonStorey5.<>m__0() [0x0017c] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/System/System.Net.WebSockets/ClientWebSocket.cs:259 
    at System.Threading.Tasks.Task`1[TResult].InnerInvoke() [0x00012] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/threading/Tasks/Future.cs:680 
    at System.Threading.Tasks.Task.Execute() [0x00016] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/threading/Tasks/Task.cs:2502 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x00047] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:187 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x0002e] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:156 
    at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x0000b] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:128 
    at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult() [0x00000] in /private/tmp/source-mono-4.6.0-c8sr0/bockbuild-mono-4.6.0-branch-c8sr0/profiles/mono-mac-xamarin/build-root/mono-x86/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357 
     at Test.MainClass+<RunLoop>c__async2.MoveNext() [0x001c0] in Program.cs:81 

ऐसा लगता है कि सॉकेट किसी तरह से निपटान हो रहा है लेकिन मुझे नहीं पता कि क्यों और कहाँ। एक ही कोड गैर सुरक्षित websockets ("ws: //echo.websocket.org") के लिए ठीक काम करता है।

वेबस्केट का भी प्रयास किया। पोर्टेबल कार्यान्वयन लेकिन लगभग एक ही समस्या थी। गैर सुरक्षित websockets के लिए यह ठीक काम किया लेकिन सुरक्षित websockets के लिए OnMessage घटना कभी नहीं कहा गया था। https://github.com/NVentimiglia/WebSocket.Portable

+0

वही कोड Wss के लिए विंडोज़ पर ठीक काम करता है। –

+0

अनुरोध के बाद सर्वर पक्ष 'फ्रेम 9 852: तार पर 103 बाइट्स (824 बिट्स), इंटरफेस पर 103 बाइट कैप्चर (824 बिट्स) पर 0/ईथरनेट II, एसआरसी: सौरफला_07: डी: एफसी (00: 0 एफ : 53: 07: डी: एफसी), डीएसटी: ऐप्पल_एए: 05: डी 8 (68: 5 बी: 35: एए: 05: डी 8) इंटरनेट प्रोटोकॉल संस्करण 4, एसआरसी: 54.77.29.155, डीएसटी: 10.40.131.187 ट्रांसमिशन कंट्रोल प्रोटोकॉल, src पोर्ट: 443, डीएसटी पोर्ट: 52,146, Seq: 5121, Ack: 1038, लेन: 37 सिक्योर सॉकेट लेयर TLSv1 रिकार्ड परत: एनक्रिप्टेड चेतावनी सामग्री प्रकार: चेतावनी (21) संस्करण: TLS 1.0 (0x0301) लंबाई: 32 चेतावनी संदेश: एन्क्रिप्टेड अले आरटी' –

+0

क्या आप अपनी समस्या के लिए एक समाधान ढूंढने में कामयाब रहे? मुझे एक समान समस्या है, मैं केवल गैर सुरक्षित प्रोटोकॉल का उपयोग कर कनेक्ट कर सकता हूं और मुझे यकीन नहीं है कि मेरे एक्समरिन ऐप्स के लिए वेबसाकेट इंफ्रास्ट्रक्चर का चयन करना क्या है। – Cosmin

उत्तर

0

मुझे इस मुद्दे के लिए एक समाधान मिला। मैंने SocketRocker का उपयोग किया जो एक उद्देश्य सी कार्यान्वयन है। स्क्वायर.SocketRocket देशी उद्देश्य सी पुस्तकालय के लिए एक एक्समरिन रैपर है। GitHub पर आपको नमूना निर्देशिका में कुछ उदाहरण भी मिलेंगे।

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