public SharpDBConnection GetConnection() { NetMQSocket socket = new NetMQ.Sockets.RequestSocket(); // socket.Options.CopyMessages = false; socket.Options.Linger = TimeSpan.FromSeconds(5); socket.Connect(ConnectionString); var connection = new SharpDBConnection(this, socket, SerializerFactory()); m_connections.Add(connection); return(connection); }
private Protocol.RegisterServiceResponse Initialize() { NetMQ.Sockets.RequestSocket req = new NetMQ.Sockets.RequestSocket(); req.Connect(ServerAddress.RegisterServiceAddress); var stream = new System.IO.MemoryStream(); ProtoBuf.Serializer.Serialize(stream, new Tomato.Net.Protocol.RegisterService() { ServiceName = ServiceName, ProtocolList = MessageHandle.Instance.DicHandles.Keys.Select(i => (int)i).ToList(), IsRegister = true, }); if (req.TrySendFrame(stream.ToArray())) { return(ProtoBuf.Serializer.Deserialize <Protocol.RegisterServiceResponse>(new System.IO.MemoryStream(req.ReceiveFrameBytes()))); } return(null); }
/// <summary> /// 初始化服务模块 /// 在这里,我们将已注册的protocolID发送到路由端 Tomato.RouteService /// </summary> /// <returns></returns> private ResRegisterService _InitializeService(bool isRegister = true) { Logger.Debug($"{this.ServiceName} 正在向路由注册模块..."); NetMQ.Sockets.RequestSocket req = new NetMQ.Sockets.RequestSocket(); req.Connect(ServerAddress.RegisterServiceAddress); using (var stream = new System.IO.MemoryStream()) { ProtoBuf.Serializer.Serialize(stream, new ReqRegisterService() { ServiceName = ServiceName, ProtocolList = MessageHandle.DicHandles.Keys.Select(i => (int)i).ToList(), IsRegister = isRegister, }); if (req.TrySendFrame(stream.ToArray())) { return(ProtoBuf.Serializer.Deserialize <ResRegisterService>(new System.IO.MemoryStream(req.ReceiveFrameBytes()))); } } return(null); }
/// <summary> /// 发送请求 /// </summary> /// <typeparam name="R">接收对象类型</typeparam> /// <param name="header">头部对象</param> /// <param name="body">内容对象</param> /// <returns></returns> public Task <R> Request <R>(Header header, IProtocol body) where R : IProtocol { return(Task.Factory.StartNew <R>(() => { var req_msg = Serialize(header, body); using (var socket = new NetMQ.Sockets.RequestSocket(ServerAddress.RouterAddress)) { if (socket.TrySendMultipartMessage(Timeout, req_msg))//发送msg { NetMQMessage rep_msg = new NetMQMessage(); if (socket.TryReceiveMultipartMessage(Timeout, ref rep_msg))//接收msg { var msg_id = rep_msg[0].ConvertToInt32(); if (msg_id >= 800000 && msg_id <= 899999) { throw new RemoteServiceException($"错误代码 : {msg_id}\r\n{rep_msg[1].ConvertToString(Encoding.UTF8)}"); } else if (msg_id == (int)Tomato.Net.Protocol.ProtoEnum.Exception) { var exception = Deserialize <Tomato.Net.Protocol.ResException>(rep_msg); throw exception.GetException();//抛出服务器异常信息 } return Deserialize <R>(rep_msg); } else { throw new NetMQ.EndpointNotFoundException($"Request Guid : {header.GUID}.消息接收失败"); } } else { throw new NetMQ.EndpointNotFoundException($"Request Guid : {header.GUID}.消息发送失败"); } } })); }
//! //! receiver function, receiving the initial scene from the katana server (executed in separate thread) //! public void sceneReceiver() { //create NetMQ context NetMQContext ctx = NetMQContext.Create(); print("Trying to receive scene."); OnProgress(0.1f, "Init Scene Receiver.."); NetMQ.Sockets.RequestSocket sceneReceiver = ctx.CreateRequestSocket(); sceneReceiver.Connect("tcp://" + VPETSettings.Instance.serverIP + ":5565"); print("Server set up."); byte[] byteStream; // HEader print("header"); sceneReceiver.Send("header"); byteStream = sceneReceiver.Receive() as byte[]; print("byteStreamHeader size: " + byteStream.Length); if (doWriteScene) { writeBinary(byteStream, "header"); } int dataIdx = 0; VPETSettings.Instance.lightIntensityFactor = BitConverter.ToSingle(byteStream, dataIdx); print("VPETSettings.Instance.lightIntensityFactor " + VPETSettings.Instance.lightIntensityFactor); dataIdx += sizeof(float); VPETSettings.Instance.textureBinaryType = BitConverter.ToInt32(byteStream, dataIdx); OnProgress(0.15f, "..Received Header.."); //VpetHeader vpetHeader = SceneDataHandler.ByteArrayToStructure<VpetHeader>(byteStream, ref dataIdx); //VPETSettings.Instance.lightIntensityFactor = vpetHeader.lightIntensityFactor; //VPETSettings.Instance.textureBinaryType = vpetHeader.textureBinaryType; // Textures if (VPETSettings.Instance.doLoadTextures) { print("textures"); sceneReceiver.Send("textures"); byteStream = sceneReceiver.Receive() as byte[]; print("byteStreamTextures size: " + byteStream.Length); if (doWriteScene) { writeBinary(byteStream, "textu"); } sceneLoader.SceneDataHandler.TexturesByteData = byteStream; OnProgress(0.33f, "..Received Texture.."); } // Objects print("objects"); sceneReceiver.Send("objects"); byteStream = sceneReceiver.Receive() as byte[]; print("byteStreamObjects size: " + byteStream.Length); if (doWriteScene) { writeBinary(byteStream, "objec"); } sceneLoader.SceneDataHandler.ObjectsByteData = byteStream; OnProgress(0.80f, "..Received Objects.."); // Nodes print("nodes"); sceneReceiver.Send("nodes"); byteStream = sceneReceiver.Receive() as byte[]; print("byteStreamNodess size: " + byteStream.Length); if (doWriteScene) { writeBinary(byteStream, "nodes"); } sceneLoader.SceneDataHandler.NodesByteData = byteStream; OnProgress(0.9f, "..Received Nodes.."); sceneReceiver.Disconnect("tcp://" + VPETSettings.Instance.serverIP + ":5565"); sceneReceiver.Close(); print("done receive scene"); m_sceneTransferDirty = true; OnProgress(1.0f, "..Building Scene.."); }
//! //! receiver function, receiving the initial scene from the katana server (executed in separate thread) //! public void sceneReceiver() { //create NetMQ context NetMQContext ctx = NetMQContext.Create(); print("Trying to receive scene."); OnProgress(0.1f, "Init Scene Receiver.."); NetMQ.Sockets.RequestSocket sceneReceiver = ctx.CreateRequestSocket(); sceneReceiver.Connect("tcp://" + VPETSettings.Instance.serverIP + ":5565"); print("Server set up."); SceneObjectKatana sceneObjectKatana = new SceneObjectKatana(); bool success = false; if (VPETSettings.Instance.doLoadTextures) { print("textu"); sceneReceiver.Send("textu"); byte[] byteStreamTextures = sceneReceiver.Receive() as byte[]; print("byteStreamTextures size: " + byteStreamTextures.Length); success = sceneObjectKatana.parseTexture(byteStreamTextures); print("Texture Count: " + sceneObjectKatana.rawTextureList.Count); if (doWriteScene) { writeBinary(byteStreamTextures, "textu"); } OnProgress(0.33f, "..Received Texture.."); } print("objec"); sceneReceiver.Send("objec"); byte[] byteStreamObjects = sceneReceiver.Receive() as byte[]; print("byteStreamObjects size: " + byteStreamObjects.Length); success = sceneObjectKatana.parseObject(byteStreamObjects); print("Object Count: " + sceneObjectKatana.rawVertexList.Count); if (doWriteScene) { writeBinary(byteStreamObjects, "objec"); } OnProgress(0.80f, "..Received Objects.."); print("nodes"); sceneReceiver.Send("nodes"); byte[] byteStreamNodes = sceneReceiver.Receive() as byte[]; print("byteStreamNodess size: " + byteStreamNodes.Length); success = sceneObjectKatana.parseNode(byteStreamNodes); print("Node count: " + sceneObjectKatana.rawNodeList.Count); if (doWriteScene) { writeBinary(byteStreamNodes, "nodes"); } OnProgress(0.9f, "..Received Nodes.."); if (success) { receiveObjectQueue.Add(sceneObjectKatana); } sceneReceiver.Disconnect("tcp://" + VPETSettings.Instance.serverIP + ":5565"); sceneReceiver.Close(); print("done receive scene"); OnProgress(1.0f, "..Building Scene.."); }