private void AfterConnect(Task task) { if (task.IsCompleted) { if (_ClientWs.State == WebSocketState.Open) { Task.Run(() => { Task.Run(() => DataReceiver(), _Token); ServerConnected?.Invoke(this, EventArgs.Empty); }, _Token); } else { if (DisconnectEventConnecting) { ServerDisconnected?.Invoke(this, EventArgs.Empty); InternalServerDisconnected?.Invoke(this, EventArgs.Empty); } } } else { if (DisconnectEventConnecting) { ServerDisconnected?.Invoke(this, EventArgs.Empty); InternalServerDisconnected?.Invoke(this, EventArgs.Empty); } } }
private async Task DataReceiver() { try { while (true) { if (_Token.IsCancellationRequested) { break; } MessageReceivedEventArgs msg = await MessageReadAsync(); if (msg != null) { if (EnableStatistics) { _Stats.IncrementReceivedMessages(); _Stats.AddReceivedBytes(msg.Data.Length); } Task internal_unawaited = Task.Run(() => InternalMessageReceived?.Invoke(this, msg), _Token); if (msg.MessageType != WebSocketMessageType.Close) { Task unawaited = Task.Run(() => MessageReceived?.Invoke(this, msg), _Token); } } } } catch (OperationCanceledException) { Logger?.Invoke(_Header + "data receiver canceled"); } catch (WebSocketException) { Logger?.Invoke(_Header + "websocket disconnected"); } catch (Exception e) { Logger?.Invoke(_Header + "exception: " + Environment.NewLine + e.ToString()); } ServerDisconnected?.Invoke(this, EventArgs.Empty); InternalServerDisconnected?.Invoke(this, EventArgs.Empty); }
private async Task <bool> MessageWriteAsync(byte[] data, WebSocketMessageType msgType, CancellationToken token) { bool disconnectDetected = false; using (CancellationTokenSource linkedCts = CancellationTokenSource.CreateLinkedTokenSource(_Token, token)) { try { if (_ClientWs == null || _ClientWs.State != WebSocketState.Open) { Logger?.Invoke(_Header + "not connected"); disconnectDetected = true; return(false); } await _SendLock.WaitAsync(_Token); try { await _ClientWs.SendAsync(new ArraySegment <byte>(data, 0, data.Length), msgType, true, token); } catch { } finally { _SendLock.Release(); } if (EnableStatistics) { _Stats.IncrementSentMessages(); _Stats.AddSentBytes(data.Length); } return(true); } catch (TaskCanceledException) { if (_Token.IsCancellationRequested) { Logger?.Invoke(_Header + "canceled"); disconnectDetected = true; } else if (token.IsCancellationRequested) { Logger?.Invoke(_Header + "message send canceled"); } return(false); } catch (OperationCanceledException) { if (_Token.IsCancellationRequested) { Logger?.Invoke(_Header + "canceled"); disconnectDetected = true; } else if (token.IsCancellationRequested) { Logger?.Invoke(_Header + "message send canceled"); } return(false); } catch (WebSocketException) { Logger?.Invoke(_Header + "websocket disconnected"); disconnectDetected = true; return(false); } catch (ObjectDisposedException) { Logger?.Invoke(_Header + "disposed"); disconnectDetected = true; return(false); } catch (SocketException) { Logger?.Invoke(_Header + "socket disconnected"); disconnectDetected = true; return(false); } catch (InvalidOperationException) { Logger?.Invoke(_Header + "disconnected due to invalid operation"); disconnectDetected = true; return(false); } catch (IOException) { Logger?.Invoke(_Header + "IO disconnected"); disconnectDetected = true; return(false); } catch (Exception e) { Logger?.Invoke(_Header + "exception: " + Environment.NewLine + e.ToString()); disconnectDetected = true; return(false); } finally { if (disconnectDetected) { Dispose(); ServerDisconnected?.Invoke(this, EventArgs.Empty); InternalServerDisconnected?.Invoke(this, EventArgs.Empty); } } } }