예제 #1
0
        //处理订阅收到的数据,然后发送给指定的Client
        protected virtual void ProcessSubscribe(object o, NetMQSocketEventArgs e)
        {
            //TODO https://netmq.readthedocs.io/en/latest/poller/   #Performance

            if (Logger.IsTraceEnabled)
            {
                Logger.Trace($"ProcessSubscribe -> ThreadID = {Thread.CurrentThread.ManagedThreadId}");
            }

            var topic = e.Socket.ReceiveFrameBytes();//TryReceiveMultipartMessage();
            var msg   = e.Socket.ReceiveFrameBytes();

            var dout = msg.FromProtobuf <Out>();

            var protocolPackage = NetSend.GetProtocolPackage(dout.Id);

            if (protocolPackage == null)
            {
                return;
            }

            var response = new PirateXResponsePackage()
            {
                HeaderBytes  = dout.HeaderBytes,
                ContentBytes = dout.BodyBytes
            };

            var bytes = protocolPackage.PackPacketToBytes(response);

            protocolPackage.Send(bytes);
        }
예제 #2
0
        public override void ExecuteCommand(ProxySession session, BinaryRequestInfo requestInfo)
        {
            var sw = new Stopwatch();

            sw.Start();
            var dout = session.AppServer.NetService.ProcessRequest(session, requestInfo.Body);

            Console.WriteLine($"---------{sw.ElapsedMilliseconds}----------");

            if (dout == null)
            {
                return;
            }

            var response = new PirateXResponsePackage()
            {
                HeaderBytes  = dout.HeaderBytes,
                ContentBytes = dout.BodyBytes
            };

            if (Equals(dout.Action, PirateXAction.Seed))
            {
                session.Rid = dout.Id;
                session.AppServer.Attach(session);
            }

            if (dout.LastNo >= 0)
            {
                session.LastNo = dout.LastNo;
            }

            var bytes = session.PackPacketToBytes(response);

            session.Send(bytes);

            if (Equals(dout.Action, PirateXAction.Seed))
            {
                var clientkey = dout.ClientKeys;
                var serverkey = dout.ServerKeys;
                var crypto    = dout.Crypto;

                //种子交换  记录种子信息,后续收发数据用得到
                session.PackKeys   = serverkey;
                session.UnPackKeys = clientkey;
                session.CryptoByte = crypto;
            }
        }
예제 #3
0
        public void pack_response_to_bytes_then_unpack_it()
        {
            var piratepack = new ProtocolPackage()
            {
            };
            var responseInfo = new PirateXResponseInfo()
            {
                Headers = new NameValueCollection()
                {
                    { "c", "test" },
                    { "t", "123456" }
                }
            };

            var responsepack = new PirateXResponsePackage()
            {
                HeaderBytes  = responseInfo.GetHeaderBytes(),
                ContentBytes = Encoding.UTF8.GetBytes("Hello World!")
            };

            var bytes = piratepack.PackPacketToBytes(responsepack);

            var unpackresponsepack = piratepack.UnPackToPacket(bytes);

            var responseInfo2 = new PirateXResponseInfo(unpackresponsepack.HeaderBytes);

            Console.WriteLine("pack head bytes");
            Console.WriteLine(string.Join(",", responsepack.HeaderBytes));

            Console.WriteLine("unpack head bytes");
            Console.WriteLine(string.Join(",", unpackresponsepack.HeaderBytes));

            Console.WriteLine("pack content bytes");
            Console.WriteLine(string.Join(",", responsepack.ContentBytes));

            Console.WriteLine("unpack content bytes");
            Console.WriteLine(string.Join(",", unpackresponsepack.ContentBytes));


            Assert.IsTrue(responsepack.HeaderBytes.SequenceEqual(unpackresponsepack.HeaderBytes));
            Assert.IsTrue(responsepack.ContentBytes.SequenceEqual(unpackresponsepack.ContentBytes));

            Assert.AreEqual($"{String.Join("&", responseInfo.Headers.AllKeys.Select(a => a + "=" + responseInfo.Headers[a]))}"
                            , $"{String.Join("&", responseInfo.Headers.AllKeys.Select(a => a + "=" + responseInfo2.Headers[a]))}");
        }
예제 #4
0
        //服务器向客户端下发数据
        protected virtual void ProcessResponse(object o, NetMQSocketEventArgs e)
        {
            //TODO https://netmq.readthedocs.io/en/latest/poller/   #Performance
            var msg = responseSocket.ReceiveMultipartMessage();//TryReceiveMultipartMessage();
            //msg[0].Buffer //版本号
            var action    = msg[1].ConvertToString();
            var sessionid = msg[2].ConvertToString();

            var clientkey = msg[3].Buffer;
            var serverkey = msg[4].Buffer;

            var header  = msg[5].Buffer;
            var content = msg[6].Buffer;

            var response = new PirateXResponsePackage()
            {
                HeaderBytes  = header,
                ContentBytes = content
            };

            var protocolPackage = NetSend.GetProtocolPackage(sessionid);

            //将消息下发到客户端
            if (protocolPackage == null)
            {
                return;
            }
            if (protocolPackage.PackKeys == null)
            {
                protocolPackage.PackKeys = serverkey;
            }
            if (protocolPackage.UnPackKeys == null)
            {
                protocolPackage.UnPackKeys = clientkey;
            }

            var bytes = protocolPackage.PackPacketToBytes(response);

            NetSend.Send(sessionid, bytes);
        }