Esempio n. 1
0
        public override int Read(byte[] buffer, int offset, int count)
        {
            // TODO: Cancellation
            // Block
            WebSocketReceiveTuple result = receiveAsync(new ArraySegment <byte>(buffer, offset, count), CancellationToken.None).Result;

            // Check for close
            if (result.Item1 == closeCode)
            {
                // End of incoming data, expect future reads to fail.
                return(0);
            }
            return(result.Item3.Value); // read
        }
Esempio n. 2
0
        private void ContinueReceiving(WebSocketReceiveTuple receiveData)
        {
            try
            {
                while (!_cts.Token.IsCancellationRequested)
                {
                    if (receiveData != null)
                    {
                        goto process;
                    }

                    var receiveTask = _receiveAsync(_buffer, _cts.Token);

                    if (!receiveTask.IsCompleted)
                    {
                        receiveTask
                        .Then((Action <WebSocketReceiveTuple>)ContinueReceiving)
                        .Catch(ErrorReceiving);

                        return;
                    }

                    receiveData = receiveTask.Result;

process:
                    var messageType = (WebSocketMessageType)receiveData.Item1;
                    bool endOfMessage = receiveData.Item2;
                    int? count        = receiveData.Item3;

                    receiveData = null;

                    if (messageType == WebSocketMessageType.Text)
                    {
                        if (count.HasValue)
                        {
                            var text = Encoding.UTF8.GetString(_buffer.Array, 0, count.Value);
                            if (_text != null)
                            {
                                _text += text;
                            }
                            else
                            {
                                _text = text;
                            }
                        }

                        if (endOfMessage)
                        {
                            var text = _text;

                            _text = null;

                            if (OnMessage != null)
                            {
                                OnMessage(text);
                            }
                        }

                        continue;
                    }

                    if (messageType == WebSocketMessageType.Close)
                    {
                        if (OnClose != null)
                        {
                            OnClose();
                        }

                        return;
                    }

                    throw new InvalidOperationException("Unexpected websocket message type");
                }
            }
            catch (Exception ex)
            {
                ErrorReceiving(ex);
            }
        }