public object Call(bool needProfile, bool manualSerialization, Object objOriginal, String methodName, object[] methodParams) { ClientTcp socket = null; if (server == null) { throw new NetworkException("Need to setup any server for use the RPC Client"); } try { socket = new ClientTcp(); socket.Connect(server.Ip, server.RpcServicePort); Sent(socket, manualSerialization, needProfile, objOriginal, methodName, methodParams); ResponseRemotable response = Receive(socket, objOriginal, methodName); if (response.Code == Code.OK) { return(response.MethodReturn); } else if (response.Code == Code.METHOD_THROW_ERROR) { throw new RpcException("[Server]: Remote method thrown some errors\n" + response.Except); } else { throw new RpcException("[Server]: RPC call terminated with some errors!\n" + response.Except); } } catch (SocketException e) { throw new ConnectException("Failed to connect to server: " + server.Ip + ":" + server.RpcServicePort, e); } finally { socket.Close(); } }
//async method can't receive out params! private ResponseRemotable Receive(ClientTcp socket, object objOriginal, string methodName) { //Debug.WriteLine(">> start RpcClient Receive Data"); ResponseRemotable response = new ResponseRemotable(); BinaryReader reader = null; long downloadTime = 0L; int downloadSize = 0; if (dataFlag == Code.CUSTOMSTREAM || dataFlag == Code.BSONSTREAM) { reader = new BinaryReader(socket.ReceiveWithHeaderSize()); } else { reader = new BinaryReader(socket.ReceiveWithHeaderDebug(ref downloadTime, ref downloadSize)); } //Debug.WriteLine(">> RpcClient Receive wait first flag"); dataFlag = reader.ReadByte(); //Debug.WriteLine(">> RpcClient Receive end first flag"); if (dataFlag == Code.CUSTOMSTREAM) { response.Code = Code.OK; response.MethodReturn = ((RpcSerializable)objOriginal).ReadMethodReturn(reader, methodName); } else if (dataFlag == Code.BSONSTREAM) { response.Code = Code.OK; response.MethodReturn = GetMethodReturn(reader); } else if (dataFlag == Code.CUSTOMSTREAMDEBUG) { response.Code = Code.OK; profile.UploadSize = reader.ReadInt32(); profile.UploadTime = reader.ReadInt64(); profile.ExecutionCpuTime = reader.ReadInt64(); response.MethodReturn = ((RpcSerializable)objOriginal).ReadMethodReturn(reader, methodName); profile.DonwloadTime = downloadTime; profile.DownloadSize = downloadSize; } else if (dataFlag == Code.BSONSTREAMDEBUG) { response.Code = Code.OK; profile.UploadSize = reader.ReadInt32(); profile.UploadTime = reader.ReadInt64(); profile.ExecutionCpuTime = reader.ReadInt64(); response.MethodReturn = GetMethodReturn(reader); profile.DonwloadTime = downloadTime; profile.DownloadSize = downloadSize; } else if (dataFlag == Code.METHOD_THROW_ERROR) { response.Code = dataFlag; response.Except = reader.ReadString(); } else { response.Code = Code.SERVER_ERROR; response.Except = "Code different from expected: " + dataFlag; } //Debug.WriteLine(">> end RpcClient Receive Data"); reader.Dispose(); return response; }
//async method can't receive out params! private ResponseRemotable Receive(ClientTcp socket, object objOriginal, string methodName) { //Debug.WriteLine(">> start RpcClient Receive Data"); ResponseRemotable response = new ResponseRemotable(); BinaryReader reader = null; long downloadTime = 0L; int downloadSize = 0; if (dataFlag == Code.CUSTOMSTREAM || dataFlag == Code.BSONSTREAM) { reader = new BinaryReader(socket.ReceiveWithHeaderSize()); } else { reader = new BinaryReader(socket.ReceiveWithHeaderDebug(ref downloadTime, ref downloadSize)); } //Debug.WriteLine(">> RpcClient Receive wait first flag"); dataFlag = reader.ReadByte(); //Debug.WriteLine(">> RpcClient Receive end first flag"); if (dataFlag == Code.CUSTOMSTREAM) { response.Code = Code.OK; response.MethodReturn = ((RpcSerializable)objOriginal).ReadMethodReturn(reader, methodName); } else if (dataFlag == Code.BSONSTREAM) { response.Code = Code.OK; response.MethodReturn = GetMethodReturn(reader); } else if (dataFlag == Code.CUSTOMSTREAMDEBUG) { response.Code = Code.OK; profile.UploadSize = reader.ReadInt32(); profile.UploadTime = reader.ReadInt64(); profile.ExecutionCpuTime = reader.ReadInt64(); response.MethodReturn = ((RpcSerializable)objOriginal).ReadMethodReturn(reader, methodName); profile.DonwloadTime = downloadTime; profile.DownloadSize = downloadSize; } else if (dataFlag == Code.BSONSTREAMDEBUG) { response.Code = Code.OK; profile.UploadSize = reader.ReadInt32(); profile.UploadTime = reader.ReadInt64(); profile.ExecutionCpuTime = reader.ReadInt64(); response.MethodReturn = GetMethodReturn(reader); profile.DonwloadTime = downloadTime; profile.DownloadSize = downloadSize; } else if (dataFlag == Code.METHOD_THROW_ERROR) { response.Code = dataFlag; response.Except = reader.ReadString(); } else { response.Code = Code.SERVER_ERROR; response.Except = "Code different from expected: " + dataFlag; } //Debug.WriteLine(">> end RpcClient Receive Data"); reader.Dispose(); return(response); }