예제 #1
0
파일: Program.cs 프로젝트: zzmzaizai/X
        static void Test6()
        {
            // UDP没有客户端服务器之分。推荐使用NetUri指定服务器地址
            var udp = new UdpServer();

            udp.Remote    = new NetUri("udp://smart.peacemoon.cn:7");
            udp.Received += (s, e) =>
            {
                XTrace.WriteLine("收到:{0}", e.ToStr());
            };
            udp.Open();
            udp.Send("新生命团队");
            udp.Send("学无先后达者为师!");

            // Tcp客户端会话。改用传统方式指定服务器地址
            var tcp = new TcpSession();

            tcp.Remote.Host = "smart.peacemoon.cn";
            tcp.Remote.Port = 13;
            tcp.Open();
            var str = tcp.ReceiveString();

            XTrace.WriteLine(str);

            // 产品级客户端用法。直接根据NetUri创建相应客户端
            var client = new NetUri("tcp://smart.peacemoon.cn:17").CreateRemote();

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

            Thread.Sleep(1000);
        }
예제 #2
0
        static void Test15()
        {
            //"我是超级大石头!".Speak();

            var tcp = new TcpSession();

            tcp.Log    = XTrace.Log;
            tcp.Remote = "tcp://127.0.0.1:8";
            //tcp.MessageDgram = true;
            tcp.AutoReconnect = 0;
            //tcp.Send("我是大石头!");
            tcp.Open();
            //tcp.Stream = new PacketStream(tcp.Stream);
            //var ms = new MemoryStream();
            for (int i = 0; i < 10; i++)
            {
                tcp.Send("我是大石头{0}!".F(i + 1));
                //var buf = "我是大石头{0}!".F(i + 1).GetBytes();
                //ms.WriteEncodedInt(buf.Length);
                //ms.Write(buf);
            }
            //ms.Position = 0;
            //tcp.Client.GetStream().Write(ms);

            while (tcp.Active)
            {
                var str = tcp.ReceiveString();
                Console.WriteLine(str);
            }

            //NetHelper.Debug = true;
            //var server = new StunServer();
            //server.Start();

            //Console.WriteLine(NetHelper.MyIP().GetAddress());
            //Console.WriteLine(IPAddress.Any.GetAddress());
            //Console.WriteLine(IPAddress.Loopback.GetAddress());

            //var buf = NetHelper.MyIP().GetAddressBytes();
            //buf[3] = 33;
            //Console.WriteLine(new IPAddress(buf).GetAddress());

            //var ip = NetHelper.ParseAddress("dg.newlifex.com");
            //Console.WriteLine(ip.GetAddress());
            //Console.WriteLine(Ip.GetAddress(ip.ToString()));

            //var client = new StunClient();
            //var rs = client.Query();
            //if (rs != null)
            //{
            //    //if (rs != null && rs.Type == StunNetType.Blocked && rs.Public != null) rs.Type = StunNetType.Symmetric;
            //    XTrace.WriteLine("网络类型:{0} {1}", rs.Type, rs.Type.GetDescription());
            //    XTrace.WriteLine("公网地址:{0} {1}", rs.Public, Ip.GetAddress(rs.Public.Address.ToString()));
            //}
        }
예제 #3
0
        void client_Received(Object sender, ReceivedEventArgs e)
        {
            //WriteLog("数据到来:{0} {1}", e.RemoteIPEndPoint, e.GetString());

            //var ss = e.GetString().Split(":");
            var ss = e.Stream.ToStr().Split(":");

            if (ss == null || ss.Length < 2)
            {
                return;
            }

            IPAddress address = null;

            if (!IPAddress.TryParse(ss[0], out address))
            {
                return;
            }
            var port = 0;

            if (!Int32.TryParse(ss[1], out port))
            {
                return;
            }
            var ep = new IPEndPoint(address, port);

            ParterAddress = ep;

            Client.Dispose();
            var server = Server;

            //Random rnd = new Random((Int32)DateTime.Now.Ticks);
            Thread.Sleep(Rand.Next(0, 2000));

            var client = new TcpSession();

            Client = client;
            //client.Address = server.LocalEndPoint.Address;
            //client.Port = server.LocalEndPoint.Port;
            //client.ReuseAddress = true;
            client.Local.EndPoint = server.Local.EndPoint;
            Console.WriteLine("准备连接对方:{0}", ep);
            try
            {
                //client.Connect(ep);
                client.Received += client_Received2;
                client.Open();

                Client.Send("Hello!");
            }
            catch (Exception ex)
            {
                WriteLog(ex.Message);
            }
        }
예제 #4
0
        /// <summary>登录。发送Bind指令,接收Bind_Resp响应</summary>
        /// <returns></returns>
        public Boolean Login()
        {
            WriteLog(String.Format("正在连接服务器…… {0}:{1}", IP, Port));
            var client = new TcpSession();

            Client = client;
            try
            {
                //client.Connect(IP, Port);
                //client.Connect(IP, Port);
                client.Remote.Host = IP;
                client.Remote.Port = Port;
            }
            catch (Exception ex)
            {
                var str = IP + ":" + Port.ToString();
                throw new XException("连接网关服务器" + str + "出错,请确定网络是否畅通!" + ex.Message, ex);
            }

            var cmd = new SGIPBind();

            cmd.LoginName     = SystemID;
            cmd.LoginPassowrd = Password;
            cmd.LoginType     = LoginTypes.SpToSmg;

            WriteLog("正在登录……");

            var session = client as ISocketSession;

            session.Send(cmd.GetStream().ReadBytes());
            var pk   = client.Receive();
            var resp = SGIPEntity.Read(pk.GetStream()) as SGIPResponse;

            if (resp == null)
            {
                throw new Exception("登录失败!服务器没有响应!");
            }
            if (resp.Result != SGIPErrorCodes.Success)
            {
                throw new Exception("登录失败!" + resp.Result.GetDescription());
            }

            //登录完成,开始读取指令
            client.Received += Client_Received;
            client.Open();

            Logined = true;

            WriteLog("登录成功!");

            return(true);
        }
예제 #5
0
        static void Test6()
        {
            var pfx = new X509Certificate2("../newlife.pfx", "newlife");

            //Console.WriteLine(pfx);

            //using var svr = new ApiServer(1234);
            //svr.Log = XTrace.Log;
            //svr.EncoderLog = XTrace.Log;

            //var ns = svr.EnsureCreate() as NetServer;

            using var ns = new NetServer(1234)
                  {
                      Name         = "Server",
                      ProtocolType = NetType.Tcp,
                      Log          = XTrace.Log,
                      SessionLog   = XTrace.Log,
                      SocketLog    = XTrace.Log,
                      LogReceive   = true
                  };

            ns.EnsureCreateServer();
            foreach (var item in ns.Servers)
            {
                if (item is TcpServer ts)
                {
                    ts.Certificate = pfx;
                }
            }

            ns.Received += (s, e) =>
            {
                XTrace.WriteLine("收到:{0}", e.Packet.ToStr());
            };
            ns.Start();

            using var client = new TcpSession
                  {
                      Name        = "Client",
                      Remote      = new NetUri("tcp://127.0.0.1:1234"),
                      SslProtocol = SslProtocols.Tls,
                      Log         = XTrace.Log,
                      LogSend     = true
                  };
            client.Open();

            client.Send("Stone");

            Console.ReadLine();
        }
예제 #6
0
        /// <summary>连接文件服务器</summary>
        /// <param name="hostname"></param>
        /// <param name="port"></param>
        public void Connect(String hostname, Int32 port)
        {
            if (Client == null)
            {
                var tcp = new TcpSession();
                //tcp.UseProcessAsync = false;
                // 因为第一个包发送文件头,所以必须在一个会话里面完成文件传输,不能使用断线重连
                tcp.AutoReconnect  = 0;
                tcp.ThrowException = true;
                Client             = tcp;
                tcp.Remote.Port    = port;
                tcp.Remote.Host    = hostname;

                tcp.Open();
            }
        }
예제 #7
0
        void EnsureClient()
        {
            EnsureServer();
            if (Client == null)
            {
                var server = Server;

                var client = new TcpSession();
                Client = client;
                //client.Address = server.LocalEndPoint.Address;
                //client.Port = server.LocalEndPoint.Port;
                //client.ReuseAddress = true;
                //client.Connect(HoleServer);
                //var session = client.CreateSession();
                var session = client as ISocketSession;
                session.Received += client_Received;
                client.Open();
            }
        }