Пример #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
 public void Dispose()
 {
     if (_clientWebSocket.State == WebSocketState.Open)
     {
         _clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
     }
     _clientWebSocket.Dispose();
 }
        public async Task InvokeClosedAsync()
        {
            if (State != SocketIOState.Closed)
            {
                State = SocketIOState.Closed;
                await _socket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, _tokenSource.Token);

                _tokenSource.Cancel();
                OnClosed?.Invoke(ServerCloseReason.ClosedByServer);
            }
        }
Пример #4
0
        private async Task <string> ReceiveFirst()
        {
            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');
                    if (text.StartsWith("hostKey@"))
                    {
                        return(text.Replace("hostKey@", ""));
                    }
                    return(string.Empty);
                }
            }
            return(string.Empty);
        }
Пример #5
0
 public async Task Close()
 {
     if (ws != null)
     {
         try
         {
             await ws.CloseAsync(System.Net.WebSockets.WebSocketCloseStatus.Empty, "", src.Token);
         }
         catch (Exception)
         {
         }
         //ws.Dispose();
         //ws = null;
     }
     src.Cancel();
 }
Пример #6
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);
                }
            }
        }
Пример #7
0
        private async Task WatchForMessagesFromServer()
        {
            var buffer = new byte[ReceiveChunkSize];

            try
            {
                while (_clientWebSocket.State == WebSocketState.Open)
                {
                    var stringResult = new StringBuilder();


                    WebSocketReceiveResult result;
                    do
                    {
                        result = await _clientWebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), _cancellationToken);

                        if (result.MessageType == WebSocketMessageType.Close)
                        {
                            await _clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);

                            CallOnDisconnected();
                        }
                        else
                        {
                            var str = Encoding.UTF8.GetString(buffer, 0, result.Count);
                            stringResult.Append(str);
                        }
                    } while (!result.EndOfMessage);

                    CallOnMessage(stringResult);
                }
            }
            catch (Exception)
            {
                CallOnDisconnected();
            }
            finally
            {
                _clientWebSocket.Dispose();
            }
        }
Пример #8
0
 public async Task CloseAsync(WebSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken)
 {
     await _ws.CloseAsync(closeStatus, statusDescription, cancellationToken).ConfigureAwait(false);
 }
Пример #9
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,
                });
            }
        }
Пример #10
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,
                    });
                }
            }
        }
Пример #11
0
        public async Task DisconnectAsync()
        {
            await _ws.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);

            Close(null);
        }