public void SendNow(WebSocketFrame frame)
        {
            if (frame == null)
            {
                throw new ArgumentNullException("frame is null!");
            }

            if (closed || closeSent)
            {
                return;
            }

            byte[] rawData = frame.Get();
            Stream.Write(rawData, 0, rawData.Length);
            Stream.Flush();
        }
예제 #2
0
        /// <summary>
        /// It will send the given frame to the server.
        /// </summary>
        public void Send(WebSocketFrame frame)
        {
            if (frame == null)
            {
                throw new ArgumentNullException("frame is null!");
            }

            if (closed)
            {
                return;
            }

            byte[] rawData = frame.Get();
            lock (SendLock)
            {
                Stream.Write(rawData, 0, rawData.Length);
                Stream.Flush();

                if (frame.Type == WebSocketFrameTypes.ConnectionClose)
                {
                    closeSent = true;
                }
            }
        }
예제 #3
0
        private void SendThreadFunc(object param)
        {
            List <WebSocketFrame> localFrames = new List <WebSocketFrame>();

            try
            {
                while (!closed && !closeSent)
                {
                    if (HTTPManager.Logger.Level <= Logger.Loglevels.Information)
                    {
                        HTTPManager.Logger.Information("WebSocketResponse", "SendThread - Waiting...");
                    }
                    newFrameSignal.WaitOne();

                    try
                    {
                        lock (SendLock)
                        {
                            // add frames reversed in order
                            for (int i = this.unsentFrames.Count - 1; i >= 0; --i)
                            {
                                localFrames.Add(this.unsentFrames[i]);
                            }

                            this.unsentFrames.Clear();
                        }

                        if (HTTPManager.Logger.Level <= Logger.Loglevels.Information)
                        {
                            HTTPManager.Logger.Information("WebSocketResponse", "SendThread - Wait is over, " + localFrames.Count.ToString() + " new frames!");
                        }

                        while (localFrames.Count > 0)
                        {
                            WebSocketFrame frame = localFrames[localFrames.Count - 1];
                            localFrames.RemoveAt(localFrames.Count - 1);

                            if (!closeSent)
                            {
                                byte[] rawData = frame.Get();
                                Stream.Write(rawData, 0, rawData.Length);
                                Stream.Flush();

                                if (frame.Type == WebSocketFrameTypes.ConnectionClose)
                                {
                                    closeSent = true;
                                }
                            }

                            Interlocked.Add(ref this._bufferedAmount, -frame.Data.Length);
                        }
                    }
                    catch (Exception ex)
                    {
                        if (HTTPUpdateDelegator.IsCreated)
                        {
                            this.baseRequest.Exception = ex;
                            this.baseRequest.State     = HTTPRequestStates.Error;
                        }
                        else
                        {
                            this.baseRequest.State = HTTPRequestStates.Aborted;
                        }

                        closed = true;
                    }
                }
            }
            finally
            {
                sendThreadCreated = false;

                HTTPManager.Logger.Information("WebSocketResponse", "SendThread - Closed!");
            }
        }