Exemple #1
0
        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());
        }
Exemple #4
0
        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);
            }
        }
Exemple #5
0
        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));
            }
        }
Exemple #6
0
        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);
        }
Exemple #7
0
        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));
            }
        }
Exemple #8
0
        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);
        }
Exemple #10
0
        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();
 }
Exemple #14
0
        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);
        }
Exemple #18
0
        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);
        }
Exemple #19
0
 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);
 }
Exemple #20
0
        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);
        }
Exemple #21
0
        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();
                }
            }
        }
Exemple #22
0
 public static Message.Builder Action(this Message.Builder builder, string action)
 {
     builder.Body(ACTION, action);
     return(builder);
 }
Exemple #23
0
 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;
 }
Exemple #24
0
        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);
        }
Exemple #25
0
        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);
            }
        }
Exemple #26
0
        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();
        }