2016-10-28 24 views
5

Osxで安全なWebソケットクライアントを実装する際に問題が発生しています。 System.Net.WebSocketsからClientWebSocketを使用しています。ここではいくつかのテストコードは次のとおりです。Xamarin Mono 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 

ソケットは、何らかの形で配置されてきているように見えますが、私は考え、なぜ、どこを持っていません。セキュリティで保護されていないWebソケット( "ws://echo.websocket.org")でも同じコードが正常に動作します。

WebSocket.Portable実装も試しましたが、ほとんど同じ問題がありました。非安全なWebソケットの場合はうまくいきましたが、安全なWebソケットの場合、OnMessageイベントは呼び出されませんでした。 https://github.com/NVentimiglia/WebSocket.Portable

+0

同じコードがwssのウィンドウで正常に動作します。 –

+0

要求後、サーバ側で警告があります フレーム9852:103バイトのワイヤ(824ビット)、103バイトのキャプチャ(824ビット)、インターフェイス0 イーサネットII、Src:Solarfla_07:de:fc(00:0f :53:07:de:fc)、Dst:Apple_aa:05:d8(68:5b:35:aa:05:d8) インターネットプロトコルバージョン4、Src:54.77.29.155、Dst:10.40.131.187 トランスミッションコントロールTLSv1レコード層:暗号化された警告 コンテンツタイプ:アラート(21) バージョン:TLS 1.0(0x0301) 長さ:32 アラートメッセージ:暗号化されたエールrt' –

+0

あなたの問題の回避策を見つけることができましたか?私は同様の問題を抱えています。私は非セキュアなプロトコルを使用してしか接続できませんし、WebSocketインフラストラクチャが自分のXamarinアプリケーションのために選択するのかよく分かりません。 – Cosmin

答えて

0

この問題の回避方法が見つかりました。 Objective Cの実装であるSocketRockerを使用しました。 Square.SocketRocketは、ネイティブObjective CライブラリのXamarinラッパーです。 GitHubには、サンプルディレクトリにいくつかの例があります。

関連する問題