public void Send(string actorType, string actorName, byte[] data, int offset, int count) { var actorKey = ActorIdentity.GetKey(actorType, actorName); if (_remoteActor == null) { throw new InvalidOperationException( string.Format("The remote actor has not been connected, Type[{0}], Name[{1}].", actorType, actorName)); } if (_remoteActor.GetKey() != actorKey) { throw new InvalidOperationException( string.Format("Remote actor key not matched, [{0}]:[{1}].", _remoteActor.GetKey(), actorKey)); } _connector.Send(data, offset, count); _keepAliveTracker.OnDataSent(); }
private void Handshake(TimeSpan timeout) { var actorHandshakeRequestData = _channelConfiguration.FrameBuilder.ControlFrameDataEncoder.EncodeFrameData(_localActor); var actorHandshakeRequest = new HelloFrame(actorHandshakeRequestData); var actorHandshakeRequestBuffer = _channelConfiguration.FrameBuilder.EncodeFrame(actorHandshakeRequest); ManualResetEventSlim waitingHandshaked = new ManualResetEventSlim(false); ActorTransportDataReceivedEventArgs handshakeResponseEvent = null; EventHandler <ActorTransportDataReceivedEventArgs> onHandshaked = (s, e) => { handshakeResponseEvent = e; waitingHandshaked.Set(); }; _connector.TransportDataReceived += onHandshaked; _log.DebugFormat("Handshake request from local actor [{0}].", _localActor); _connector.Send(actorHandshakeRequestBuffer); bool handshaked = waitingHandshaked.Wait(timeout); _connector.TransportDataReceived -= onHandshaked; waitingHandshaked.Dispose(); if (handshaked && handshakeResponseEvent != null) { ActorFrameHeader actorHandshakeResponseFrameHeader = null; bool isHeaderDecoded = _channelConfiguration.FrameBuilder.TryDecodeFrameHeader( handshakeResponseEvent.Data, handshakeResponseEvent.DataOffset, handshakeResponseEvent.DataLength, out actorHandshakeResponseFrameHeader); if (isHeaderDecoded && actorHandshakeResponseFrameHeader.OpCode == OpCode.Welcome) { byte[] payload; int payloadOffset; int payloadCount; _channelConfiguration.FrameBuilder.DecodePayload( handshakeResponseEvent.Data, handshakeResponseEvent.DataOffset, actorHandshakeResponseFrameHeader, out payload, out payloadOffset, out payloadCount); var actorHandshakeResponseData = _channelConfiguration.FrameBuilder.ControlFrameDataDecoder.DecodeFrameData <ActorIdentity>( payload, payloadOffset, payloadCount); _remoteActor = actorHandshakeResponseData; _log.DebugFormat("Handshake response from remote actor [{0}].", _remoteActor); } if (_remoteActor == null) { _log.ErrorFormat("Handshake with remote [{0}] failed, invalid actor description.", this.ConnectToEndPoint); Close(); } else { _log.DebugFormat("Handshake with remote [{0}] successfully, RemoteActor[{1}].", this.ConnectToEndPoint, _remoteActor); IsHandshaked = true; if (ChannelConnected != null) { ChannelConnected(this, new ActorChannelConnectedEventArgs(this.Identifier, _remoteActor)); } _connector.TransportDataReceived += OnTransportDataReceived; _keepAliveTracker.StartTimer(); } } else { _log.ErrorFormat("Handshake with remote [{0}] timeout [{1}].", this.ConnectToEndPoint, timeout); Close(); } }