Example #1
0
 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);
         }
     }
 }
Example #2
0
        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);
        }
Example #3
0
        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);
                    }
                }
            }
        }