예제 #1
0
        private void DataOn(byte[] data, SocketAsyncEventArgs socketAsync, ZYNetRingBufferPool stream)
        {
            ReadBytes read = new ReadBytes(data);

            if (read.Length >= 4)
            {
                if (read.ReadInt32(out int lengt) && lengt == read.Length)
                {
                    if (read.ReadByte() == 0xED &&
                        read.ReadByte() == 0xCE &&
                        read.ReadByte() == 0xFE &&
                        read.ReadByte() == 0x10)
                    {
                        long sessionId = read.ReadInt64();

                        if (sessionId == 0)
                        {
                            var token = MakeNewToken(socketAsync, stream, ref sessionId);
                            if (token != null)
                            {
                                BufferFormat session = new BufferFormat(0x10FECEED);
                                session.AddItem(sessionId);
                                Send(token.Sendobj, session.Finish());
                            }
                        }
                        else
                        {
                            if (TokenList.TryGetValue(sessionId, out ASyncToken token))
                            {
                                token.SetSocketEventAsync(socketAsync);
                                socketAsync.UserToken = token;
                                Log.Debug($"ReUse Token {token.SessionKey}");
                            }
                            else
                            {
                                var _token = MakeNewToken(socketAsync, stream, ref sessionId);
                                if (_token != null)
                                {
                                    BufferFormat session = new BufferFormat(0x10FECEED);
                                    session.AddItem(sessionId);
                                    Send(_token.Sendobj, session.Finish());
                                }
                            }
                        }
                    }
                    else
                    {
                        Server.Disconnect(socketAsync.AcceptSocket);
                    }
                }
                else
                {
                    Server.Disconnect(socketAsync.AcceptSocket);
                }
            }
예제 #2
0
        protected async Task Calling(ReadBytes read)
        {
            var type = read.ReadByte();

            switch (type)
            {
            case 0:     //RUN CALL NOT RES
            {
                await DataOnByRead(read, 0);
            }
            break;

            case 1:     //RUN CALL HAVE RES
            {
                await DataOnByRead(read, 1);
            }
            break;

            case 2:     // RUN CALL RETURN
            {
                await DataOnByRead(read, 2);
            }
            break;

            default:
                throw new NetxException($"not is call type{type}", ErrorType.CallErr);
            }
        }
예제 #3
0
파일: NetxClient.cs 프로젝트: luyikk/NetX
        private async void SocketClient_BinaryInput(ISocketClient client, ISockAsyncEventAsClient socketAsync)
        {
            var fiberRw = await GetFiberRw(socketAsync);

            try
            {
                if (fiberRw == null)
                {
                    client.SetConnected(false, "ssl error");
                    return;
                }

                IWrite = fiberRw;

                if (!isConnect)
                {
                    await SendVerify(); //发送KEY和sessionid验证

                    using ReadBytes read = new ReadBytes(fiberRw);
                    await read.Init();

                    switch (read.ReadInt32())
                    {
                    case 1000:     //key check
                    {
                        var iserror = read.ReadBoolean();

                        if (!iserror)
                        {
                            Log.Trace(read.ReadString());

                            if (read.Memory.Length >= 1)
                            {
                                if (read.ReadByte() == 1)
                                {
                                    Mode = 1;
                                }
                            }

                            isConnect = true;
                            client.SetConnected();
                            await GetSessionId();
                            await ReadIng(fiberRw);
                        }
                        else
                        {
                            var msg = read.ReadString();
                            Log.Info(msg);
                            client.SetConnected(false, msg);
                        }
                    }
                    break;
                    }
                }

                client.ShutdownBoth();
            }
            catch (Exception er)
            {
                if (!client.IsConnect)
                {
                    client.SetConnected(false, er.Message);
                }
                else
                {
                    Log.Error(er);
                    client.ShutdownBoth();
                }
            }
        }
예제 #4
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());
            }
        }