Example #1
0
		protected override void Run()
		{
			bool foundService = false;
			string requestMessage = "mpos_serv_req_wp:" + appName + ":" + appVersion;

			while (running && !foundService)
			{
				Debug.WriteLine("#> [DiscoveryService]: Started Discovery Service for endpoint: " + server.Type + " and app: " + appName + "/" + appVersion);
				foundService = true;

				ClientTcp socket = null;
				try
				{
					socket = new ClientTcp(256, false);
					if (server.Type == EndpointType.SECONDARY_SERVER && !MposFramework.Instance.DeviceController.IsOnline())
					{
						throw new ConnectException("The mobile is completly offline!");
					}

					socket.Connect(server.Ip, servicePort);
					Sent(socket, requestMessage);
					Receive(socket);
				}
				catch (Exception e)
				{
					Debug.WriteLine("## [DiscoveryService]: Error -> \n" + e.ToString());
					foundService = false;
				}
				finally
				{
					if (running && !foundService)
					{
						Debug.WriteLine(">> [DiscoveryService]: Retry Discovery Service for endpoint: " + server.Type + ", in " + EndpointController.REPEAT_DISCOVERY_TASK + " ms");
						Thread.Sleep(EndpointController.REPEAT_DISCOVERY_TASK);
					}
					else
					{
						Debug.WriteLine("#> [DiscoveryService]: Finished Discovery Service for endpoint: " + server.Type + " on " + server.Ip);
						MposFramework.Instance.EndpointController.StartDecisionMaker(server);
					}

					socket.Close();
				}
			}
		}
Example #2
0
		protected override void Run()
		{
			Debug.WriteLine("#> [DeployRpcService]: Started Deploy App " + appName + "/" + appVersion + " on Remote Server (" + server.Ip + ":" + server.DeployAppPort + ")");
			ClientTcp socket = null;

			//async programming, but run synch mode
			task = new DependenceFileLoadTask();
			task.RunSynchronous();

			try
			{
				socket = new ClientTcp(false);
				socket.Connect(server.Ip, server.DeployAppPort);

				string deployRequest = "mpos_deploy_app:" + appName + ":" + appVersion;
				//Debug.WriteLine("[DEBUG]: sent -> " + deployRequest);
				Sent(socket, deployRequest);
				if (!ReceiveFeedbackMessage(socket))
				{
					throw new NetworkException("Problems in deploy request");
				}

				string mposDependence = "mpos_dependence_size:" + task.dependenceFiles.Count;
				//Debug.WriteLine("[DEBUG]: sent -> " + mposDependence);
				Sent(socket, mposDependence);
				if (!ReceiveFeedbackMessage(socket))
				{
					throw new NetworkException("Problems in deploy request");
				}

				SentFiles(socket);
				server.RpcServicePort = ReceiveServicePort(socket);
			}
			catch (Exception e)
			{
				Debug.WriteLine("## [DeployRpcService]: Any problem in I/O processing!\n" + e.ToString());
			}
			finally
			{
				Debug.WriteLine("#> [DeployRpcService]: Finished Deploy App " + appName + "/" + appVersion + " on Remote Server port: " + server.RpcServicePort);
				socket.Close();
			}
		}
Example #3
0
		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();
			}
		}
Example #4
0
		private void Receive(ClientTcp socket)
		{
			using (MemoryStream ms = socket.Receive())
			{
				//ignore 4 byte of header
				string jsonData = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length);
				if (jsonData != null && !jsonData.Equals(""))
				{
					if (server.JsonToPorts(jsonData))
					{
						MposFramework.Instance.EndpointController.DeployService(server);
					}

					Stop();
				}
				else
				{
					throw new ConnectException("Didn't received nothing about remote services in: " + server.Ip);
				}
			}
		}
Example #5
0
		private void Sent(ClientTcp socket, string message)
		{
			socket.Sent(Encoding.UTF8.GetBytes(message));
		}
Example #6
0
		//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;
		}
Example #7
0
		private void Sent(ClientTcp socket, bool manualSerialization, bool debug, object objOriginal, string methodName, object[] methodParams)
		{
			using (MemoryStream memoryStream = new MemoryStream(1024))
			{
				using (BinaryWriter writer = new BinaryWriter(memoryStream))
				{
					if (manualSerialization)
					{
						dataFlag = debug ? Code.CUSTOMSTREAMDEBUG : Code.CUSTOMSTREAM;

						writer.Write(objOriginal.GetType().FullName);
						writer.Write(methodName);
						((RpcSerializable)objOriginal).WriteMethodParams(writer, methodName, methodParams);
					}
					else
					{
						dataFlag = debug ? Code.BSONSTREAMDEBUG : Code.BSONSTREAM;

						writer.Write(objOriginal.GetType().FullName);
						writer.Write(methodName);

						byte[] bsonData = BsonFormatter.Serialize(methodParams);
						writer.Write(bsonData.Length);
						writer.Write(bsonData);
					}

					writer.Flush();

					byte[] headerSize = new byte[5];
					headerSize[4] = dataFlag;
					Array.Copy(BitConverter.GetBytes(memoryStream.Length), headerSize, 4);


					byte[] sentStream = new byte[(int)memoryStream.Length + 5];
					headerSize.CopyTo(sentStream, 0);
					memoryStream.ToArray().CopyTo(sentStream, headerSize.Length);

					socket.Sent(sentStream);
				}
			}
			//Debug.WriteLine(">> RpcClient Sent Data");
		}
Example #8
0
		private void SentFiles(ClientTcp socket)
		{
			foreach (DependenceFile dep in task.dependenceFiles)
			{
				MemoryStream memoryStream = new MemoryStream(64 * 1024);
				BinaryWriter writer = new BinaryWriter(memoryStream);

				writer.Write(dep.name);
				writer.Write(dep.length);
				writer.Write(dep.data, 0, dep.data.Length);
				writer.Flush();

				byte[] streamSize = BitConverter.GetBytes(memoryStream.Length);
				socket.Sent(streamSize);
				socket.Sent(memoryStream.ToArray());

				writer.Close();
				memoryStream.Close();

				if (!ReceiveFeedbackMessage(socket))
				{
					throw new NetworkException("Problems in sent file to server");
				}
				Debug.WriteLine("#> [DeployRpcService]: server receive file -> " + dep.name);
			}
		}
Example #9
0
		private int ReceiveServicePort(ClientTcp socket)
		{
			MemoryStream ms = socket.Receive();
			if (ms.Length > 0)
			{
				string message = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length);
				return Convert.ToInt32(message.Split(new char[] { ':' })[1]);
			}

			return -1;
		}
Example #10
0
		private bool ReceiveFeedbackMessage(ClientTcp socket)
		{
			MemoryStream ms = socket.Receive();
			if (ms.Length > 0)
			{
				string message = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length);
				return message.Equals("ok");
			}

			return false;
		}