Exemple #1
0
        public void BeginSend(string identifier, byte[] data, int offset, int count)
        {
            if (this.Identifier != identifier)
            {
                throw new InvalidOperationException(
                          string.Format("Channel identifier is not matched, Identifier[{0}].", identifier));
            }

            _innerSession.BeginSend(data, offset, count);
            _keepAliveTracker.OnDataSent();
        }
Exemple #2
0
        public void BeginSendTo(string sessionKey, byte[] data, int offset, int count)
        {
            if (!IsListening)
            {
                throw new InvalidOperationException("The server has stopped to listen.");
            }

            ActorTransportSession session = null;

            if (_sessions.TryGetValue(sessionKey, out session))
            {
                session.BeginSend(data, offset, count);
            }
            else
            {
                _log.WarnFormat("BeginSendTo, cannot find target session [{0}].", sessionKey);
            }
        }
Exemple #3
0
        public IAsyncResult BeginSendTo(string sessionKey, byte[] data, int offset, int count, AsyncCallback callback, object state)
        {
            if (!IsListening)
            {
                throw new InvalidOperationException("The server has stopped to listen.");
            }

            ActorTransportSession session = null;

            if (_sessions.TryGetValue(sessionKey, out session))
            {
                return(session.BeginSend(data, offset, count, callback, state));
            }
            else
            {
                _log.WarnFormat("BeginSendTo, cannot find target session [{0}].", sessionKey);
            }

            return(null);
        }
        public void OnDataReceived(byte[] data, int dataOffset, int dataLength)
        {
            if (!IsHandshaked)
            {
                Handshake(data, dataOffset, dataLength);
            }
            else
            {
                _keepAliveTracker.OnDataReceived();

                ActorFrameHeader actorKeepAliveRequestFrameHeader = null;
                bool             isHeaderDecoded = _channelConfiguration.FrameBuilder.TryDecodeFrameHeader(
                    data, dataOffset, dataLength,
                    out actorKeepAliveRequestFrameHeader);
                if (isHeaderDecoded && actorKeepAliveRequestFrameHeader.OpCode == OpCode.Ping)
                {
                    _log.DebugFormat("KeepAlive receive request from remote actor [{0}] to local actor [{1}].", _remoteActor, _localActor);

                    var actorKeepAliveResponse       = new PongFrame();
                    var actorKeepAliveResponseBuffer = _channelConfiguration.FrameBuilder.EncodeFrame(actorKeepAliveResponse);

                    _log.DebugFormat("KeepAlive send response from local actor [{0}] to remote actor [{1}].", _localActor, _remoteActor);
                    _innerSession.BeginSend(actorKeepAliveResponseBuffer);
                }
                else if (isHeaderDecoded && actorKeepAliveRequestFrameHeader.OpCode == OpCode.Pong)
                {
                    _log.DebugFormat("KeepAlive receive response from remote actor [{0}] to local actor [{1}].", _remoteActor, _localActor);
                    StopKeepAliveTimeoutTimer();
                }
                else
                {
                    if (DataReceived != null)
                    {
                        DataReceived(this, new ActorChannelSessionDataReceivedEventArgs(
                                         this, _remoteActor, data, dataOffset, dataLength));
                    }
                }
            }
        }