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) { } } }
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); } }
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); }
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(); }
//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); } } }
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(); } }
public async Task CloseAsync(WebSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) { await _ws.CloseAsync(closeStatus, statusDescription, cancellationToken).ConfigureAwait(false); }
/// <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, }); } }
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, }); } } }
public async Task DisconnectAsync() { await _ws.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None); Close(null); }