Пример #1
0
        void LogOnPack(byte[] data, SocketAsyncEventArgs asyn)
        {
            ReadBytesV2 read = new ReadBytesV2(data);

            int lengt; //数据包长度,用于验证数据包的完整性
            int cmd;   //数据包命令类型

            //注意这里一定要这样子写,这样子可以保证所有你要度的数据是完整的,如果读不出来 Raed方法会返回FALSE,从而避免了错误的数据导致崩溃
            if (read.ReadInt32(out lengt) && read.Length == lengt && read.ReadInt32(out cmd))
            {  //read.Read系列函数是不会产生异常的
                //根据命令读取数据包
                PACKTYPE cmdType = (PACKTYPE)cmd;

                switch (cmdType)
                {
                case PACKTYPE.LogOn:
                {
                    LOGON _logon;

                    if (read.ReadObject <LOGON>(out _logon))
                    {
                        //DOTO:验证用户

                        LogOut(_logon.username + "  登入成功");

                        UserManager tmp = new UserManager()
                        {
                            Asyn     = asyn,
                            Stream   = new ZYNetRingBufferPoolV2(),
                            UserName = _logon.username
                        };

                        asyn.UserToken = tmp;

                        userlist.Add(tmp);


                        LOGONRES senddata = new LOGONRES()
                        {
                            IsLogOn = true,
                            Msg     = "登入成功"
                        };

                        server.SendData(asyn.AcceptSocket, BufferFormatV2.FormatFCA(senddata));
                    }
                }
                break;
                }
            }
        }
Пример #2
0
        public void ReadDataSet(ZYSocketSuper server, ReadBytes read, SocketAsyncEventArgs socketAsync)
        {
            ReadDataSet rd;

            if (read.ReadObject <ReadDataSet>(out rd)) //读取请求DATASET 数据包
            {
                if (rd != null)
                {
                    rd.Data = new List <DataValue>();

                    rd.TableName = "table1";
                    rd.Data.Add(new DataValue()
                    {
                        V1 = "第1个",
                        V2 = "第2个",
                        V3 = "第3个",
                        V4 = "第4个",
                        V5 = "第5个"
                    });

                    rd.Data.Add(new DataValue()
                    {
                        V1 = "第6个",
                        V2 = "第7个",
                        V3 = "第8个",
                        V4 = "第9个",
                        V5 = "第10个"
                    });

                    rd.Data.Add(new DataValue()
                    {
                        V1 = "第11个",
                        V2 = "第12个",
                        V3 = "第13个",
                        V4 = "第14个",
                        V5 = "第15个"
                    });


                    rd.Data.Add(new DataValue()
                    {
                        V1 = "第16个",
                        V2 = "第17个",
                        V3 = "第18个",
                        V4 = "第19个",
                        V5 = "第20个"
                    });

                    server.SendData(socketAsync.AcceptSocket, BufferFormat.FormatFCA(rd)); //发送

                    Console.WriteLine((socketAsync.UserToken as User.UserInfo).UserName + " 读取了" + rd.TableName);
                }
            }
        }
Пример #3
0
        public void LogOn(ZYSocketSuper server, ReadBytes read, SocketAsyncEventArgs socketAsync)
        {
            Login p;

            if (read.ReadObject <Login>(out p))
            {
                if (p != null)
                {
                    if (User.UserManger.GetUserDataManger().CheckUser(p.UserName, p.PassWord)) //检查用户名密码是否正确
                    {
                        User.UserInfo user = new User.UserInfo()                               //建立一个新的用户对象 并且初始化 用户名
                        {
                            UserName = p.UserName
                        };

                        socketAsync.UserToken = user; //设置USERTOKEN

                        Message err = new Message()   //初始化MESSAGE数据包类
                        {
                            Type       = 2,
                            MessageStr = "登入成功"
                        };

                        server.SendData(socketAsync.AcceptSocket, BufferFormat.FormatFCA(err)); //发送此类

                        Console.WriteLine(user.UserName + " 登入");
                    }
                    else
                    {
                        Message err = new Message() //初始化用户名密码错误数据包
                        {
                            Type       = 1,
                            MessageStr = "用户名或密码错误"
                        };

                        server.SendData(socketAsync.AcceptSocket, BufferFormat.FormatFCA(err));
                    }
                }
            }
        }
Пример #4
0
        public void Ping(ZYSocketSuper server, ReadBytes read, SocketAsyncEventArgs socketAsync)
        {
            Ping pdata;

            if (read.ReadObject <Ping>(out pdata)) //读取PING 数据包
            {
                if (pdata != null)
                {
                    pdata.ServerReviceTime = DateTime.Now;                                    //设置服务器时间
                    server.SendData(socketAsync.AcceptSocket, BufferFormat.FormatFCA(pdata)); //发送返回
                }
            }
        }
Пример #5
0
        static void DataOn(byte[] data, SocketAsyncEventArgs e)
        {
            try
            {
                //建立一个读取数据包的类 参数是数据包
                //这个类的功能很强大,可以读取数据包的数据,并可以把你发送过来的对象数据,转换对象引用
                ReadBytes read = new ReadBytes(data);

                int lengt; //数据包长度,用于验证数据包的完整性
                int cmd;   //数据包命令类型

                //注意这里一定要这样子写,这样子可以保证所有你要度的数据是完整的,如果读不出来 Raed方法会返回FALSE,从而避免了错误的数据导致崩溃
                if (read.ReadInt32(out lengt) && read.Length == lengt && read.ReadInt32(out cmd))
                {  //read.Read系列函数是不会产生异常的
                    //根据命令读取数据包
                    switch (cmd)
                    {
                    case 1000:
                        testClass.PPo temp;
                        if (read.ReadObject <testClass.PPo>(out temp))
                        {
                            if (temp != null)
                            {
                                Console.WriteLine("Id:{0}\r\n Mn:{1} \r\n Guid:{2} \r\n DataLength:{3} \r\n\r\n", temp.Id, temp.Message, temp.guid, read.Length);
                            }
                        }
                        break;

                    case 1001:
                    {
                        int    id;
                        string mn;
                        Guid   guid;

                        if (read.ReadInt32(out id) && read.ReadString(out mn) && read.ReadObject <Guid>(out guid))
                        {
                            Console.WriteLine("Id:{0}\r\n Mn:{1} \r\n Guid:{2} \r\n DataLength:{3} \r\n\r\n", id, mn, guid, read.Length);
                        }
                    }
                    break;

                    case 1002:
                    {
                        int    id;
                        string mn;
                        string guid;

                        if (read.ReadInt32(out id) && read.ReadString(out mn) && read.ReadString(out guid))
                        {
                            Console.WriteLine("Id:{0}\r\n Mn:{1} \r\n Guid:{2} \r\n DataLength:{3} \r\n\r\n", id, mn, guid, read.Length);
                        }
                    }
                    break;

                    case 1003:
                    {
                        server.SendData(e.AcceptSocket, data);
                    }
                    break;
                    }
                }
            }
            catch (Exception er)
            {
                Console.WriteLine(er.ToString());
            }
        }
Пример #6
0
        /// <summary>
        /// 验证登入
        /// </summary>
        /// <param name="data"></param>
        /// <param name="e"></param>
        void LogOnPack(byte[] data, SocketAsyncEventArgs e)
        {
            ReadBytesV2 read = new ReadBytesV2(data, Deflate.Decompress);

            int lengt;
            int cmd;

            if (read.ReadInt32(out lengt) && lengt == read.Length && read.ReadInt32(out cmd))
            {
                PackType cmdtype = (PackType)cmd;

                switch (cmdtype)
                {
                case PackType.LogOn:
                {
                    LogOn logOn;
                    if (read.ReadObject <LogOn>(out logOn))
                    {
                        User user;

                        if ((user = UserList.Find(p => p.UserName == logOn.UserName && p.Password == logOn.Password)) != null)
                        {
                            LogOnRes res = new LogOnRes()
                            {
                                Path = user.Path,
                                IsOk = true,
                                Msg  = "登入成功"
                            };

                            UserManager userinfo = new UserManager()
                            {
                                Userinfo = user,
                                UserName = user.UserName,
                                Asyn     = e,
                                Stream   = e.UserToken as ZYNetRingBufferPoolV2
                            };

                            e.UserToken = userinfo;


                            server.SendData(e.AcceptSocket, BufferFormatV2.FormatFCA(res, Deflate.Compress));

                            AddLog(logOn.UserName + " 登入成功");
                        }
                        else
                        {
                            LogOnRes res = new LogOnRes()
                            {
                                IsOk = false,
                                Msg  = "用户名或密码错误"
                            };



                            server.SendData(e.AcceptSocket, BufferFormatV2.FormatFCA(res, Deflate.Compress));
                        }
                    }
                }
                break;
                }
            }
        }
Пример #7
0
        /// <summary>
        /// 数据包输入
        /// </summary>
        /// <param name="data">输入数据</param>
        /// <param name="socketAsync">该数据包的通讯SOCKET</param>
        static void BinaryInputHandler(byte[] data, SocketAsyncEventArgs socketAsync)
        {
            if (socketAsync.UserToken == null) //如果用户第一次登入
            {
                ReadBytes read = new ReadBytes(data);

                int length;
                int cmd;

                if (read.ReadInt32(out length) && length == read.Length && read.ReadInt32(out cmd))
                {
                    if (cmd == 1000) //如果用户发送的是登入数据包
                    {
                        Login p;

                        if (read.ReadObject <Login>(out p))
                        {
                            if (p != null)
                            {
                                if (User.UserManger.GetUserDataManger().CheckUser(p.UserName, p.PassWord)) //检查用户名密码是否正确
                                {
                                    User.UserInfo user = new User.UserInfo()                               //建立一个新的用户对象 并且初始化 用户名
                                    {
                                        UserName = p.UserName
                                    };

                                    socketAsync.UserToken = user; //设置USERTOKEN

                                    Message err = new Message()   //初始化MESSAGE数据包类
                                    {
                                        Type       = 2,
                                        MessageStr = "登入成功"
                                    };

                                    server.SendData(socketAsync.AcceptSocket, BufferFormat.FormatFCA(err)); //发送此类

                                    Console.WriteLine(user.UserName + " 登入");
                                }
                                else
                                {
                                    Message err = new Message() //初始化用户名密码错误数据包
                                    {
                                        Type       = 1,
                                        MessageStr = "用户名或密码错误"
                                    };

                                    server.SendData(socketAsync.AcceptSocket, BufferFormat.FormatFCA(err));
                                }
                            }
                        }
                    }
                    else //现在还没登入 如果有其他命令的请求那么 断开连接
                    {
                        server.Disconnect(socketAsync.AcceptSocket);
                    }
                }
                else //无法读取数据包 断开连接
                {
                    server.Disconnect(socketAsync.AcceptSocket);
                }
            }
            else
            {
                User.UserInfo user = socketAsync.UserToken as User.UserInfo; //读取用户USERTRKEN

                if (user != null)
                {
                    user.BuffManger.Write(data);

                    byte[] pdata;
                    while (user.BuffManger.Read(out pdata))
                    {
                        DataOn(pdata, socketAsync);
                    }
                }
            }
        }
Пример #8
0
        /// <summary>
        /// 验证登入
        /// </summary>
        /// <param name="data"></param>
        /// <param name="e"></param>
        static void LogOnPack(byte[] data, SocketAsyncEventArgs e)
        {
            ReadBytesV2 read = new ReadBytesV2(data, Deflate.Decompress);

            int lengt;
            int cmd;

            if (read.ReadInt32(out lengt) && lengt == read.Length && read.ReadInt32(out cmd))
            {
                PackType cmdtype = (PackType)cmd;

                switch (cmdtype)
                {
                case PackType.LogOn:
                {
                    LogOn logOn;
                    if (read.ReadObject <LogOn>(out logOn))
                    {
                        if (logOn.UserName.Equals(UserName, StringComparison.Ordinal) && logOn.PassWord.Equals(PassWord, StringComparison.Ordinal))
                        {
                            LogOnRes res = new LogOnRes()
                            {
                                IsOk = true,
                                Msg  = "登入成功"
                            };

                            UserManager userinfo = new UserManager()
                            {
                                Asyn   = e,
                                Stream = e.UserToken as ZYNetBufferReadStreamV2
                            };

                            e.UserToken = userinfo;


                            server.SendData(e.AcceptSocket, BufferFormatV2.FormatFCA(res, Deflate.Compress));
                        }
                        else
                        {
                            LogOnRes res = new LogOnRes()
                            {
                                IsOk = false,
                                Msg  = "用户名或密码错误"
                            };



                            server.SendData(e.AcceptSocket, BufferFormatV2.FormatFCA(res, Deflate.Compress));
                        }
                    }
                }
                break;
                }
            }
        }
Пример #9
0
        static void InputData(byte[] data, UserInfo user)
        {
            ReadBytesV2 read = new ReadBytesV2(data);

            int length;
            int Cmd;

            if (read.ReadInt32(out length) && length == read.Length && read.ReadInt32(out Cmd))
            {
                PCMD pcmd = (PCMD)Cmd;


                switch (pcmd)
                {
                case PCMD.REGION:     //注册
                    string key1;
                    string lanhost;
                    string mac;

                    if (read.ReadString(out key1) && read.ReadString(out lanhost) && read.ReadString(out mac))
                    {
                        user.Paw     = key1;
                        user.LANhost = lanhost;
                        user.Mac     = mac;

                        if (!UserList.ContainsKey(user.Paw))
                        {
                            if (UserList.TryAdd(user.Paw, user))
                            {
                                Console.WriteLine(user.Asyn.AcceptSocket.RemoteEndPoint.ToString() + "连接服务器 用户KEY:" + user.Paw + " 内网IP:" + user.LANhost + " 外网IP地址:" + user.WANIP);
                                BufferFormatV2 tmp = new BufferFormatV2((int)PCMD.SET);
                                MainServer.SendData(user.Asyn.AcceptSocket, tmp.Finish());
                            }
                        }
                    }
                    break;

                case PCMD.GETALLMASK:     //获取所有用户KEY列表
                    if (user.Paw != null)
                    {
                        BufferFormatV2 tmp = new BufferFormatV2((int)PCMD.ALLUSER);


                        IEnumerable <UserInfo> userlist = UserList.Values.Where(p => p.Mac == user.Mac && p.Paw != user.Paw);

                        tmp.AddItem(userlist.Count());

                        foreach (var item in userlist)
                        {
                            tmp.AddItem(item.Paw);
                        }

                        MainServer.SendData(user.Asyn.AcceptSocket, tmp.Finish());
                    }
                    break;

                case PCMD.CONN:     //连接目标主机
                    string key;

                    if (read.ReadString(out key))                                                                                  //读取客户端KEY
                    {
                        if (UserList.ContainsKey(key) && !string.IsNullOrEmpty(user.WANhost) && !string.IsNullOrEmpty(user.CPort)) //检查此客户单是否是可以提供连接
                        {
                            UserInfo info = UserList[key];                                                                         //读取用户对象


                            if (info.Mac != user.Mac)
                            {
                                return;
                            }

                            if (!user.WANIP.Equals(info.WANIP))     //如果不在同一个局域网
                            {
                                BufferFormatV2 tmp = new BufferFormatV2((int)PCMD.NOWCONN);
                                tmp.AddItem(user.WANhost + ":" + user.CPort);
                                tmp.AddItem(user.Paw);
                                MainServer.SendData(info.Asyn.AcceptSocket, tmp.Finish());
                            }
                            else
                            {
                                BufferFormatV2 tmp = new BufferFormatV2((int)PCMD.NOWCONN);
                                tmp.AddItem(user.LANhost + ":" + user.NatNetPort);
                                tmp.AddItem(user.Paw);
                                MainServer.SendData(info.Asyn.AcceptSocket, tmp.Finish());
                            }
                        }
                    }
                    break;

                case PCMD.LEFTCONN:
                    string key2;
                    if (read.ReadString(out key2))
                    {
                        if (UserList.ContainsKey(key2) && !string.IsNullOrEmpty(user.WANhost) && !string.IsNullOrEmpty(user.CPort))
                        {
                            UserInfo info = UserList[key2];      //读取用户对象

                            if (info.Mac != user.Mac)
                            {
                                return;
                            }

                            if (!user.WANIP.Equals(info.WANIP))     //如果不在同一个局域网
                            {
                                BufferFormatV2 tmp = new BufferFormatV2((int)PCMD.LEFTCONN);
                                tmp.AddItem(user.WANhost + ":" + user.CPort);
                                tmp.AddItem(user.Paw);
                                MainServer.SendData(info.Asyn.AcceptSocket, tmp.Finish());
                            }
                            else
                            {
                                BufferFormatV2 tmp = new BufferFormatV2((int)PCMD.LEFTCONN);
                                tmp.AddItem(user.LANhost + ":" + user.NatNetPort);
                                tmp.AddItem(user.Paw);
                                MainServer.SendData(info.Asyn.AcceptSocket, tmp.Finish());
                            }
                        }
                    }
                    break;

                case PCMD.GETALLUSER:
                {
                    BufferFormatV2 tmp = new BufferFormatV2((int)PCMD.GETALLUSER);

                    IEnumerable <UserInfo> userlist = UserList.Values.Where(p => p.Mac == user.Mac && p.Paw != user.Paw);

                    tmp.AddItem(userlist.Count());

                    foreach (var item in userlist)
                    {
                        tmp.AddItem(item.Paw);
                    }

                    MainServer.SendData(user.Asyn.AcceptSocket, tmp.Finish());
                }
                break;

                case PCMD.ProxyData:
                {
                    string keys;
                    byte[] datas;

                    if (read.ReadString(out keys) && read.ReadByteArray(out datas))
                    {
                        if (UserList.ContainsKey(keys))
                        {
                            BufferFormatV2 tmp = new BufferFormatV2((int)PCMD.ProxyData);
                            tmp.AddItem(user.Paw);
                            tmp.AddItem(datas);
                            MainServer.SendData(UserList[keys].Asyn.AcceptSocket, tmp.Finish());
                        }
                    }
                }
                break;
                }
            }
        }
Пример #10
0
        static void DataOn(byte[] data, SocketAsyncEventArgs e)
        {
            Console.WriteLine("ThreadId:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
            try
            {
                //建立一个读取数据包的类 参数是数据包
                //这个类的功能很强大,可以读取数据包的数据,并可以把你发送过来的对象数据,转换对象引用

                ReadBytes read = new ReadBytes(data);

                int lengt; //数据包长度,用于验证数据包的完整性
                int cmd;   //数据包命令类型

                //注意这里一定要这样子写,这样子可以保证所有你要度的数据是完整的,如果读不出来 Raed方法会返回FALSE,从而避免了错误的数据导致崩溃
                if (read.ReadInt32(out lengt) && read.Length == lengt && read.ReadInt32(out cmd))
                {  //read.Read系列函数是不会产生异常的
                    //根据命令读取数据包
                    switch (cmd)
                    {
                    case 1000:
                    {
                        int    version = read.ReadInt32();
                        long   data1   = read.ReadInt64();
                        float  data2   = read.ReadFloat();
                        double db1     = read.ReadDouble();
                        bool   b1      = read.ReadBoolean();
                        bool   b2      = read.ReadBoolean();
                        short  s1      = read.ReadInt16();
                        byte   sb1     = read.ReadByte();
                        string str1    = read.ReadString();
                        string str2    = read.ReadString();
                        byte[] datax   = read.ReadByteArray();

                        TestData tm2 = read.ReadObject <TestData>();

                        Console.WriteLine("int:" + version);
                        Console.WriteLine("long:" + data1);
                        Console.WriteLine("float:" + data2);
                        Console.WriteLine("double:" + db1);
                        Console.WriteLine("bool TRUE:" + b1);
                        Console.WriteLine("bool False:" + b2);
                        Console.WriteLine("short:" + s1);
                        Console.WriteLine("byte:" + sb1);
                        Console.WriteLine("string:" + str1);
                        Console.WriteLine("string:" + str2);
                        Console.WriteLine("bytes lengt:" + datax.Length);

                        BufferFormat buffer = new BufferFormat(1000);
                        buffer.AddItem(version);
                        buffer.AddItem(data1);
                        buffer.AddItem(data2);
                        buffer.AddItem(db1);
                        buffer.AddItem(b1);
                        buffer.AddItem(b2);
                        buffer.AddItem(s1);
                        buffer.AddItem(sb1);
                        buffer.AddItem(str1);
                        buffer.AddItem(str2);
                        buffer.AddItem(datax);


                        TestData tmx = new TestData()
                        {
                            Id   = 1,
                            Data = new List <string>()
                            {
                                "123123", "32123123"
                            },
                            Data2 = new List <Test2>()
                            {
                                new Test2 {
                                    A = 1, B = 2
                                }, new Test2 {
                                    A = 3, B = 4
                                }
                            }
                        };

                        buffer.AddItem(tmx);

                        server.SendData(e.AcceptSocket, buffer.Finish());
                    }
                    break;
                    }
                }
            }
            catch (Exception er)
            {
                Console.WriteLine(er.ToString());
            }
        }