public static void Run()
        {
            var mre = new ManualResetEvent(false);

            using (var server = new W.Net.Server <W.Net.Client <Customer> >())
            {
                server.ClientConnected += c =>
                {
                    c.MessageReceived += (o, customer) =>
                    {
                        //increase the age and echo the customer
                        customer.Age += 1;
                        customer.Name = customer.Name.ToUpper();
                        o.As <W.Net.Client <Customer> >().Send(customer);
                    };
                };
                server.Start(IPAddress.Parse("127.0.0.1"), 5150);

                using (var client = new W.Net.Client <Customer>())
                {
                    client.MessageReceived += (o, customer) =>
                    {
                        Console.WriteLine("{0} New Age = {1}", customer.Name, customer.Age);
                        Console.WriteLine("Send <Return To Exit>: ");
                    };
                    client.Connected += (o, ep) =>
                    {
                        mre.Set();
                    };
                    client.Disconnected += (s, remoteEndPoint, exception) =>
                    {
                        mre.Set();
                    };
                    client.Socket.ConnectAsync(IPAddress.Parse("127.0.0.1"), 5150).Wait();
                    mre.WaitOne();

                    Console.WriteLine("Send <Return To Exit>: ");
                    while (client.Socket.IsConnected)
                    {
                        var name = Console.ReadLine();
                        if (string.IsNullOrEmpty(name))
                        {
                            break;
                        }
                        var customer = new Customer()
                        {
                            Name = name, Age = new Random().Next(1, 75)
                        };
                        Console.WriteLine("{0} Age = {1}", customer.Name, customer.Age);
                        client.Send(customer);
                    }
                }
            }
        }
        public static void Run()
        {
            var mre = new ManualResetEvent(false);

            using (var server = new W.Net.Server <W.Net.Client <string> >())
            {
                server.ClientConnected += client =>
                {
                    Console.WriteLine("Server Connected To Client: " + client.Socket.Name);
                    client.MessageReceived += (c, message) =>
                    {
                        Console.WriteLine("Server Echo: " + message);
                        c.Send(message.As <string>().ToUpper());
                    };
                };
                server.ClientDisconnected += (client, remoteEndPoint, exception) =>
                {
                    if (exception != null)
                    {
                        Console.WriteLine("Server Disconnected: " + client.Socket.Name + " - " + exception.Message);
                    }
                    else
                    {
                        Console.WriteLine("Server Disconnected: " + client.Socket.Name);
                    }

                    Console.WriteLine("Server Disconnected From: " + remoteEndPoint?.ToString());
                };
                server.Start(IPAddress.Parse("127.0.0.1"), 5150);

                using (var client = new W.Net.Client <string>())
                {
                    client.Connected += (c, remoteEndPoint) =>
                    {
                        Console.WriteLine("Client Connected: " + c.Socket.Name);
                    };
                    client.Connected += (c, ep) =>
                    {
                        mre.Set();
                    };
                    client.Disconnected += (c, remoteEndPoint, exception) =>
                    {
                        if (exception != null)
                        {
                            Console.WriteLine("Client Disconnected: " + remoteEndPoint?.ToString() + " - " + exception.Message);
                        }
                        else
                        {
                            Console.WriteLine("Client Disconnected: " + remoteEndPoint?.ToString());
                        }
                        mre.Set();
                    };
                    client.RawDataReceived += (c, bytes) =>
                    {
                        Console.WriteLine("Client Received Raw: " + bytes?.AsString() ?? "null");
                    };
                    client.MessageReceived += (c, message) =>
                    {
                        Console.WriteLine("Client Received: " + message);
                        Console.Write("Send <Return To Disconnect>: ");
                    };
                    //client.MessageSent += (c, m) =>
                    //{
                    //    Console.WriteLine("Client Message Sent");
                    //};

                    client.Socket.ConnectAsync(IPAddress.Parse("127.0.0.1"), 5150).Wait();
                    mre.WaitOne();

                    Console.Write("Send <Return To Disconnect>: ");
                    while (client.Socket.IsConnected)
                    {
                        var message = Console.ReadLine();
                        if (string.IsNullOrEmpty(message))
                        {
                            break;
                        }
                        client.Send(message);
                    }
                }
            }
            Console.WriteLine("Press Any Key To Return");
            Console.ReadKey();
        }