示例#1
0
        private void ListenWorkerThread()
        {
            ArraySegment <byte> receiveBuffer = new ArraySegment <byte>(new byte[receiveChunkSize]);
            bool                   wasClosed  = true;
            TimeSpan               keepAlive  = webSocket.Options.KeepAliveInterval;
            MemoryStream           stream     = new MemoryStream();
            WebSocketReceiveResult result;

            while (!disposed)
            {
                try
                {
                    if (wasClosed)
                    {
                        // re-open the socket
                        wasClosed = false;
                        webSocket = new ClientWebSocket();
                        webSocket.ConnectAsync(uri, CancellationToken.None).GetAwaiter().GetResult();
                        QueueActionWithNoExceptions(onConnected);
                    }

                    while (webSocket.State == WebSocketState.Open)
                    {
                        do
                        {
                            result = webSocket.ReceiveAsync(receiveBuffer, cancellationToken).GetAwaiter().GetResult();
                            if (result.MessageType == WebSocketMessageType.Close)
                            {
                                webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None).GetAwaiter().GetResult();
                                QueueAction(onDisconnected);
                            }
                            else
                            {
                                stream.Write(receiveBuffer.Array, 0, result.Count);
                            }
                        }while (!result.EndOfMessage);
                        if (stream.Length != 0)
                        {
                            // make a copy of the bytes, the memory stream will be re-used and could potentially corrupt in multi-threaded environments
                            byte[] bytesCopy = new byte[stream.Length];
                            Array.Copy(stream.GetBuffer(), bytesCopy, stream.Length);
                            stream.SetLength(0);
                            messageQueue.Add(bytesCopy);
                        }
                    }
                }
                catch
                {
                    QueueAction(onDisconnected);
                    if (!disposed)
                    {
                        // wait one half second before attempting reconnect
                        Task.Delay(500).ConfigureAwait(false).GetAwaiter().GetResult();
                    }
                }
                finally
                {
                    wasClosed = true;
                    try
                    {
                        webSocket.Dispose();
                    }
                    catch
                    {
                    }
                }
            }
        }
示例#2
0
        private async Task ListenWorkerThread()
        {
            ArraySegment <byte>    receiveBuffer = new ArraySegment <byte>(new byte[receiveChunkSize]);
            TimeSpan               keepAlive     = webSocket.Options.KeepAliveInterval;
            MemoryStream           stream        = new MemoryStream();
            WebSocketReceiveResult result;
            bool wasConnected = false;

            while (!disposed)
            {
                try
                {
                    // open the socket
                    webSocket.Options.KeepAliveInterval = KeepAlive;
                    wasConnected = false;
                    await webSocket.ConnectAsync(Uri, cancellationToken);

                    wasConnected = true;

                    // on connect may make additional calls that must succeed, such as rest calls
                    // for lists, etc.
                    QueueActionsWithNoExceptions(Connected);

                    while (webSocket.State == WebSocketState.Open)
                    {
                        do
                        {
                            result = await webSocket.ReceiveAsync(receiveBuffer, cancellationToken);

                            if (result.MessageType == WebSocketMessageType.Close)
                            {
                                await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken);

                                QueueActions(Disconnected);
                            }
                            else
                            {
                                stream.Write(receiveBuffer.Array, 0, result.Count);
                            }
                        }while (!result.EndOfMessage);
                        if (stream.Length != 0)
                        {
                            // make a copy of the bytes, the memory stream will be re-used and could potentially corrupt in multi-threaded environments
                            byte[] bytesCopy = new byte[stream.Length];
                            Array.Copy(stream.GetBuffer(), bytesCopy, stream.Length);
                            stream.SetLength(0);
                            messageQueue.Add(bytesCopy);
                        }
                    }
                }
                catch
                {
                    // eat exceptions, most likely a result of a disconnect, either way we will re-create the web socket
                }

                if (wasConnected)
                {
                    QueueActions(Disconnected);
                }
                try
                {
                    webSocket.Dispose();
                }
                catch
                {
                }
                if (!disposed)
                {
                    // wait 5 seconds before attempting reconnect
                    webSocket = new ClientWebSocket();
                    await Task.Delay(5000);
                }
            }
        }
示例#3
0
        private void ListenWorkerThread()
        {
            ArraySegment <byte> receiveBuffer = new ArraySegment <byte>(new byte[receiveChunkSize]);
            bool         wasClosed            = true;
            TimeSpan     keepAlive            = _ws.Options.KeepAliveInterval;
            MemoryStream stream = new MemoryStream();

            while (!_disposed)
            {
                try
                {
                    if (wasClosed)
                    {
                        // re-open the socket
                        wasClosed = false;
                        _ws       = new ClientWebSocket();
                        _ws.ConnectAsync(_uri, CancellationToken.None).Wait();
                        QueueActionWithNoExceptions(_onConnected);
                    }

                    while (_ws.State == WebSocketState.Open)
                    {
                        Task <WebSocketReceiveResult> result;
                        do
                        {
                            result = _ws.ReceiveAsync(receiveBuffer, _cancellationToken);
                            result.Wait();
                            if (result.Result.MessageType == WebSocketMessageType.Close)
                            {
                                _ws.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None).Wait();
                                QueueAction(_onDisconnected);
                            }
                            else
                            {
                                stream.Write(receiveBuffer.Array, 0, result.Result.Count);
                            }
                        }while (!result.Result.EndOfMessage);
                        if (stream.Length != 0)
                        {
                            string messageString = Encoding.UTF8.GetString(stream.GetBuffer(), 0, (int)stream.Length);
                            stream.SetLength(0);
                            _messageQueue.Add(messageString);
                        }
                    }
                }
                catch
                {
                    QueueAction(_onDisconnected);
                    if (!_disposed)
                    {
                        // wait one half second before attempting reconnect
                        Task.Delay(500).Wait();
                    }
                }
                finally
                {
                    wasClosed = true;
                    try
                    {
                        _ws.Dispose();
                    }
                    catch
                    {
                    }
                }
            }
        }