コード例 #1
0
        private static async Task Receive(ClientWebSocket webSocket, Action <string> receiveAction)
        {
            byte[] buffer = new byte[2048];
            while (webSocket.State == WebSocketState.Open)
            {
                try
                {
                    var result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

                    if (result.MessageType == WebSocketMessageType.Close)
                    {
                        await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                    }
                    else
                    {
                        var text = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
                        if (!text.StartsWith("@hello@"))
                        {
                            var arr = text.Split(new string[] { "@_@" }, StringSplitOptions.None);
                            receiveAction("*" + arr[0]);
                        }
                    }
                }
                catch (Exception)
                {
                }
            }
        }
コード例 #2
0
ファイル: PuppeteerBrowser.cs プロジェクト: try1975/RegBot
        private static async Task <WebSocket> WebSocketFactory(Uri url, IConnectionOptions options, CancellationToken cancellationToken)
        {
            var ws = new System.Net.WebSockets.Managed.ClientWebSocket();
            await ws.ConnectAsync(url, cancellationToken);

            return(ws);
        }
コード例 #3
0
        /// <summary>
        /// Connects to the WebSocket server.
        /// </summary>
        /// <param name="uri">The URI of the WebSocket server.</param>
        /// <param name="customHeaders">Custom headers to send with the request.</param>
        /// <returns></returns>
        public override async Task ConnectAsync(Uri uri, IReadOnlyDictionary <string, string> customHeaders = null)
        {
            SocketMessageQueue = new ConcurrentQueue <string>();
            TokenSource        = new CancellationTokenSource();

            StreamDecompressor?.Dispose();
            CompressedStream?.Dispose();
            DecompressedStream?.Dispose();

            DecompressedStream = new MemoryStream();
            CompressedStream   = new MemoryStream();
            StreamDecompressor = new DeflateStream(CompressedStream, CompressionMode.Decompress);

            Socket = new System.Net.WebSockets.Managed.ClientWebSocket();

            Socket.Options.KeepAliveInterval = TimeSpan.FromSeconds(20);
            if (Proxy != null) // because mono doesn't implement this properly
            {
                Socket.Options.Proxy = Proxy;
            }

            if (customHeaders != null)
            {
                foreach (var kvp in customHeaders)
                {
                    Socket.Options.SetRequestHeader(kvp.Key, kvp.Value);
                }
            }

            await Socket.ConnectAsync(uri, Token).ConfigureAwait(false);

            await OnConnectedAsync().ConfigureAwait(false);

            WsListener = Task.Run(ListenAsync, Token);
        }
コード例 #4
0
ファイル: WebSocketHelper.cs プロジェクト: yuzd/AntDeploy
        public async Task <string> Connect(string uri)
        {
            string key = string.Empty;

            try
            {
                webSocket = new System.Net.WebSockets.Managed.ClientWebSocket();
                await webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);

                key = await ReceiveFirst();

                receiveAction.Debug(!string.IsNullOrEmpty(key)
                    ? $"WebSocket Connect Success:{key},Server excute logs will accept from websocket"
                    : $"WebSocket Connect Fail,Server excute logs will accept from http request");
                if (!string.IsNullOrEmpty(key))
                {
                    mDetectionTimer = new System.Threading.Timer(Ping, null, 1000 * 2, 1000 * 2);
                }
                new Task(async() =>
                {
                    try
                    {
                        await Receive();
                    }
                    catch (Exception)
                    {
                        try
                        {
                            webSocket.Dispose();
                        }
                        catch (Exception)
                        {
                        }
                    }
                }).Start();

                new Task(() =>
                {
                    try
                    {
                        ReceiveHttp();
                    }
                    catch (Exception)
                    {
                    }
                }).Start();
            }
            catch (Exception e)
            {
                //ignore
                receiveAction.Debug($"WebSocket Connect[{uri}] Fail:" + e);
                receiveAction.Debug($"WebSocket Connect Fail,Server excute logs will accept from http request");
            }
            if (string.IsNullOrEmpty(key))
            {
                key = await ReceiveFirst();
            }
            return(key);
        }
コード例 #5
0
        public WebSocketWrapper(System.Net.WebSockets.Managed.ClientWebSocket clientWebSocket, Uri uri)
        {
            _clientWebSocket = clientWebSocket;
            Uri = uri;
            _cancellationToken = _cancellationTokenSource.Token;

            if (_clientWebSocket.State == WebSocketState.None)
            {
                _clientWebSocket.Options.KeepAliveInterval = TimeSpan.FromSeconds(20);
            }
        }
コード例 #6
0
        public WebSocket(Uri url)
        {
            serverUri = url;

            string protocol = serverUri.Scheme;

            if (!protocol.Equals("ws") && !protocol.Equals("wss"))
            {
                throw new ArgumentException("Unsupported protocol: " + protocol);
            }

            ws = new ClientWebSocket();
        }
コード例 #7
0
ファイル: WebSocketClient.cs プロジェクト: fatkulamri/openrpa
        public async Task Connect()
        {
            try
            {
                Log.Network("Connecting to " + url);
                //if (ws != null && (ws.State == System.Net.WebSockets.WebSocketState.Aborted || ws.State == System.Net.WebSockets.WebSocketState.Closed))
                if (ws != null && (ws.State != WebSocketState.Connecting))
                {
                    ws.Dispose();
                    ws = null;
                }
                if (ws == null)
                {
                    // ws = (ClientWebSocket)SystemClientWebSocket.CreateClientWebSocket();
                    if (VersionHelper.IsWindows8OrGreater())
                    {
                        ws = new ClientWebSocket();
                    }
                    else
                    {
                        ws = new System.Net.WebSockets.Managed.ClientWebSocket();
                    }
                    src = new CancellationTokenSource();
                }
                if (ws.State == System.Net.WebSockets.WebSocketState.Connecting || ws.State == System.Net.WebSockets.WebSocketState.Open)
                {
                    return;
                }
                if (ws.State == System.Net.WebSockets.WebSocketState.CloseReceived)
                {
                    OnClose?.Invoke("Socket closing");
                    ws.Dispose();
                    ws = null;
                    return;
                }
                Log.Information("Connecting to " + url);
                await ws.ConnectAsync(new Uri(url), src.Token);

                Log.Information("Connected to " + url);
                tempbuffer = "";
                Task receiveTask = Task.Run(async() => await receiveLoop(), src.Token);
                Task pingTask    = Task.Run(async() => await PingLoop(), src.Token);
                OnOpen?.Invoke();
            }
            catch (Exception ex)
            {
                Log.Error(ex, "");
                OnClose?.Invoke(ex.Message);
            }
        }
コード例 #8
0
 public static async Task SendText(ClientWebSocket webSocket, string text)
 {
     try
     {
         if (webSocket != null && webSocket.State == WebSocketState.Open)
         {
             ArraySegment <byte> textBytes = new ArraySegment <byte>(Encoding.UTF8.GetBytes(text));
             await webSocket.SendAsync(textBytes, WebSocketMessageType.Text, true, CancellationToken.None);
         }
     }
     catch (Exception)
     {
     }
 }
コード例 #9
0
 private static WebSocket CreateWebSocket(TimeSpan keepAliveInterval)
 {
     if (SystemClientWebSocket.ManagedWebSocketRequired)
     {
         var ws = new System.Net.WebSockets.Managed.ClientWebSocket();
         ws.Options.KeepAliveInterval = keepAliveInterval;
         return(ws);
     }
     else
     {
         var ws = new System.Net.WebSockets.Managed.ClientWebSocket();
         ws.Options.KeepAliveInterval = keepAliveInterval;
         return(ws);
     }
 }
コード例 #10
0
        private void ResetState()
        {
            _status      = FrameState.First;
            _host        = null;
            _ws          = null;
            _receiveTask = null;
            _rest.Clear();
            _result.Clear();
            Status = ServiceStatus.Stopped;

            lock (_cacheLocker)
            {
                _cache.Clear();
            }
        }
コード例 #11
0
        private async Task <Browser> CreateWebBrowser(string ChromePath)
        {
            async Task <WebSocket> CreateWebSocketTask(Uri url, IConnectionOptions options, CancellationToken cancellationToken)
            {
                var result = new System.Net.WebSockets.Managed.ClientWebSocket();

                result.Options.KeepAliveInterval = TimeSpan.Zero;
                await result.ConnectAsync(url, cancellationToken).ConfigureAwait(false);

                return(result);
            }

            var downloadChrome = string.IsNullOrEmpty(ChromePath) || !File.Exists(ChromePath);

            if (downloadChrome)
            {
                Debug.Write("downloading Chrome...");
                var browserFetcherOptions = new BrowserFetcherOptions
                {
                    Path     = $"{AppDomain.CurrentDomain.BaseDirectory}",
                    Platform = Platform.Win64,
                    Product  = Product.Chrome
                };
                var browserFetcher = new BrowserFetcher(browserFetcherOptions);
                var revisionInfo   = await browserFetcher.DownloadAsync();

                ChromePath = revisionInfo.ExecutablePath;  // set the created chrome path
                Debug.WriteLine("done!");
            }

            var launchOptions = new LaunchOptions
            {
                Headless          = false,
                Timeout           = (10 * 1000), // 10 sec
                ExecutablePath    = ChromePath,  /// $"{AppDomain.CurrentDomain.BaseDirectory}Win64-884014\\chrome-win\\chrome.exe",
                DefaultViewport   = null,        // max resolution
                IgnoreHTTPSErrors = true,
                Args = new[] { "--no-sandbox", "--disable-gpu" }  // "--window-size=800,1080"
            };

            if (Environment.OSVersion.Version.Major < 10)
            {
                launchOptions.WebSocketFactory = CreateWebSocketTask;  // support for windows-7
            }
            var browser = await Puppeteer.LaunchAsync(launchOptions);

            return(browser);
        }
コード例 #12
0
        //private static UTF8Encoding encoding = new UTF8Encoding();

        public static async Task <ClientWebSocket> Connect(string uri, Action <string> receiveAction, HttpLogger loggerKey = null)
        {
            ClientWebSocket webSocket = null;

            try
            {
                webSocket = new System.Net.WebSockets.Managed.ClientWebSocket();
                await webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);
                await ReceiveFirst(webSocket, receiveAction);

                new Task(async() =>
                {
                    try
                    {
                        await Receive(webSocket, receiveAction);
                    }
                    catch (Exception)
                    {
                        try
                        {
                            webSocket.Dispose();
                        }
                        catch (Exception)
                        {
                        }
                    }
                }).Start();

                new Task(() =>
                {
                    try
                    {
                        ReceiveHttp(receiveAction, loggerKey);
                    }
                    catch (Exception)
                    {
                    }
                }).Start();
            }
            catch (Exception ex)
            {
                //ignore
            }

            return(webSocket);
        }
コード例 #13
0
 public Task CloseAsync()
 {
     if (_socket == null)
     {
         throw new InvalidOperationException("Close failed, must connect first.");
     }
     else
     {
         _tokenSource.Cancel();
         _tokenSource.Dispose();
         _socket.Abort();
         _socket.Dispose();
         _socket = null;
         OnClosed?.Invoke(ServerCloseReason.ClosedByClient);
         return(Task.CompletedTask);
     }
 }
コード例 #14
0
        //private static async Task Send(ClientWebSocket webSocket)
        //{

        //    while (webSocket.State == WebSocketState.Open)
        //    {
        //        string stringtoSend = Console.ReadLine();
        //        byte[] buffer = encoding.GetBytes(stringtoSend);

        //        await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Binary, false, CancellationToken.None);
        //        Console.WriteLine("Sent:     " + stringtoSend);

        //        await Task.Delay(1000);
        //    }
        //}

        private static async Task ReceiveFirst(ClientWebSocket webSocket, Action <string> receiveAction)
        {
            byte[] buffer = new byte[1024];
            if (webSocket.State == WebSocketState.Open)
            {
                var result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

                if (result.MessageType == WebSocketMessageType.Close)
                {
                    await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                }
                else
                {
                    var text = Encoding.UTF8.GetString(buffer).TrimEnd('\0');
                    receiveAction(text);
                }
            }
        }
コード例 #15
0
        public Task ConnectAsync()
        {
            _tokenSource = new CancellationTokenSource();
            Uri wsUri = _urlConverter.HttpToWs(_uri, EIO.ToString(), Path, Parameters);

            if (_socket != null)
            {
                _socket.Dispose();
            }
            _socket = new System.Net.WebSockets.Managed.ClientWebSocket();
            bool executed = _socket.ConnectAsync(wsUri, CancellationToken.None).Wait(ConnectTimeout);

            if (!executed)
            {
                throw new TimeoutException();
            }
            Listen();
            return(Task.CompletedTask);
        }
コード例 #16
0
        static async Task TestConnection(string server)
        {
            using (var ws = new System.Net.WebSockets.Managed.ClientWebSocket())
            {
                await ws.ConnectAsync(new Uri(server), CancellationToken.None);

                var buffer   = new ArraySegment <byte>(new byte[1024]);
                var readTask = ws.ReceiveAsync(buffer, CancellationToken.None);

                const string msg     = "hello";
                var          testMsg = new ArraySegment <byte>(Encoding.UTF8.GetBytes(msg));
                await ws.SendAsync(testMsg, WebSocketMessageType.Text, true, CancellationToken.None);

                var read  = await readTask;
                var reply = Encoding.UTF8.GetString(buffer.Array, 0, read.Count);

                if (reply != msg)
                {
                    throw new Exception($"Expected to read back '{msg}' but got '{reply}' for server {server}");
                }
                Console.WriteLine("Success connecting to server " + server);
            }
        }
コード例 #17
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="uri"></param>
        /// <param name="options"></param>
        /// <exception cref="TimeoutException"></exception>
        /// <exception cref="WebSocketException"></exception>
        /// <returns></returns>
        public async Task ConnectAsync(Uri uri)
        {
            if (_ws != null)
            {
                _ws.Dispose();
            }
            _ws = new System.Net.WebSockets.Managed.ClientWebSocket();
            Config?.Invoke(_ws.Options);

            _wsWorkTokenSource = new CancellationTokenSource();
            var wsConnectionTokenSource = new CancellationTokenSource(_io.Options.ConnectionTimeout);

            try
            {
                await _ws.ConnectAsync(uri, wsConnectionTokenSource.Token);

                _ = Task.Run(ListenAsync);
            }
            catch (TaskCanceledException)
            {
                throw new TimeoutException();
            }
        }
コード例 #18
0
        //private async Task<WebSocketReceiveResult> SendCmdAsync(CdpMsg msg)
        private async Task <string> SendCmdAsync(CdpMsg msg)
        {
            try
            {
                using (ClientWebSocket ws = new ClientWebSocket())
                {
                    Log($"CdpClient.SendMsg(): Attempting to send cmd {msg.method}, port is {_chromeDebuggingPort}");

                    // load config
                    await CdpConfig.LoadConfigAsync().ConfigureAwait(false);

                    byte[] receiveBytes  = new byte[65536];
                    var    receiveBuffer = new ArraySegment <byte>(receiveBytes);
                    ws.Options.SetBuffer(65536, 65536);                     // (receive 64KB, send 64KB)

#if DEBUG
                    var tokenSource = new CancellationTokenSource(600000);                      // 10 mins
#else
                    var tokenSource = new CancellationTokenSource(10000);                       // 10 secs
#endif
                    CancellationToken cancellationToken = tokenSource.Token;

                    Uri wsUri;
                    if (msg.method.StartsWith("Browser"))
                    {
                        wsUri = this.CdpConfig.BrowserWsUri;
                    }
                    else
                    {
                        wsUri = this.CdpConfig.PageWsUri;
                    }

                    Log($"CdpClient.SendMsg(): Attempting to connect to uri {wsUri}, port is {_chromeDebuggingPort}...");
                    await ws.ConnectAsync(wsUri, cancellationToken).ConfigureAwait(false);

                    Log($"CdpClient.SendMsg(): ...Connected to to uri {wsUri}, port is {_chromeDebuggingPort}");

                    string json  = Json.Serialize <CdpMsg>(msg);
                    byte[] bytes = Encoding.UTF8.GetBytes(json);
                    ArraySegment <byte> sendBuffer = new ArraySegment <byte>(bytes);

                    Log($"About to send CDP cmd {msg.method} to port {_chromeDebuggingPort}...");
                    await ws.SendAsync(sendBuffer, WebSocketMessageType.Text, true, cancellationToken).ConfigureAwait(false);

                    WebSocketReceiveResult result = await ws.ReceiveAsync(receiveBuffer, cancellationToken).ConfigureAwait(false);

                    Log($"...received CDP result for cmd {msg.method}, result = {Json.Serialize(result)}, port is {_chromeDebuggingPort}");

                    // retrive result from buffer
                    if (result.MessageType != WebSocketMessageType.Text)
                    {
                        return($"Unexpected message type: {result.MessageType}");
                    }

                    string msgText = Encoding.UTF8.GetString(receiveBytes, 0, result.Count);
                    Log($"{msg.method}(): returned result {msgText}, port is {_chromeDebuggingPort}");

                    return(msgText);
                }
            }
            catch (Exception ex)
            {
                Log($"Exception occurred: {ex.ToString()}");
                return(null);
            }
        }
コード例 #19
0
 public ClientWebSocketManaged()
 {
     _ws       = new System.Net.WebSockets.Managed.ClientWebSocket();
     _sendLock = new SemaphoreSlim(1, 1);
 }
コード例 #20
0
 public DungeonCrawlWebSocketApi()
 {
     _clientWebSocket = new ClientWebSocket();
 }
コード例 #21
0
        private async Task <ResultModel <string> > DoFragmentAsr(byte[] data, FrameState state = FrameState.First)
        {
            try
            {
                if (_ws == null && _status == FrameState.First)
                {
                    _ws     = new ClientWebSocket();
                    _status = FrameState.First;
                    _host   = ApiAuthorization.BuildAuthUrl(_settings);

                    await _ws.ConnectAsync(new Uri(_host), CancellationToken.None);

                    if (_ws.State != WebSocketState.Open)
                    {
                        throw new Exception("Connect to xfyun api server failed.");
                    }
                    _receiveTask = StartReceiving(_ws);
                }

                //开始发送数据
                for (int i = 0; i < data.Length; i += _frameSize)
                {
                    byte[] buffer = null;
                    if (_rest.Length == 0)                //没有上次分片的数据
                    {
                        if (data.Length - i < _frameSize) //最后一帧不满一个完整的识别帧,那么加入缓存,下个分片的时候继续使用
                        {
                            if (state != FrameState.Last)
                            {
                                int length = data.Length - i;
                                Array.Copy(data, i, _rest.Cache, 0, length);
                                _rest.Length = length;
                            }
                            else
                            {
                                buffer  = SubArray(data, i, _frameSize);
                                _status = FrameState.Last;
                            }
                        }
                        else
                        {
                            buffer = SubArray(data, i, _frameSize);
                            if (state == FrameState.Last && data.Length - i == _frameSize)
                            {
                                _status = FrameState.Last;
                                if (buffer == null)
                                {
                                    buffer = new byte[1] {
                                        0
                                    };
                                }
                            }
                        }
                    }
                    else  //有上次分片的数据
                    {
                        if (data.Length + _rest.Length <= _frameSize)
                        {
                            buffer = new byte[_rest.Length + data.Length];
                            Array.Copy(_rest.Cache, 0, buffer, 0, _rest.Length);
                            //最后分片加上缓存不满一个帧大小的情况
                            Array.Copy(data, i, buffer, _rest.Length, data.Length);
                            _status = FrameState.Last;
                            i       = data.Length - _frameSize;
                        }
                        else
                        {
                            buffer = new byte[_frameSize];
                            Array.Copy(_rest.Cache, 0, buffer, 0, _rest.Length);
                            Array.Copy(data, i, buffer, _rest.Length, _frameSize - _rest.Length);
                            i -= _rest.Length;
                        }
                        _rest.Clear();  //清空
                    }

                    if (_rest.Length != 0)
                    {
                        break;
                    }

                    switch (_status)
                    {
                    case FrameState.First:
                        FirstFrameData firstFrame = new FirstFrameData
                        {
                            common   = _common,
                            business = _business,
                            data     = _data
                        };
                        firstFrame.data.status = FrameState.First;
                        firstFrame.data.audio  = System.Convert.ToBase64String(buffer);
                        await _ws.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(firstFrame)))
                                            , WebSocketMessageType.Text
                                            , true
                                            , CancellationToken.None);

                        _status = FrameState.Continue;
                        break;

                    case FrameState.Continue:      //中间帧
                        ContinueFrameData continueFrame = new ContinueFrameData
                        {
                            data = _data
                        };
                        continueFrame.data.status = FrameState.Continue;
                        continueFrame.data.audio  = System.Convert.ToBase64String(buffer);
                        await _ws.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(continueFrame)))
                                            , WebSocketMessageType.Text
                                            , true
                                            , CancellationToken.None);

                        break;

                    case FrameState.Last:        // 最后一帧音频
                        LastFrameData lastFrame = new LastFrameData
                        {
                            data = _data
                        };
                        lastFrame.data.status = FrameState.Last;
                        lastFrame.data.audio  = System.Convert.ToBase64String(buffer);
                        await _ws.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(lastFrame)))
                                            , WebSocketMessageType.Text
                                            , true
                                            , CancellationToken.None);

                        break;
                    }
                    await Task.Delay(_intervel);
                }

                if (state == FrameState.Last)
                {
                    while (_receiveTask.Status != TaskStatus.RanToCompletion)
                    {
                        await Task.Delay(10);
                    }
                    await _ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "NormalClosure", CancellationToken.None);
                }
                return(new ResultModel <string>()
                {
                    Code = ResultCode.Success,
                    Data = null,
                });
            }
            catch (Exception ex)
            {
                //服务器主动断开连接或者自动断开连接了
                if (ex.Message.ToLower().Contains("unable to read data from the transport connection"))
                {
                    try
                    {
                        await _ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "NormalClosure", CancellationToken.None);
                    }
                    catch { }
                    while (_receiveTask.Status != TaskStatus.RanToCompletion)
                    {
                        await Task.Delay(10);
                    }
                    return(new ResultModel <string>()
                    {
                        Code = ResultCode.Disconnect,
                        Message = "服务器主动断开连接,可能是整个会话是否已经超过了60s、读取数据超时、静默检测超时等原因引起的。",
                    });
                }
                else
                {
                    return(new ResultModel <string>()
                    {
                        Code = ResultCode.Error,
                        Message = ex.Message,
                    });
                }
            }
        }
コード例 #22
0
        /// <summary>
        /// 语音转写一个完整的音频文件
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public async Task <ResultModel <string> > ConvertAudio(byte[] data)
        {
            try
            {
                using (_ws = new ClientWebSocket())
                {
                    Status = ServiceStatus.Running;
                    _host  = ApiAuthorization.BuildAuthUrl(_settings);
                    await _ws.ConnectAsync(new Uri(_host), CancellationToken.None);

                    _receiveTask = StartReceiving(_ws);
                    //开始发送数据
                    for (int i = 0; i < data.Length; i += _frameSize)
                    {
                        byte[] buffer = SubArray(data, i, _frameSize);
                        if (buffer == null || data.Length - i < _frameSize)
                        {
                            _status = FrameState.Last;  //文件读完
                        }
                        switch (_status)
                        {
                        case FrameState.First:
                            FirstFrameData firstFrame = new FirstFrameData
                            {
                                common   = _common,
                                business = _business,
                                data     = _data
                            };
                            firstFrame.data.status = FrameState.First;
                            firstFrame.data.audio  = System.Convert.ToBase64String(buffer);
                            await _ws.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(firstFrame)))
                                                , WebSocketMessageType.Text
                                                , true
                                                , CancellationToken.None);

                            _status = FrameState.Continue;
                            break;

                        case FrameState.Continue:      //中间帧
                            ContinueFrameData continueFrame = new ContinueFrameData
                            {
                                data = _data
                            };
                            continueFrame.data.status = FrameState.Continue;
                            continueFrame.data.audio  = System.Convert.ToBase64String(buffer);
                            await _ws.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(continueFrame)))
                                                , WebSocketMessageType.Text
                                                , true
                                                , CancellationToken.None);

                            break;

                        case FrameState.Last:        // 最后一帧音频
                            LastFrameData lastFrame = new LastFrameData
                            {
                                data = _data
                            };
                            lastFrame.data.status = FrameState.Last;
                            lastFrame.data.audio  = System.Convert.ToBase64String(buffer);
                            await _ws.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(lastFrame)))
                                                , WebSocketMessageType.Text
                                                , true
                                                , CancellationToken.None);

                            break;
                        }
                        await Task.Delay(_intervel);
                    }

                    while (_receiveTask.Status != TaskStatus.RanToCompletion)
                    {
                        await Task.Delay(10);
                    }
                    await _ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "NormalClosure", CancellationToken.None);
                }

                StringBuilder result = new StringBuilder();
                foreach (var item in _result)
                {
                    result.Append(item.data);
                }
                ResetState();
                return(new ResultModel <string>()
                {
                    Code = ResultCode.Success,
                    Data = result.ToString(),
                });
            }
            catch (Exception ex)
            {
                return(new ResultModel <string>()
                {
                    Code = ResultCode.Error,
                    Message = ex.Message,
                });
            }
        }
コード例 #23
0
        private async Task StartReceiving(ClientWebSocket client)
        {
            if (_result != null)
            {
                _result.Clear();
            }

            //单次完整数据
            string msg = "";

            while (true)
            {
                try
                {
                    if (client.CloseStatus == WebSocketCloseStatus.EndpointUnavailable ||
                        client.CloseStatus == WebSocketCloseStatus.InternalServerError ||
                        client.CloseStatus == WebSocketCloseStatus.EndpointUnavailable)
                    {
                        return;
                    }

                    var array   = new byte[4096];
                    var receive = await client.ReceiveAsync(new ArraySegment <byte>(array), CancellationToken.None);

                    if (receive.MessageType == WebSocketMessageType.Text)
                    {
                        if (receive.Count <= 0)
                        {
                            continue;
                        }

                        //string msg = Encoding.UTF8.GetString(array, 0, receive.Count);
                        //在Winform中无法把json一次完整接收,需要判断EndOfMessage的状态。
                        //临时不完整数据
                        string tempMsg = Encoding.UTF8.GetString(array, 0, receive.Count);
                        msg += tempMsg;
                        if (receive.EndOfMessage == false)
                        {
                            continue;
                        }

                        ASRResult result = JsonSerializer.Deserialize <ASRResult>(msg, new JsonSerializerOptions()
                        {
                            PropertyNameCaseInsensitive = true
                        });

                        //清空数据
                        msg = "";

                        if (result.Code != 0)
                        {
                            throw new Exception($"Result error({result.Code}): {result.Message}");
                        }
                        if (result.Data == null ||
                            result.Data.result == null ||
                            result.Data.result.ws == null)
                        {
                            return;
                        }
                        //分析数据
                        StringBuilder itemStringBuilder = new StringBuilder();
                        foreach (var item in result.Data.result.ws)
                        {
                            foreach (var child in item.cw)
                            {
                                if (string.IsNullOrEmpty(child.w))
                                {
                                    continue;
                                }
                                itemStringBuilder.Append(child.w);
                            }
                        }
                        if (result.Data.result.pgs == "apd")
                        {
                            _result.Add(new ResultWPGSInfo()
                            {
                                sn   = result.Data.result.sn,
                                data = itemStringBuilder.ToString()
                            });
                        }
                        else if (result.Data.result.pgs == "rpl")
                        {
                            if (result.Data.result.rg == null || result.Data.result.rg.Count != 2)
                            {
                                continue;
                            }
                            int first = result.Data.result.rg[0];
                            int end   = result.Data.result.rg[1];
                            try
                            {
                                ResultWPGSInfo item = _result.Where(p => p.sn >= first && p.sn <= end).SingleOrDefault();
                                if (item == null)
                                {
                                    continue;
                                }
                                else
                                {
                                    item.sn   = result.Data.result.sn;
                                    item.data = itemStringBuilder.ToString();
                                }
                            }
                            catch
                            {
                                continue;
                            }
                        }

                        StringBuilder totalStringBuilder = new StringBuilder();
                        foreach (var item in _result)
                        {
                            totalStringBuilder.Append(item.data);
                        }

                        OnMessage?.Invoke(this, totalStringBuilder.ToString());
                        //最后一帧,结束
                        if (result.Data.status == 2)
                        {
                            return;
                        }
                    }
                }
                catch (WebSocketException)
                {
                    return;
                }
                catch (Exception ex)
                {
                    //服务器主动断开连接
                    if (!ex.Message.ToLower().Contains("unable to read data from the transport connection"))
                    {
                        OnError?.Invoke(this, new ErrorEventArgs()
                        {
                            Code      = ResultCode.Error,
                            Message   = ex.Message,
                            Exception = ex,
                        });
                    }
                    return;
                }
            }
        }