void OnGet_Friends_Request(chat.Message recv_msg) { GetFriendsResponse.Builder friends = new GetFriendsResponse.Builder(); Users.instance().forall((User usr) => { Friend friend = new Friend.Builder() { Name = pb.ByteString.CopyFromUtf8(usr.Username), Online = usr.Login }.Build(); friends.AddFriends(friend); }); Message rsp_msg = new Message.Builder() { MsgType = MSG.Get_Friends_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true, GetFriends = friends.Build() }.Build() }.Build(); SendMessage(rsp_msg); }
private void OnTcpMessagePeek(ITcpSession session, Message message) { ElasticAddress address = message.Value <string>("enode"); // verify message PrivateKey nodeKey = MasterKey.CKD($"{address.Host}:{address.Port}"); if (!message.Verify(nodeKey.Address)) { Logger.warning("Unverified message"); return; } // valid address? if (nodeKey.Address != address.Address) { Logger.warning("Invalid address"); return; } Message msg = new Message.Builder() .Body(ACTION, ACTION_PEEK) .Body("peers", Peers.Count) .Build(MasterKey); session?.Write(msg.ToBytes()); }
public void Test2() { PrivateKey key = PrivateKey.CreateKey(); ElasticLayout layout = ElasticLayout.DefineLayout(1024); Elastic3D to = new Elastic3D((byte)(1 + RndProvider.Next(layout.X)), (byte)(1 + RndProvider.Next(layout.Y)), (byte)(1 + RndProvider.Next(layout.Z))); Message message = new Message.Builder() .Body("rndBytes", RndProvider.GetNonZeroBytes(128)) .Build(key); PrivateKey routerKey = PrivateKey.CreateKey(); message.RouteTo(to.TimeToLive(), to, layout, routerKey); Payload routes = message.Routes(); Assert.Equal(to.TimeToLive(), routes.Value <byte>("ttl")); Assert.Equal(to, routes.Value <Elastic3D>("to")); Assert.Equal(layout, routes.Value <ElasticLayout>("layout")); Address router = message.Router(); Assert.Equal(routerKey.Address, router); Assert.True(message.VerifyRouter()); message.TimeToLive(0); Assert.Equal(0, message.TimeToLive()); Assert.Equal(0, new Elastic3D(0, 0, 0).TimeToLive()); Assert.Equal(1, new Elastic3D(16, 0, 0).TimeToLive()); Assert.Equal(2, new Elastic3D(13, 15, 0).TimeToLive()); Assert.Equal(3, new Elastic3D(1, 2, 3).TimeToLive()); }
public void ShouldBeSerializable(int repeats) { for (int i = 0; i < repeats; i++) { PrivateKey key = PrivateKey.CreateKey(); byte[] rndBytes = RndProvider.GetNonZeroBytes(1024); Payload body = new Payload.Builder() .Value("rndBytes", rndBytes) .Build(); Message message = new Message.Builder() .WithBody(body) .Build(key); // serialize & deserialize Message received = Message.Parse(message.ToBytes()); Assert.Equal(message.Hash, received.Hash); Assert.Equal(rndBytes, message.Value <byte[]>("rndBytes")); Assert.Equal(rndBytes, received.Value <byte[]>("rndBytes")); Assert.Equal(message.Value <byte[]>("rndBytes"), received.Value <byte[]>("rndBytes")); Assert.Equal(message.Headers.Hash, received.Headers.Hash); Assert.Equal(message.Body.Hash, received.Body.Hash); } }
public void ShouldBeModifiable(int repeats) { for (int i = 0; i < repeats; i++) { PrivateKey key = PrivateKey.CreateKey(); byte[] rndBytes = RndProvider.GetNonZeroBytes(1024); Payload body = new Payload.Builder() .Value("rndBytes", rndBytes) .Build(); Message message = new Message.Builder() .WithBody(body) .Build(key); // serialize & deserialize Message received = Message.Parse(message.ToBytes()); Assert.True(received.Verify(key.Address)); // verify ok if header changed received.Headers.Set("timestamp", DateTime.Now); Assert.True(received.Verify(key.Address)); // verify failed if body changed received.Body.Set("id", RndProvider.Next(100)); Assert.False(received.Verify(key.Address)); } }
void OnLogout_Request(chat.Message recv_msg) { Message rsp_msg = new Message.Builder() { MsgType = MSG.Logout_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true }.Build() }.Build(); SendMessage(rsp_msg); Login = false; var friendNotification = BuildFriendNotification(false); Users.instance().forall((User user) => { if (user != this && user.login) { user.SendMessage(friendNotification); } }); Users.instance().DelUser(this); }
public void ShouldBeVerifiable(int repeats) { for (int i = 0; i < repeats; i++) { PrivateKey key = PrivateKey.CreateKey(); PrivateKey wrongKey = key.CKD(key.Bytes); byte[] rndBytes = RndProvider.GetNonZeroBytes(1024); Payload body = new Payload.Builder() .Value("rndBytes", rndBytes) .Build(); Message message = new Message.Builder() .WithBody(body) .Build(key); // serialize & deserialize Message received = Message.Parse(message.ToBytes()); Assert.True(received.Verify(key.Address)); Assert.False(received.Verify(wrongKey.Address)); // verify failed if body has changed received.Body.Set("rndBytes", RndProvider.GetNonZeroBytes(128)); Assert.False(received.Verify(key.Address)); } }
public void RequestSync() { Message message = new Message.Builder() .Body(ACTION, ACTION_SYNC) .Build(MasterKey); SendMessage(message.ToBytes()); }
public void OnMessagePing(ElasticAddress sender, Message ping) { Message pong = new Message.Builder() .Action("pong") .Body("msgHash", ping.ID) .Build(NodeKey); SendTo(pong, sender); }
private void Register(ITcpSession session) { Message message = new Message.Builder() .Body(ACTION, ACTION_REGISTER) .Body("enode", NodeUrl.ToString()) .Build(NodeKey); session?.Write(message.ToBytes()); }
public void SyncPeers(ITcpSession session, string[] catalogs) { Message message = new Message.Builder() .Body(ACTION, ACTION_UPDATE) .Body("peers", catalogs) .Build(MasterKey); session?.Write(message.ToBytes()); }
public void SyncAllPeers(string[] peers) { Message message = new Message.Builder() .Body(ACTION, ACTION_UPDATE) .Body("peers", peers) .Build(MasterKey); Server.SendAll(message.ToBytes()); }
public void PreventMultipleTargets_ConditionDevice() { // A message may only have 1 of 3 targets(topic, device, condition) // Setting more than one target should throw an exception Message message = new Message .Builder() .ToDevice("aDevice") .ToCondition("aCondition") .Build(); }
void OnSend_Message_Request(chat.Message recv_msg) { Message rsp_msg = new Message.Builder() { MsgType = MSG.Send_Message_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true }.Build() }.Build(); SendMessage(rsp_msg); Message text_msg = new Message.Builder() { MsgType = MSG.Message_Notification, Sequence = 0xffffffff, Notification = new Notification.Builder() { Msg = new MessageNotification.Builder() { Sender = Username, Text = recv_msg.Request.SendMessage.Text, Timestamp = DateTime.Now.ToString() }.Build() }.Build() }.Build(); if (recv_msg.Request.SendMessage.HasReceiver) { string receiver = recv_msg.Request.SendMessage.Receiver.ToStringUtf8(); Users.instance().forall((User usr) => { if (usr.Username.Equals(receiver)) { usr.SendMessage(text_msg); } }); } else { Users.instance().forall((User user) => { if (user != this && user.login) { user.SendMessage(text_msg); } }); } }
public void DateTimeTest() { PrivateKey key = PrivateKey.CreateKey(); Message ping = new Message.Builder() .Body("rndBytes", RndProvider.GetNonZeroBytes(32)) .Build(key); Message received = Message.Parse(ping.ToBytes()); Assert.Equal(ping.TimeStamp, received.TimeStamp); }
public void ShouldBeParsableElastic3D() { PrivateKey messageKey = PrivateKey.CreateKey(); Elastic3D to = new Elastic3D(1, 2, 3); ElasticLayout layout = new ElasticLayout(16, 16, 16); Message message = new Message.Builder() .Body("rndBytes", RndProvider.GetNonZeroBytes(32)) .Build(messageKey); }
public void SimpleSend() { FcmClient client = new FcmClient("credentials.json"); var message = new Message .Builder() .Title("") .ToTopic("aTopic") .Build(); // Lets send it string id = client.Send(message, true).GetAwaiter().GetResult(); Assert.IsNotNull(id); }
void OnKeepalive_Request(chat.Message recv_msg) { Message rsp_msg = new Message.Builder() { MsgType = MSG.Keepalive_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true }.Build() }.Build(); SendMessage(rsp_msg); }
private Message BuildFriendNotification(bool online) { chat.Message friend_notification_msg = new Message.Builder() { MsgType = MSG.Friend_Notification, Sequence = 0xffffffff, Notification = new Notification.Builder() { Friend = new FriendNotification.Builder() { Name = pb.ByteString.CopyFromUtf8(Username), Online = online }.Build() }.Build() }.Build(); return(friend_notification_msg); }
public void Welcome() { Message welcome = new Message.Builder() { MsgType = MSG.Welcome_Notification, Sequence = 0xffffffff, SessionId = this.SessionId, Notification = new Notification.Builder() { Welcome = new WelcomeNotification.Builder() { Text = pb.ByteString.CopyFromUtf8("欢迎加入广播聊天服务。") }.Build() }.Build() }.Build(); SendMessage(welcome); }
static void Main(string[] args) { ILoggable logger = new BLog.Builder() .WithConsole(true) .WithFilter(LogFilter.All) .Build(); PrivateKey key = PrivateKey.CreateKey(); using (CancellationTokenSource cts = new CancellationTokenSource()) { NodeServer server = new NodeServer(logger); server.Start(PORT, cts); Console.CancelKeyPress += (sender, e) => { e.Cancel = true; cts.Cancel(); }; byte[] rndBytes = RndProvider.GetNonZeroBytes(1024 * 1024); while (!cts.IsCancellationRequested) { Thread.Sleep(10); rndBytes = RndProvider.GetNonZeroBytes(1024 * 1024); Message message = new Message.Builder() .Body("rndBytes", rndBytes) .Build(key); byte[] data = message.ToBytes(); // ElasticNode.SendTo(data, "127.0.0.1", PORT); NodeClient client = new NodeClient(logger); client.Start("127.0.0.1", PORT); Thread.Sleep(1000); // client.Write(data); client.Stop(); } } }
public static Message.Builder Action(this Message.Builder builder, string action) { builder.Body(ACTION, action); return(builder); }
private Message BuildFriendNotification( bool online ) { chat.Message friend_notification_msg = new Message.Builder() { MsgType = MSG.Friend_Notification, Sequence = 0xffffffff, Notification = new Notification.Builder() { Friend = new FriendNotification.Builder() { Name = pb.ByteString.CopyFromUtf8(Username), Online = online }.Build() }.Build() }.Build(); return friend_notification_msg; }
public void Welcome() { Message welcome = new Message.Builder() { MsgType= MSG.Welcome_Notification, Sequence = 0xffffffff, SessionId = this.SessionId, Notification = new Notification.Builder() { Welcome = new WelcomeNotification.Builder() { Text = pb.ByteString.CopyFromUtf8( "广播聊天客户端") }.Build() }.Build() }.Build(); SendMessage(welcome); }
void OnReadBody(IAsyncResult ar) { try { int len = connection_.Client.EndReceive(ar); body_read_len += len; if (body_read_len < body.Length) { connection_.Client.BeginReceive( body, body_read_len, body.Length - body_read_len, 0, new AsyncCallback(OnReadBody), null); return; } StartReadHead(); try { chat.Message recv_msg = chat.Message.ParseFrom(body); switch (recv_msg.MsgType) { case chat.MSG.Login_Request: { Username = recv_msg.Request.Login.Username.ToStringUtf8(); chat.Message login_rsp = new chat.Message.Builder() { MsgType = MSG.Login_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true, Login = new LoginResponse.Builder() { Ttl = 10 }.Build() }.Build() }.Build(); Login = true; SendMessage(login_rsp); var friendNotification = BuildFriendNotification(true); Users.instance().forall((User otherUser) => { if (otherUser != this && otherUser.login) { otherUser.SendMessage(friendNotification); } }); } break; //case chat.MSG.GetScreen_Request: // { // lock (BMPScreen.IsLockGetJpgBytes) // { // if (this.SendScreen.AddSeconds(1) < DateTime.Now) // { // chat.Message screenresponse = new chat.Message.Builder() // { // MsgType = chat.MSG.GetScreen_Response, // Sequence = recv_msg.Sequence, // Response = new Response.Builder() // { // Result = true, // LastResponse = true, // Screenfile = new GetScreenResponse.Builder() // { // FileBytes = pb.ByteString.CopyFrom(BMPScreen.JpgBytes) // }.Build() // }.Build() // }.Build(); // SendMessage(screenresponse); // this.SendScreen = DateTime.Now; // } // //Console.WriteLine(this.Username); // } // } // break; case chat.MSG.Logout_Request: { Message rsp_msg = new Message.Builder() { MsgType = MSG.Logout_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true }.Build() }.Build(); SendMessage(rsp_msg); Login = false; var friendNotification = BuildFriendNotification(false); Users.instance().forall((User otherUser) => { if (otherUser != this && otherUser.login) { otherUser.SendMessage(friendNotification); } }); } break; case chat.MSG.Keepalive_Request: { Message rsp_msg = new Message.Builder() { MsgType = MSG.Keepalive_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true }.Build() }.Build(); SendMessage(rsp_msg); } break; case chat.MSG.Get_Friends_Request: { GetFriendsResponse.Builder friends = new GetFriendsResponse.Builder(); Users.instance().forall((User usr) => { Friend friend = new Friend.Builder() { Name = pb.ByteString.CopyFromUtf8(usr.Username), Online = usr.Login }.Build(); friends.AddFriends(friend); }); Message rsp_msg = new Message.Builder() { MsgType = MSG.Get_Friends_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true, GetFriends = friends.Build() }.Build() }.Build(); SendMessage(rsp_msg); } break; case chat.MSG.Send_Message_Request: { Message rsp_msg = new Message.Builder() { MsgType = MSG.Send_Message_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true }.Build() }.Build(); SendMessage(rsp_msg); Message text_msg = new Message.Builder() { MsgType = MSG.Message_Notification, Sequence = 0xffffffff, Notification = new Notification.Builder() { Msg = new MessageNotification.Builder() { Sender = pb.ByteString.CopyFromUtf8(Username), Text = recv_msg.Request.SendMessage.Text, Timestamp = DateTime.Now.ToString() }.Build() }.Build() }.Build(); if (recv_msg.Request.SendMessage.HasReceiver) { string receiver = recv_msg.Request.SendMessage.Receiver.ToStringUtf8(); Users.instance().forall((User usr) => { if (usr.Username.Equals(receiver)) { usr.SendMessage(text_msg); } }); } else { Users.instance().forall((User usr) => { usr.SendMessage(text_msg); }); } } break; default: break; } } catch (Exception e) { Console.WriteLine("ParserMessage Exception:{0}", e.Message); } } catch (SocketException sockectex) { Console.WriteLine("OnReadBody SockectException:{0}", sockectex.Message); Users.instance().DelUser(this); } catch (Exception ex) { Console.WriteLine("OnReadBody Exception:{0}", ex.Message); } }
void OnReadBody(IAsyncResult ar) { try { int len = connection_.Client.EndReceive(ar); body_read_len += len; if (body_read_len < body.Length) { connection_.Client.BeginReceive(body, body_read_len, body.Length - body_read_len, 0, new AsyncCallback(OnReadBody), null); return; } StartReadHead(); try { chat.Message recv_msg = chat.Message.ParseFrom(body); Console.WriteLine("recv msg:{0}", recv_msg.ToString()); switch( recv_msg.MsgType ) { case chat.MSG.Login_Request: { Username = recv_msg.Request.Login.Username.ToStringUtf8(); chat.Message login_rsp = new chat.Message.Builder() { MsgType = MSG.Login_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true, Login = new LoginResponse.Builder() { Ttl = 10 }.Build() }.Build() }.Build(); Login = true; SendMessage(login_rsp); var friendNotification = BuildFriendNotification(true); Users.instance().forall((User otherUser) => { if (otherUser != this && otherUser.login ) { otherUser.SendMessage(friendNotification); } }); } break; case chat.MSG.Logout_Request: { Message rsp_msg = new Message.Builder() { MsgType = MSG.Logout_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true }.Build() }.Build(); SendMessage(rsp_msg); Login = false; var friendNotification = BuildFriendNotification(false); Users.instance().forall((User otherUser) => { if (otherUser != this && otherUser.login) { otherUser.SendMessage(friendNotification); } }); } break; case chat.MSG.Keepalive_Request: { Message rsp_msg = new Message.Builder() { MsgType = MSG.Keepalive_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true }.Build() }.Build(); SendMessage(rsp_msg); } break; case chat.MSG.Get_Friends_Request: { GetFriendsResponse.Builder friends = new GetFriendsResponse.Builder(); Users.instance().forall((User usr) => { Friend friend = new Friend.Builder() { Name = pb.ByteString.CopyFromUtf8(usr.Username), Online = usr.Login }.Build(); friends.AddFriends(friend); }); Message rsp_msg = new Message.Builder() { MsgType = MSG.Get_Friends_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true, GetFriends = friends.Build() }.Build() }.Build(); SendMessage(rsp_msg); } break; case chat.MSG.Send_Message_Request: { Message rsp_msg = new Message.Builder() { MsgType = MSG.Send_Message_Response, Sequence = recv_msg.Sequence, SessionId = this.SessionId, Response = new Response.Builder() { Result = true, LastResponse = true }.Build() }.Build(); SendMessage(rsp_msg); Message text_msg = new Message.Builder() { MsgType = MSG.Message_Notification, Sequence = 0xffffffff, Notification = new Notification.Builder() { Msg = new MessageNotification.Builder() { Sender = pb.ByteString.CopyFromUtf8( Username ), Text = recv_msg.Request.SendMessage.Text, Timestamp = DateTime.Now.ToString() }.Build() }.Build() }.Build(); if (recv_msg.Request.SendMessage.HasReceiver) { string receiver = recv_msg.Request.SendMessage.Receiver.ToStringUtf8(); Users.instance().forall((User usr) => { if (usr.Username.Equals(receiver)) { usr.SendMessage(text_msg); } }); } else { Users.instance().forall((User usr) => { usr.SendMessage(text_msg); }); } } break; default: break; } } catch (Exception e) { Console.WriteLine("ParserMessage Exception:{0}", e.Message); } } catch (Exception ex) { Console.WriteLine("OnReadBody Exception:{0}", ex.Message); } }
public void Main() { byte n = Env.Value("n", DEFAULT_N); int nTimes = Env.Value("nTimes", DEFAULT_NTIMES); int msgKBytes = Env.Value("msgKBytes", DEFAULT_MSGKBYTES); int nPeers = Peers.Count; int nonce = 0; int waitTime = Math.Min(60000, Math.Max(1000, nPeers * 32)); new BConsole.MessageBuilder() .Append(DarkGreen, $"[{TimeCode}] ") .Append(Blue, ">> TEST STARTED!") .Append(" n=") .Append(DarkGreen, n) .Append(", nPeers=") .Append(DarkGreen, nPeers) .Append(", nTimes=") .Append(DarkGreen, nTimes) .Append(", msgKBytes=") .Append(DarkGreen, msgKBytes) .Append(", waitTime=") .Append(DarkGreen, waitTime) .WriteLine("(ms)"); // 보고서 초기화 Reports.Start(); // 5초에 한번씩 전체 메세지 전송한다. Stopwatch sw = Stopwatch.StartNew(); while (!cts.IsCancellationRequested && nonce++ < nTimes) { byte[] rndBytes = RndProvider.GetNonZeroBytes(msgKBytes * 1024); // message Message message = new Message.Builder() .Action("ping") .Body("nonce", nonce) .Body("rndBytes", rndBytes) .Build(NodeKey); ElasticLayout layout = ElasticLayout.DefineLayout(Peers.Count, n); Elastic3D me = layout.DefineCoordinates(NodeKey.Address); // new report item for this message TestReports.ReportItem report = Reports.NewItem(message, Peers.Count); new BConsole.MessageBuilder() .Append(">> Sending message[nonce=") .Append(Cyan, nonce) .Append("](") .Append(DarkCyan, message.ID.Ellipsis()) .Append("): message.length=") .Append(DarkGreen, message.Length) .Append(", n=") .Append(DarkGreen, n) .Append(", layout=") .Append(DarkGreen, layout) .Append(", host.coordinates=") .Append(DarkGreen, me) .WriteLine(); // send message to all peers SendAll(message, n); // wait for send message complete sw.Restart(); while (!report.ReceivedAll && sw.ElapsedMilliseconds < waitTime * 3 && !cts.IsCancellationRequested) { Thread.Sleep(10); } // message result new BConsole.MessageBuilder() .Append(">> message[nonce=") .Append(Cyan, nonce) .Append("](") .Append(DarkCyan, message.ID.Ellipsis()) .Append(") result=") .WriteLine(report.ToString()); // waiting for next message if (nonce < nTimes) { BConsole.WriteLine(ConsoleColor.White, "Waiting for next message..."); while (waitTime - (int)sw.ElapsedMilliseconds > 0 && !cts.IsCancellationRequested) { Thread.Sleep(10); } } } Report(); }