public SpreadMessage ReceiveSpreadMessage() { SpreadMessage message = _spreadConnection.Receive(); DisplayMessage(message); return(message); }
public SpreadMessage SendSpreadMessage(string data) { SpreadMessage msg = new SpreadMessage(); msg.AddGroup(_spreadGroup); msg.Data = Encoding.ASCII.GetBytes(data); _spreadConnection.Multicast(msg); return(msg); }
public SpreadMessage SendACK() { SpreadMessage msg = new SpreadMessage(); msg.AddGroup(_spreadGroup); msg.Data = Encoding.ASCII.GetBytes($"Received"); _spreadConnection.Multicast(msg); return(msg); }
public void CreateFromString_Test() { var rawSpreadMessage = TestSocketMessages.SpreadMessage; var spreadMessage = SpreadMessage.CreateFromString(rawSpreadMessage); Assert.NotNull(spreadMessage); Assert.Equal(0, spreadMessage.ChannelId); Assert.Equal(5698.40000M, spreadMessage.Bid); Assert.Equal(5700.00000M, spreadMessage.Ask); Assert.Equal(1542057299.545897M, spreadMessage.Time); }
private static string ToCustomString(this SpreadMessage spreadMessage) { int length = spreadMessage.Data.Length; string messageData; if (length == 0) { messageData = "No data available"; } else { messageData = Encoding.ASCII.GetString(spreadMessage.Data, 0, length); } return($"{spreadMessage.Groups[0].ToString()}|{spreadMessage.ServiceType}|{messageData}|{spreadMessage.Sender.ToString()}"); }
private void HandleData(KrakenMessageEventArgs eventArgs, SubscriptionStatus subscription) { var dataType = subscription.Subscription.Name; if (dataType == SubscribeOptionNames.Ticker) { var tickerMessage = TickerMessage.CreateFromString(eventArgs.RawContent, subscription); TickerReceived.InvokeAll(this, new TickerEventArgs(subscription.ChannelId.Value, subscription.Pair, tickerMessage)); } if (dataType == SubscribeOptionNames.OHLC) { var ohlcMessage = OhlcMessage.CreateFromString(eventArgs.RawContent); OhlcReceived.InvokeAll(this, new OhlcEventArgs(subscription.ChannelId.Value, subscription.Pair, ohlcMessage)); } if (dataType == SubscribeOptionNames.Trade) { var tradeMessage = TradeMessage.CreateFromString(eventArgs.RawContent); TradeReceived.InvokeAll(this, new TradeEventArgs(subscription.ChannelId.Value, subscription.Pair, tradeMessage)); } if (dataType == SubscribeOptionNames.Spread) { var spreadMessage = SpreadMessage.CreateFromString(eventArgs.RawContent); SpreadReceived.InvokeAll(this, new SpreadEventArgs(subscription.ChannelId.Value, subscription.Pair, spreadMessage)); } if (dataType == SubscribeOptionNames.Book) { if (eventArgs.RawContent.Contains(@"""as"":") && eventArgs.RawContent.Contains(@"""bs"":")) { var bookSnapshotMessage = BookSnapshotMessage.CreateFromString(eventArgs.RawContent); BookSnapshotReceived.InvokeAll(this, new KrakenDataEventArgs <BookSnapshotMessage>(eventArgs.ChannelId.Value, subscription.Pair, bookSnapshotMessage)); } if (eventArgs.RawContent.Contains(@"""a"":") || eventArgs.RawContent.Contains(@"""b"":")) { var bookUpdateMessage = BookUpdateMessage.CreateFromString(eventArgs.RawContent); BookUpdateReceived.InvokeAll(this, new KrakenDataEventArgs <BookUpdateMessage>(eventArgs.ChannelId.Value, subscription.Pair, bookUpdateMessage)); } } }
private void _spreadConnection_OnRegularMessage(SpreadMessage msg) { DisplayMessage(msg); if (ServerOptions.IsPrimary) { //primary server can only receive ack regular messages var data = Encoding.ASCII.GetString(msg.Data, 0, msg.Data.Length); if (data.Equals("Received")) { //we got the ack -> respond to client (back to ExecuteTaksAsync) return; } } else { var deserializedMessage = msg.ParseRegularSpreadMessage(); //save to File _spreadService.SendACK(); } }
public static string ParseRegularSpreadMessage(this SpreadMessage spreadRegularMessage) { return(spreadRegularMessage.ToCustomString()); }
private void DisplayMessage(SpreadMessage msg) { try { if (msg.IsRegular) { Console.Write("Received a "); if (msg.IsUnreliable) { Console.Write("UNRELIABLE"); } else if (msg.IsReliable) { Console.Write("RELIABLE"); } else if (msg.IsFifo) { Console.Write("FIFO"); } else if (msg.IsCausal) { Console.Write("CAUSAL"); } else if (msg.IsAgreed) { Console.Write("AGREED"); } else if (msg.IsSafe) { Console.Write("SAFE"); } Console.WriteLine(" message."); Console.WriteLine("Sent by " + msg.Sender + "."); Console.WriteLine("Type is " + msg.Type + "."); if (msg.EndianMismatch == true) { Console.WriteLine("There is an endian mismatch."); } else { Console.WriteLine("There is no endian mismatch."); } SpreadGroup[] groups = msg.Groups; Console.WriteLine("To " + groups.Length + " groups."); byte[] data = msg.Data; Console.WriteLine("The data is " + data.Length + " bytes."); Console.WriteLine("The message is: " + System.Text.Encoding.ASCII.GetString(data)); } else if (msg.IsMembership) { MembershipInfo info = msg.MembershipInfo; if (info.IsRegularMembership) { SpreadGroup[] groups = msg.Groups; Console.WriteLine("Received a REGULAR membership."); Console.WriteLine("For group " + info.Group + "."); Console.WriteLine("With " + groups.Length + " members."); Console.WriteLine("I am member " + msg.Type + "."); for (int i = 0; i < groups.Length; i++) { Console.WriteLine(" " + groups[i]); } Console.WriteLine("Group ID is " + info.GroupID); Console.Write("Due to "); if (info.IsCausedByJoin) { Console.WriteLine("the JOIN of " + info.Joined + "."); } else if (info.IsCausedByLeave) { Console.WriteLine("the LEAVE of " + info.Left + "."); } else if (info.IsCausedByDisconnect) { Console.WriteLine("the DISCONNECT of " + info.Disconnected + "."); } else if (info.IsCausedByNetwork) { SpreadGroup[] stayed = info.Stayed; Console.WriteLine("NETWORK change."); Console.WriteLine("VS set has " + stayed.Length + " members:"); for (int i = 0; i < stayed.Length; i++) { Console.WriteLine(" " + stayed[i]); } } } else if (info.IsTransition) { Console.WriteLine("Received a TRANSITIONAL membership for group " + info.Group); } else if (info.IsSelfLeave) { Console.WriteLine("Received a SELF-LEAVE message for group " + info.Group); } } else if (msg.IsReject) { // Received a Reject message Console.Write("Received a "); if (msg.IsUnreliable) { Console.Write("UNRELIABLE"); } else if (msg.IsReliable) { Console.Write("RELIABLE"); } else if (msg.IsFifo) { Console.Write("FIFO"); } else if (msg.IsCausal) { Console.Write("CAUSAL"); } else if (msg.IsAgreed) { Console.Write("AGREED"); } else if (msg.IsSafe) { Console.Write("SAFE"); } Console.WriteLine(" REJECTED message."); Console.WriteLine("Sent by " + msg.Sender + "."); Console.WriteLine("Type is " + msg.Type + "."); if (msg.EndianMismatch == true) { Console.WriteLine("There is an endian mismatch."); } else { Console.WriteLine("There is no endian mismatch."); } SpreadGroup[] groups = msg.Groups; Console.WriteLine("To " + groups.Length + " groups."); byte[] data = msg.Data; Console.WriteLine("The data is " + data.Length + " bytes."); Console.WriteLine("The message is: " + System.Text.Encoding.ASCII.GetString(data)); } else { Console.WriteLine("Message is of unknown type: " + msg.ServiceType); } } catch (Exception e) { Console.WriteLine(e); Environment.Exit(1); } }
private void HandleIncomingMessage(object sender, KrakenMessageEventArgs eventArgs) { logger.LogDebug("Handling incoming '{event}' message", eventArgs.Event); switch (eventArgs.Event) { case Heartbeat.EventName: var heartbeat = serializer.Deserialize <Heartbeat>(eventArgs.RawContent); logger.LogTrace("Heartbeat received: {heartbeat}", heartbeat); HeartbeatReceived.InvokeAll(this, heartbeat); break; case SystemStatus.EventName: var systemStatus = serializer.Deserialize <SystemStatus>(eventArgs.RawContent); logger.LogTrace("System status changed: {systemStatus}", systemStatus); SystemStatus = systemStatus; SystemStatusChanged.InvokeAll(this, systemStatus); break; case SubscriptionStatus.EventName: var subscriptionStatus = serializer.Deserialize <SubscriptionStatus>(eventArgs.RawContent); logger.LogTrace("Subscription status changed: {subscriptionStatus}", subscriptionStatus); SynchronizeSubscriptions(subscriptionStatus); SubscriptionStatusChanged.InvokeAll(this, subscriptionStatus); break; case "data": var subscription = Subscriptions.ContainsKey(eventArgs.ChannelId.Value) ? Subscriptions[eventArgs.ChannelId.Value] : null; if (subscription == null) { logger.LogWarning("Didn't find a subscription for channelId {channelId}", eventArgs.ChannelId); break; } var dataType = subscription.Subscription.Name; if (dataType == SubscribeOptionNames.Ticker) { var tickerMessage = TickerMessage.CreateFromString(eventArgs.RawContent, subscription); TickerReceived.InvokeAll(this, new TickerEventArgs(subscription.ChannelId.Value, subscription.Pair, tickerMessage)); } if (dataType == SubscribeOptionNames.OHLC) { var ohlcMessage = OhlcMessage.CreateFromString(eventArgs.RawContent); OhlcReceived.InvokeAll(this, new OhlcEventArgs(subscription.ChannelId.Value, subscription.Pair, ohlcMessage)); } if (dataType == SubscribeOptionNames.Trade) { var tradeMessage = TradeMessage.CreateFromString(eventArgs.RawContent); TradeReceived.InvokeAll(this, new TradeEventArgs(subscription.ChannelId.Value, subscription.Pair, tradeMessage)); } if (dataType == SubscribeOptionNames.Spread) { var spreadMessage = SpreadMessage.CreateFromString(eventArgs.RawContent); SpreadReceived.InvokeAll(this, new SpreadEventArgs(subscription.ChannelId.Value, subscription.Pair, spreadMessage)); } if (dataType == SubscribeOptionNames.Book) { if (eventArgs.RawContent.Contains(@"""as"":") && eventArgs.RawContent.Contains(@"""bs"":")) { var bookSnapshotMessage = BookSnapshotMessage.CreateFromString(eventArgs.RawContent); BookSnapshotReceived.InvokeAll(this, new KrakenDataEventArgs <BookSnapshotMessage>(eventArgs.ChannelId.Value, subscription.Pair, bookSnapshotMessage)); } if (eventArgs.RawContent.Contains(@"""a"":") || eventArgs.RawContent.Contains(@"""b"":")) { var bookUpdateMessage = BookUpdateMessage.CreateFromString(eventArgs.RawContent); BookUpdateReceived.InvokeAll(this, new KrakenDataEventArgs <BookUpdateMessage>(eventArgs.ChannelId.Value, subscription.Pair, bookUpdateMessage)); } } break; default: logger.LogWarning("Could not handle incoming message: {message}", eventArgs.RawContent); break; } }
private void _spreadConnection_OnMembershipMessage(SpreadMessage msg) { MembershipInfo info = msg.MembershipInfo; SpreadGroup group = info.Group; if (info.IsRegularMembership) { SpreadGroup[] members = info.Members; Console.WriteLine($"Regular membership for {group.ToString()} with {members.Length} members:"); for (int i = 0; i < members.Length; i++) { Console.WriteLine($"\t {members[i]}"); } Console.WriteLine($"GroupID: {info.GroupID}"); } SpreadGroup Sender; if (info.IsCausedByDisconnect) { Sender = info.Disconnected; Console.WriteLine($"{Sender} has disconnected ..."); isDisconnected = true; _delegate = new InformClientOfChange(NotifyClient); _delegate.Invoke(ServerOptions.IPAddress, ServerOptions.Port); } if (info.IsCausedByLeave) { Sender = info.Left; Console.WriteLine($"{Sender} has left ..."); isDisconnected = true; _delegate = new InformClientOfChange(NotifyClient); _delegate.Invoke(ServerOptions.IPAddress, ServerOptions.Port); } if (info.IsCausedByJoin) { Sender = info.Joined; Console.WriteLine($"{Sender} has joined ..."); if (isInitState) { #region Set Primary Console.WriteLine("Setting Primary Server ..."); int highestPort = _configurationManager.ServerGroups.ToList().Max(); if (ServerOptions.Port.Equals(highestPort)) { ServerOptions.IsPrimary = true; Console.WriteLine("I am the primary server ..."); } else { ServerOptions.IsPrimary = false; Console.WriteLine("I am the backup server ..."); } #endregion } else { //receive full state } //_delegate = new InformClientOfChange(NotifyClient); //_delegate.Invoke(ServerOptions.IPAddress, ServerOptions.Port); } }