//处理订阅收到的数据,然后发送给指定的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); }
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; } }
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]))}"); }
//服务器向客户端下发数据 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); }