Exemple #1
0
 private void SentHandler(SegmentToken session)
 {
     if (OnSent != null)
     {
         OnSent(session);
     }
 }
        private void ReceivedHanlder(SegmentToken session)
        {
            if (IsConnected == false)
            {
                string msg = encoding.GetString(session.Data.buffer, session.Data.offset, session.Data.size);
                acceptInfo = new WebsocketFrame().ParseAcceptedFrame(msg);

                if ((IsConnected = acceptInfo.IsHandShaked()))
                {
                    resetEvent.Set();
                    if (OnConnected != null)
                    {
                        OnConnected(session.sToken, IsConnected);
                    }
                }
                else
                {
                    clientProvider.Disconnect();
                }
            }
            else
            {
                WebsocketFrame packet = new WebsocketFrame();
                bool           isOk   = packet.DecodingFromBytes(session.Data, true);
                if (isOk == false)
                {
                    return;
                }

                if (packet.OpCode == 0x01)
                {
                    if (OnReceived != null)
                    {
                        OnReceived(session.sToken, encoding.GetString(packet.Payload.buffer,
                                                                      packet.Payload.offset, packet.Payload.size));
                    }

                    return;
                }
                else if (packet.OpCode == 0x08)//close
                {
                    IsConnected = false;
                    clientProvider.Disconnect();
                }
                else if (packet.OpCode == 0x09)//ping
                {
                    SendPong(session.Data);
                }
                else if (packet.OpCode == 0x0A)//pong
                {
                    SendPing();
                }

                if (OnReceivedBytes != null && packet.Payload.size > 0)
                {
                    OnReceivedBytes(new SegmentToken(session.sToken, packet.Payload));
                }
            }
        }
Exemple #3
0
 public HttpPayload GetDo(SegmentToken sToken)
 {
     return(new HttpPayload()
     {
         Header = header,
         HttpUri = new HttpUri(header.RelativeUri),
         Token = sToken.sToken
     });
 }
Exemple #4
0
        public bool Send(SegmentToken segToken, bool waiting = true)
        {
            try
            {
                if (!segToken.sToken.TokenSocket.Connected)
                {
                    return(false);
                }

                bool isWillEvent = true;

                ArraySegment <byte>[] segItems = sendBufferManager.BufferToSegments(segToken.Data.buffer,
                                                                                    segToken.Data.offset,
                                                                                    segToken.Data.size);

                foreach (var seg in segItems)
                {
                    if (!segToken.sToken.TokenSocket.Connected)
                    {
                        return(false);
                    }

                    var tArgs = GetSocketAsyncFromSendPool(waiting, segToken.sToken.TokenSocket);
                    if (tArgs == null)
                    {
                        return(false);
                    }

                    tArgs.UserToken = segToken.sToken;

                    if (!sendBufferManager.WriteBuffer(tArgs, seg.Array, seg.Offset, seg.Count))
                    {
                        sendTokenManager.Set(tArgs);

                        throw new Exception(string.Format("发送缓冲区溢出...buffer block max size:{0}", sendBufferManager.BlockSize));
                    }

                    isWillEvent &= segToken.sToken.SendAsync(tArgs);
                    if (!isWillEvent)
                    {
                        ProcessSentCallback(tArgs);
                    }

                    if (sendTokenManager.Count < (sendTokenManager.Capacity >> 2))
                    {
                        Thread.Sleep(5);
                    }
                }
                return(isWillEvent);
            }
            catch (Exception ex)
            {
                Close(segToken.sToken);

                throw ex;
            }
        }
        private void OnReceived(SegmentToken sToken)
        {
            if (hOnReceived != null)
            {
                HttpHeader header = new HttpHeader(sToken.Data);
                switch (header.Option)
                {
                case HttpOption.GET:
                    hOnReceived(new HttpGet(header).GetDo(sToken));
                    break;

                case HttpOption.POST:
                    hOnReceived(new HttpPost(header).GetDo(sToken));
                    break;
                }
            }
        }
Exemple #6
0
        public HttpPayload GetDo(SegmentToken sToken)
        {
            var paylaod = new HttpPayload()
            {
                Header  = header,
                HttpUri = new HttpUri(header.RelativeUri),
                Token   = sToken.sToken
            };

            if (header.ContentLength > 0)
            {
                SegmentOffset seg = sToken.Data;
                paylaod.stream = new MemoryStream(seg.buffer,
                                                  seg.offset + (int)header.StreamPosition,
                                                  (int)header.ContentLength);
            }
            return(paylaod);
        }
 public bool Send(SegmentToken segment)
 {
     return(sProvider.Send(segment));
 }
Exemple #8
0
        private void ReceivedHandler(SegmentToken session)
        {
            var connection = ConnectionPool.Find(x => x.sToken.TokenId == session.sToken.TokenId);

            if (connection == null)
            {
                connection = new ConnectionInfo()
                {
                    sToken = session.sToken
                };

                ConnectionPool.Add(connection);
            }

            if (connection.IsHandShaked == false)
            {
                var serverFrame = new WebsocketFrame();

                var access = serverFrame.GetHandshakePackage(session.Data);
                connection.IsHandShaked = access.IsHandShaked();

                if (connection.IsHandShaked == false)
                {
                    CloseAndRemove(connection);
                    return;
                }
                connection.ConnectedTime = DateTime.Now;

                var rsp = serverFrame.RspAcceptedFrame(access);

                serverProvider.Send(new SegmentToken(session.sToken, rsp));

                connection.accessInfo = access;

                if (OnAccepted != null)
                {
                    OnAccepted(session.sToken);
                }
            }
            else
            {
                RefreshTimeout(session.sToken);

                WebsocketFrame packet = new WebsocketFrame();
                bool           isOk   = packet.DecodingFromBytes(session.Data, true);
                if (isOk == false)
                {
                    return;
                }

                if (packet.OpCode == 0x01)//text
                {
                    if (OnReceived != null)
                    {
                        OnReceived(session.sToken, encoding.GetString(packet.Payload.buffer,
                                                                      packet.Payload.offset, packet.Payload.size));
                    }

                    return;
                }
                else if (packet.OpCode == 0x08)//close
                {
                    CloseAndRemove(connection);
                    return;
                }
                else if (packet.OpCode == 0x09)//ping
                {
                    SendPong(session);
                }
                else if (packet.OpCode == 0x0A)//pong
                {
                    //  SendPing(session.sToken);
                }

                if (OnReceivedBytes != null && packet.Payload.size > 0)
                {
                    OnReceivedBytes(new SegmentToken(session.sToken, packet.Payload));
                }
            }
        }
Exemple #9
0
        private void SendPong(SegmentToken session)
        {
            var buffer = new WebsocketFrame().ToSegmentFrame(session.Data, OpCodeType.Bong);

            serverProvider.Send(new SegmentToken(session.sToken, buffer));
        }
Exemple #10
0
 public bool Send(SegmentToken session, bool waiting = true)
 {
     return(serverProvider.Send(session, waiting));
 }
Exemple #11
0
 public int SendSync(SegmentToken segToken)
 {
     return(segToken.sToken.Send(segToken.Data));
 }