Exemple #1
0
        static Int32 WorkOne(NetUri uri, Config cfg, Packet pk)
        {
            var count = 0;

            try
            {
                var client = uri.CreateRemote();
                (client as SessionBase).MaxAsync = 0;
                client.Open();
                for (var k = 0; k < cfg.Times; k++)
                {
                    client.Send(pk);

                    if (cfg.Reply)
                    {
                        var pk2 = client.Receive();
                        if (pk2.Count > 0)
                        {
                            count++;
                        }
                    }
                    else
                    {
                        count++;
                    }
                }
            }
            catch { }

            return(count);
        }
Exemple #2
0
        static void TestClient()
        {
            var uri = new NetUri("tcp://::1:1234");
            //var uri = new NetUri("tcp://net.newlifex.com:1234");
            var client = uri.CreateRemote();

            client.Log        = XTrace.Log;
            client.LogSend    = true;
            client.LogReceive = true;
            client.Received  += (s, e) =>
            {
                XTrace.WriteLine("收到:{0}", e.Packet.ToStr());
            };
            client.Open();

            // 定时显示性能数据
            _timer = new TimerX(ShowStat, client, 100, 1000);

            // 循环发送数据
            for (var i = 0; i < 5; i++)
            {
                Thread.Sleep(1000);

                var str = "你好" + (i + 1);
                client.Send(str);
            }

            client.Dispose();
        }
Exemple #3
0
        static void TestClient()
        {
            //var uri = new NetUri("tcp://127.0.0.1:1234");
            var uri    = new NetUri("tcp://www.armku.com:1234");
            var client = uri.CreateRemote();

            client.Log       = XTrace.Log;
            client.Received += (s, e) =>
            {
                var pk = e.Message as Packet;
                XTrace.WriteLine("收到:{0}", pk.ToStr());
            };
            //client.Add(new LengthFieldCodec { Size = 4 });
            client.Add <StandardCodecDemo>();

            // 打开原始数据日志
            var ns = client;

            ns.LogSend    = true;
            ns.LogReceive = true;

            client.Open();

            // 定时显示性能数据
            _timer = new TimerX(ShowStat, client, 100, 1000);

            // 循环发送数据
            for (var i = 0; i < 1; i++)
            {
                var str = "你好" + (i + 1);
                var pk  = new Packet(str.GetBytes());
                client.SendMessageAsync(pk);
            }
        }
Exemple #4
0
        public Task SetEndPoint(IPEndPoint endPoint)
        {
            var reBind = false;

            if (endPoint != null)
            {
                Console.WriteLine($"设置连接点为 {endPoint.Address} {endPoint.Port}");
                _endPoint = endPoint;
                reBind    = true;
            }

            if (endPoint != null && !Equals(_endPoint, endPoint))
            {
                _endPoint = endPoint;
                reBind    = true;
            }

            if (_netUri == null || reBind)
            {
                _netUri = new NetUri(NetType.Tcp, _endPoint);
            }

            if (_socketClient == null || reBind)
            {
                _socketClient = _netUri.CreateRemote();
            }

//            if (_socketClient.Disposed)
//            {
//                _socketClient = new TcpSession(new Socket(SocketType.Stream,ProtocolType.Tcp));
//                _socketClient.Remote = _netUri;
//            }

            return(Task.CompletedTask);
        }
Exemple #5
0
        /// <summary>创建客户端会话</summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        protected virtual HttpClient Create(NetUri uri)
        {
            var http = uri.CreateRemote() as HttpClient;

            http.Log = Log;
            //if (XTrace.Debug)
            //{
            //    http.LogSend = true;
            //    http.LogReceive = true;
            //}

            var req = http.Request;

            req.UserAgent = UserAgent;

            if (AutomaticDecompression != DecompressionMethods.None)
            {
                req.Compressed = true;
            }

            //if (!String.IsNullOrEmpty(Accept)) req.Headers[HttpRequestHeader.Accept + ""] = Accept;
            //if (!String.IsNullOrEmpty(AcceptLanguage)) req.Headers[HttpRequestHeader.AcceptLanguage + ""] = AcceptLanguage;
            //if (!String.IsNullOrEmpty(Referer)) req.Headers[HttpRequestHeader.Referer + ""] = Referer;
            req.Accept         = Accept;
            req.AcceptLanguage = AcceptLanguage;
            req.Referer        = Referer;

            return(http);
        }
Exemple #6
0
        /// <summary>创建客户端会话</summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        protected virtual HttpSession Create(NetUri uri)
        {
            var http = uri.CreateRemote() as HttpSession;

            http.Log = Log;
            //if (XTrace.Debug)
            //{
            //    http.LogSend = true;
            //    http.LogReceive = true;
            //}
            http.UserAgent = UserAgent;

            if (AutomaticDecompression != DecompressionMethods.None)
            {
                http.Compressed = true;
            }

            if (!String.IsNullOrEmpty(Accept))
            {
                http.Headers[HttpRequestHeader.Accept] = Accept;
            }
            if (!String.IsNullOrEmpty(AcceptLanguage))
            {
                http.Headers[HttpRequestHeader.AcceptLanguage] = AcceptLanguage;
            }
            if (!String.IsNullOrEmpty(Referer))
            {
                http.Headers[HttpRequestHeader.Referer] = Referer;
            }

            return(http);
        }
Exemple #7
0
        static void TestSend(String name, NetUri uri, Boolean isAsync, Boolean isSendData, Boolean isReceiveData)
        {
            Console.WriteLine();

            String msg    = String.Format("{0}Test_{1}_{2}!", name, uri.Type, isAsync ? "异步" : "同步");
            var    client = uri.CreateRemote();

            client.Error += OnError;
            if (isAsync && isReceiveData)
            {
                _are.Reset();
                client.Received += OnReceived;
                client.Open();
            }
            if (isSendData)
            {
                client.Send(msg);
            }

            var rs = false;

            if (isReceiveData)
            {
                if (!isAsync)
                {
                    try
                    {
                        //Console.WriteLine("客户端" + session + " " + session.ReceiveString());
                        var pk = client.Receive();
                        Console.WriteLine("客户端{0} 收到 [{1}]: {2}", client, pk.Count, pk.ToStr());

                        rs = true;
                    }
                    catch (Exception ex)
                    {
                        Debug.Fail("同步超时!" + ex.Message);
                    }
                }
                else
                {
                    if (!_are.WaitOne(2000))
                    {
                        Debug.Fail("异步超时!");
                    }
                    else
                    {
                        rs = true;
                    }
                }
            }
            client.Dispose();
            client = null;
            GC.Collect();

            XTrace.WriteLine(rs ? "成功!" : "失败!");
        }
Exemple #8
0
        static void Work(Config cfg)
        {
            var uri = new NetUri(cfg.Address);

            if (cfg.Content.IsNullOrEmpty())
            {
                cfg.Content = "学无先后达者为师";
            }
            var pk = new Packet(cfg.Content.GetBytes());

            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("NewLife.NC v{0}", AssemblyX.Entry.Version);

            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("目标:{0}", uri);
            Console.WriteLine("请求:{0:n0}", cfg.Times);
            Console.WriteLine("并发:{0:n0}", cfg.Thread);
            Console.WriteLine("并发:[{0:n0}] {1}", pk.Count, cfg.Content);
            Console.ResetColor();
            Console.WriteLine();

            var sw = Stopwatch.StartNew();

            // 多线程
            var ts    = new List <Task>();
            var total = 0;

            for (var i = 0; i < cfg.Thread; i++)
            {
                var tsk = Task.Factory.StartNew(() =>
                {
                    try
                    {
                        var client = uri.CreateRemote();
                        client.Open();
                        for (var k = 0; k < cfg.Times; k++)
                        {
                            client.Send(pk);
                            Interlocked.Increment(ref total);
                        }
                    }
                    catch { }
                }, TaskCreationOptions.LongRunning);
                ts.Add(tsk);
            }
            Task.WaitAll(ts.ToArray());

            sw.Stop();

            Console.WriteLine("完成:{0:n0}", total);

            var ms = sw.Elapsed.TotalMilliseconds;

            Console.WriteLine("速度:{0:n0}tps", total * 1000L / ms);
        }
        public void BindTest2()
        {
            var addr = NetHelper.GetIPsWithCache().FirstOrDefault(e => e.IsIPv4() && !IPAddress.IsLoopback(e));

            Assert.NotNull(addr);

            var uri    = new NetUri("https://www.newlifex.com");
            var client = uri.CreateRemote();

            client.Local.Address = addr;
            client.Open();
        }
Exemple #10
0
        public void BindTest3()
        {
            var addr = NetHelper.GetIPsWithCache().FirstOrDefault(e => e.IsIPv4() && !IPAddress.IsLoopback(e));

            Assert.NotNull(addr);

            var uri    = new NetUri("https://newlifex.com");
            var client = uri.CreateRemote() as TcpSession;

            client.Open();

            Assert.True(client.RemoteAddress.IsIPv4());
        }
Exemple #11
0
        /// <summary>设置远程地址</summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        public Boolean SetRemote(String uri)
        {
            var nu = new NetUri(uri);

            WriteLog("SetRemote {0}", nu);

            var ct = Client = nu.CreateRemote();

            ct.Log = Log;
            ct.Add(new StandardCodec {
                UserPacket = false
            });
            //ct.Add<JsonCodec2>();

            return(true);
        }
Exemple #12
0
        static async Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            packet = new Packet(TagerId, Sign);
            //连接到服务器
            var uri = new NetUri($"tcp://{serverip}:{port}");

            client     = uri.CreateRemote();
            client.Log = XTrace.Log;

            //数据收到事件
            client.Received += Client_Received;

            //注册
            var data = packet.GetLoginReq();

            client.Send(data);

            //发送心跳包
            Task.Run(async() =>
            {
                await RunHealth();
            });

            while (true)
            {
                Console.Write("发送几个初始信息:");
                string str = Console.ReadLine();
                int    sendCount;

                if (!int.TryParse(str, out sendCount))
                {
                    Console.WriteLine("请输入整数");
                }
                //发送初始化包
                for (int i = 0; i < sendCount; i++)
                {
                    data = packet.GetInitReq();
                    client.Send(data);
                    Console.WriteLine("发送初始化");
                }
            }

            await Task.Delay(-1);

            Console.ReadLine();
        }
Exemple #13
0
        //static Thread[] threads;
        static void TestClient()
        {
            Console.Write("请输入服务器地址:");
            var host = Console.ReadLine();
            var port = ReadInt("请输入服务器端口:", 1, 65535);

            var ep  = NetHelper.ParseEndPoint(host, port);
            var uri = new NetUri(NetType.Tcp, ep);

            Console.WriteLine("开始测试连接{0}……", uri);

            var session = uri.CreateRemote();

            session.Send("Hi");
            var rs = session.ReceiveString();

            session.Dispose();
            if (rs.IsNullOrWhiteSpace())
            {
                Console.WriteLine("连接失败!");
                return;
            }

            var threadcount = ReadInt("请输入线程数(建议20):", 1, 10000);
            var perthread   = ReadInt("请输入每线程连接数(建议500):", 1, 10000);
            //var time = ReadInt("请输入连接间隔(毫秒,建议10毫秒):", 1, 10000);
            var time = 10;

            var threads = new Thread[threadcount];

            for (int i = 0; i < threadcount; i++)
            {
                var th = new Thread(ClientProcess);
                th.IsBackground = true;
                th.Priority     = ThreadPriority.BelowNormal;
                th.Name         = "Client_" + (i + 1);

                threads[i] = th;
                var p = new TCParam()
                {
                    ID = i + 1, Count = perthread, Period = time, Uri = uri
                };
                th.Start(p);

                Thread.Sleep(100);
            }
        }
Exemple #14
0
        static Int32 WorkOne(NetUri uri, Config cfg, Packet pk)
        {
            var count = 0;

            try
            {
                var client = uri.CreateRemote();
                client.Open();
                for (var k = 0; k < cfg.Times; k++)
                {
                    client.Send(pk);
                    count++;
                }
            }
            catch { }

            return(count);
        }
Exemple #15
0
 static void Main(string[] args)
 {
     //10kb data pack
     for (int i = 0; i < 1024; i++)
     {
         data += "1234567890";
     }
     try
     {
         var uri = new NetUri(ConfigurationManager.AppSettings["URI"]);
         var pk  = new Packet(data.GetBytes());
         //
         var ts = new List <Task>();
         for (var i = 0; i < 10000; i++)
         {
             var tsk = Task.Factory.StartNew(() =>
             {
                 try
                 {
                     var client = uri.CreateRemote();
                     client.Add <StandardCodec>();
                     client.Add <ReadHandler>();
                     client.Open();
                     for (var k = 0; k < 100; k++)
                     {
                         client.SendMessageAsync(pk);
                     }
                     return(client);
                 }
                 catch { return(null); }
             }, TaskCreationOptions.LongRunning);
             ts.Add(tsk);
         }
         Task.WaitAll(ts.ToArray());
         //
         Console.WriteLine("All The Job Have Done");
         Console.ReadKey();
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.ToString());
         Console.ReadKey();
     }
 }
Exemple #16
0
        public void BindTest3()
        {
            Assert.True(Socket.OSSupportsIPv4);
            Assert.True(Socket.OSSupportsIPv6);

            var entry = Dns.GetHostEntry("www.newlifex.com");

            //var entry = Dns.GetHostEntry("www.newlifex.com.w.cdngslb.com");
            Assert.NotNull(entry);

            var addr = NetHelper.GetIPsWithCache().FirstOrDefault(e => !e.IsIPv4() && !IPAddress.IsLoopback(e));

            Assert.NotNull(addr);

            var uri    = new NetUri("https://www.newlifex.com");
            var client = uri.CreateRemote();

            client.Local.Address = addr;
            client.Open();
        }
Exemple #17
0
        static async Task <Int32> WorkOneAsync(NetUri uri, Config cfg, Packet pk)
        {
            var count = 0;

            try
            {
                var client = uri.CreateRemote();
                client.Open();

                await Task.Yield();

                for (var k = 0; k < cfg.Times; k++)
                {
                    client.Send(pk);
                    count++;

                    await Task.Yield();
                }
            }
            catch { }

            return(count);
        }
Exemple #18
0
        private static void Test8()
        {
            XTrace.WriteLine("启动两个服务端");

            // 不管是哪一种服务器用法,都具有相同的数据接收处理事件
            var onReceive = new EventHandler <ReceivedEventArgs>((s, e) =>
            {
                // ReceivedEventArgs中标准使用Data+Length或Stream表示收到的数据,测试时使用ToStr/ToHex直接输出
                // UserState表示来源地址IPEndPoint
                XTrace.WriteLine("收到 {0}:{1}", e.UserState, e.ToStr());

                // 拿到会话,原样发回去。
                // 不管是TCP/UDP,都会有一个唯一的ISocketSession对象表示一个客户端会话
                var session = s as ISocketSession;
                session.Send(e.Stream);
            });

            // 入门级UDP服务器,直接收数据
            var udp = new UdpServer(3388);

            udp.Received += onReceive;
            udp.Open();

            // 入门级TCP服务器,先接收会话连接,然后每个连接再分开接收数据
            var tcp = new TcpServer(3388);

            tcp.NewSession += (s, e) =>
            {
                XTrace.WriteLine("新连接 {0}", e.Session);
                e.Session.Received += onReceive;
            };
            tcp.Start();

            // 轻量级应用服务器(不建议作为产品级使用),同时在TCP/TCPv6/UDP/UDPv6监听指定端口,统一事件接收数据
            var svr = new NetServer();

            svr.Port      = 3377;
            svr.Received += onReceive;
            svr.Start();

            Console.WriteLine();

            // 构造多个客户端连接上面的服务端
            var uri1    = new NetUri(NetType.Udp, IPAddress.Loopback, 3388);
            var uri2    = new NetUri(NetType.Tcp, IPAddress.Loopback, 3388);
            var uri3    = new NetUri(NetType.Tcp, IPAddress.IPv6Loopback, 3377);
            var clients = new ISocketClient[] { uri1.CreateRemote(), uri2.CreateRemote(), uri3.CreateRemote() };

            // 打开每个客户端,如果是TCP,此时连接服务器。
            // 这一步也可以省略,首次收发数据时也会自动打开连接
            // TCP客户端设置AutoReconnect指定断线自动重连次数,默认3次。
            foreach (var item in clients)
            {
                item.Open();
            }

            Thread.Sleep(1000);
            Console.WriteLine();
            XTrace.WriteLine("以下灰色日志为客户端日志,其它颜色为服务端日志,可通过线程ID区分");

            // 循环发送几次数据
            for (int i = 0; i < 3; i++)
            {
                foreach (var item in clients)
                {
                    item.Send("第{0}次{1}发送".F(i + 1, item.Remote.Type));
                    var str = item.ReceiveString();
                    Trace.Assert(!str.IsNullOrEmpty());
                }
                Thread.Sleep(500);
            }

            XTrace.WriteLine("不用担心断开连接等日志,因为离开当前函数后,客户端连接将会被销毁");

            // 为了统一TCP/UDP架构,网络库底层(UdpServer/TcpServer)是重量级封装为ISocketServer
            // 实际产品级项目不关心底层,而是继承中间层(位于NewLife.Net)的NetServer/NetSession,直接操作ISocketSession
            // 平台级项目一般在中间层之上封装消息序列化,转化为消息收发或者RPC调用,无视网络层的存在
            // 以太网接口之上还有一层传输接口ITransport,它定义包括以太网和其它工业网络接口的基本数据收发能力
        }
Exemple #19
0
        private static async Task <Int32> WorkOneAsync(IPEndPoint local, NetUri uri, Config cfg, Packet pk)
        {
            var count = 0;

            try
            {
                Interlocked.Increment(ref _SessionCount);

                var client = uri.CreateRemote();
                if (cfg.Reply)
                {
                    (client as SessionBase).MaxAsync = 0;
                }
                if (local != null)
                {
                    client.Local.EndPoint = local;
                }

                client.Timeout = 30_000;
                client.Open();

                await Task.Yield();

                for (var k = 0; k < cfg.Times; k++)
                {
                    var ticks = _Counter.StartCount();

                    client.Send(pk);

                    if (cfg.Reply)
                    {
                        var pk2 = client.Receive();
                        if (pk2.Count > 0)
                        {
                            count++;
                        }
                    }
                    else
                    {
                        count++;
                    }

                    _Counter.StopCount(ticks);

                    if (cfg.Interval > 0)
                    {
                        await Task.Delay(cfg.Interval);
                    }
                    else
                    {
                        await Task.Yield();
                    }
                }
            }
            catch (Exception ex)
            {
                if (_LastErrors.TryAdd(ex.GetType()))
                {
                    XTrace.WriteLine("{0}=>{1}", local, uri);
                    XTrace.WriteException(ex);
                }
            }

            Interlocked.Decrement(ref _SessionCount);

            return(count);
        }
Exemple #20
0
        void Connect()
        {
            _Server = null;
            _Client = null;

            var uri = new NetUri(cbAddr.Text);
            // 网络封包
            var idx  = cbPacket.SelectedIndex;
            var fact = idx < 0 ? null : _packets.Result[idx].CreateInstance() as IPacketFactory;

            _Packet = fact.Create();

            var cfg = MessageConfig.Current;

            switch (cbMode.Text)
            {
            case "服务端":
                var svr = new NetServer();
                svr.Log       = cfg.ShowLog ? XTrace.Log : Logger.Null;
                svr.SocketLog = cfg.ShowSocketLog ? XTrace.Log : Logger.Null;
                svr.Port      = uri.Port;
                if (uri.IsTcp || uri.IsUdp)
                {
                    svr.ProtocolType = uri.Type;
                }
                svr.MessageReceived += OnReceived;

                svr.LogSend    = cfg.ShowSend;
                svr.LogReceive = cfg.ShowReceive;

                // 加大会话超时时间到1天
                svr.SessionTimeout = 24 * 3600;

                svr.SessionPacket = fact;

                svr.Start();

                "正在监听{0}".F(svr.Port).SpeechTip();

                if (uri.Port == 0)
                {
                    uri.Port = svr.Port;
                }
                _Server = svr;
                break;

            case "客户端":
                var client = uri.CreateRemote();
                client.Log              = cfg.ShowLog ? XTrace.Log : Logger.Null;
                client.MessageReceived += OnReceived;

                client.LogSend    = cfg.ShowSend;
                client.LogReceive = cfg.ShowReceive;

                client.Packet = _Packet;

                client.Open();

                "已连接服务器".SpeechTip();

                if (uri.Port == 0)
                {
                    uri.Port = client.Port;
                }
                _Client = client;
                break;

            default:
                return;
            }

            pnlSetting.Enabled = false;
            btnConnect.Text    = "关闭";

            // 添加地址
            var addr = uri.ToString();
            var list = cfg.Address.Split(";").ToList();

            if (!list.Contains(addr))
            {
                list.Insert(0, addr);
                cfg.Address = list.Join(";");
            }

            cfg.Save();

            _timer = new TimerX(ShowStat, null, 5000, 5000);

            BizLog = TextFileLog.Create("MessageLog");
        }