Beispiel #1
0
        private Object InvokeMethod(CallRemotable call)
        {
            int size = call.MethodParams.Length;

            Type[] typeParam = new Type[size];
            for (int i = 0; i < size; i++)
            {
                typeParam[i] = call.MethodParams[i].GetType();
            }

            MethodInfo method = call.ObjLocal.GetType().GetMethod(call.MethodName, typeParam);

            return(method.Invoke(call.ObjLocal, call.MethodParams));
        }
Beispiel #2
0
        public override void ClientRequest(object connection)
        {
            TcpClient clientSocket = (TcpClient)connection;

            CallRemotable call = null;

            NetworkStream networkStream = clientSocket.GetStream();

            try
            {
                object objReturn = null;
                call = Receive(new BufferedStream(networkStream, bufferSize));

                if (call.Debug == null)
                {
                    objReturn = InvokeMethod(call);
                }
                else
                {
                    Stopwatch stopWatch = Stopwatch.StartNew();
                    objReturn = InvokeMethod(call);
                    stopWatch.Stop();

                    call.Debug.ExecutionCpuTime = stopWatch.ElapsedMilliseconds;
                }

                Sent(new BufferedStream(networkStream, bufferSize), objReturn, call);
            }
            catch (Exception e)
            {
                if (call != null)
                {
                    logger.Error("Method call: " + call.MethodName + ", from object: " + call.ObjLocal.GetType().Name + " failed!", e);
                }
                else
                {
                    logger.Error("CallRemotable have some params which didn't loading correctly.", e);
                }

                SentError(new BufferedStream(networkStream, bufferSize), e);
            }
            finally
            {
                networkStream.ReadByte();

                Close(ref clientSocket, ref networkStream);
            }
        }
Beispiel #3
0
        private void Sent(BufferedStream stream, Object objReturn, CallRemotable call)
        {
            if (call.CustomSerialization)
            {
                if (call.Debug == null)
                {
                    using (MemoryStream memoryStream = new MemoryStream(bufferSize))
                    {
                        BinaryWriter writer = new BinaryWriter(memoryStream);
                        writer.Write(Code.CUSTOMSTREAM);

                        call.ObjLocal.GetType().GetMethod("WriteMethodReturn", WriteMethodReturnTypes).Invoke(call.ObjLocal, new object[] { writer, call.MethodName, objReturn });
                        writer.Flush();

                        Sent(stream, memoryStream);
                    }
                }
                else
                {
                    using (MemoryStream memoryStream = new MemoryStream(bufferSize))
                    {
                        BinaryWriter writer = new BinaryWriter(memoryStream);
                        writer.Write(Code.CUSTOMSTREAMDEBUG);
                        writer.Write(call.Debug.DownloadSize);
                        writer.Write(call.Debug.DonwloadTime);
                        writer.Write(call.Debug.ExecutionCpuTime);
                        call.ObjLocal.GetType().GetMethod("WriteMethodReturn", WriteMethodReturnTypes).Invoke(call.ObjLocal, new object[] { writer, call.MethodName, objReturn });
                        writer.Flush();

                        Sent(stream, memoryStream);
                    }
                }
            }
            else
            {
                if (call.Debug == null)
                {
                    using (MemoryStream memoryStream = new MemoryStream(bufferSize))
                    {
                        BinaryWriter writer = new BinaryWriter(memoryStream);
                        writer.Write(Code.BSONSTREAM);

                        byte[] bsonData = BsonFormatter.Serialize(objReturn);
                        writer.Write(bsonData.Length);
                        writer.Write(bsonData);
                        writer.Flush();

                        Sent(stream, memoryStream);
                    }
                }
                else
                {
                    using (MemoryStream memoryStream = new MemoryStream(bufferSize))
                    {
                        BinaryWriter writer = new BinaryWriter(memoryStream);
                        writer.Write(Code.BSONSTREAMDEBUG);
                        writer.Write(call.Debug.DownloadSize);
                        writer.Write(call.Debug.DonwloadTime);
                        writer.Write(call.Debug.ExecutionCpuTime);

                        byte[] bsonData = BsonFormatter.Serialize(objReturn);
                        writer.Write(bsonData.Length);
                        writer.Write(bsonData);
                        writer.Flush();

                        Sent(stream, memoryStream);
                    }
                }
            }
            //logger.Info(">> RpcTcpServer Sent Data");
        }
Beispiel #4
0
        private CallRemotable Receive(BufferedStream stream)
        {
            //logger.Info(">> RpcTcpServer start Receive Data");
            CallRemotable call = new CallRemotable();

            byte[] headerData = new byte[5];
            stream.Read(headerData, 0, headerData.Length);
            int totalStreamSize = BitConverter.ToInt32(headerData, 0);

            if (headerData[4] == Code.CUSTOMSTREAM)
            {
                using (BinaryReader reader = new BinaryReader(ReadStream(stream, bufferSize, totalStreamSize)))
                {
                    //logger.Info(">> RpcTcpServer Receive: build stream");
                    string clsName = reader.ReadString();

                    object objLocal = assembly.NewInstance(clsName);
                    if (objLocal != null)
                    {
                        call.ObjLocal            = objLocal;
                        call.CustomSerialization = true;
                        call.MethodName          = reader.ReadString();

                        call.MethodParams = (object[])objLocal.GetType().GetMethod("ReadMethodParams", ReadMethodParamsTypes).Invoke(objLocal, new object[] { reader, call.MethodName });
                    }
                    else
                    {
                        throw new ClassNotFoundException("Update your dependence in side client, not found this class:" + clsName);
                    }
                }
            }
            else if (headerData[4] == Code.CUSTOMSTREAMDEBUG)
            {
                long totalDownloadTime = 0L;
                using (MemoryStream memoryStream = ReadStreamDebug(stream, bufferSize, totalStreamSize, ref totalDownloadTime))
                {
                    call.Debug = new RpcProfile();
                    using (BinaryReader reader = new BinaryReader(memoryStream))
                    {
                        string clsName = reader.ReadString();

                        object objLocal = assembly.NewInstance(clsName);
                        if (objLocal != null)
                        {
                            call.ObjLocal            = objLocal;
                            call.CustomSerialization = true;
                            call.MethodName          = reader.ReadString();
                            call.MethodParams        = (object[])objLocal.GetType().GetMethod("ReadMethodParams", ReadMethodParamsTypes).Invoke(objLocal, new object[] { reader, call.MethodName });

                            call.Debug.DownloadSize = (int)memoryStream.Length;
                            call.Debug.DonwloadTime = totalDownloadTime;
                        }
                        else
                        {
                            throw new ClassNotFoundException("Update your dependence in side client, not found this class:" + clsName);
                        }
                    }
                }
            }
            else if (headerData[4] == Code.BSONSTREAM)
            {
                using (BinaryReader reader = new BinaryReader(ReadStream(stream, 4096, totalStreamSize)))
                {
                    string clsName = reader.ReadString();

                    object objLocal = assembly.NewInstance(clsName);
                    if (objLocal != null)
                    {
                        call.ObjLocal     = objLocal;
                        call.MethodName   = reader.ReadString();
                        call.MethodParams = GetParams(reader);
                    }
                    else
                    {
                        throw new ClassNotFoundException("Update your dependence in side client, not found this class:" + clsName);
                    }
                }
            }
            else if (headerData[4] == Code.BSONSTREAMDEBUG)
            {
                long totalDownloadTime = 0L;
                using (MemoryStream memoryStream = ReadStreamDebug(stream, 4096, totalStreamSize, ref totalDownloadTime))
                {
                    call.Debug = new RpcProfile();
                    using (BinaryReader reader = new BinaryReader(memoryStream))
                    {
                        string clsName = reader.ReadString();

                        object objLocal = assembly.NewInstance(clsName);
                        if (objLocal != null)
                        {
                            call.ObjLocal           = objLocal;
                            call.MethodName         = reader.ReadString();
                            call.MethodParams       = GetParams(reader);
                            call.Debug.DownloadSize = (int)memoryStream.Length;
                            call.Debug.DonwloadTime = totalDownloadTime;
                        }
                        else
                        {
                            throw new ClassNotFoundException("Update your dependence in side client, not found this class:" + clsName);
                        }
                    }
                }
            }

            //logger.Info(">> RpcTcpServer end Receive Data");
            return(call);
        }
Beispiel #5
0
		private Object InvokeMethod(CallRemotable call)
		{
			int size = call.MethodParams.Length;
			Type[] typeParam = new Type[size];
			for (int i = 0; i < size; i++)
			{
				typeParam[i] = call.MethodParams[i].GetType();
			}

			MethodInfo method = call.ObjLocal.GetType().GetMethod(call.MethodName, typeParam);
			return method.Invoke(call.ObjLocal, call.MethodParams);
		}
Beispiel #6
0
		private void Sent(BufferedStream stream, Object objReturn, CallRemotable call)
		{
			if (call.CustomSerialization)
			{
				if (call.Debug == null)
				{
					using (MemoryStream memoryStream = new MemoryStream(bufferSize))
					{
						BinaryWriter writer = new BinaryWriter(memoryStream);
						writer.Write(Code.CUSTOMSTREAM);

						call.ObjLocal.GetType().GetMethod("WriteMethodReturn", WriteMethodReturnTypes).Invoke(call.ObjLocal, new object[] { writer, call.MethodName, objReturn });
						writer.Flush();

						Sent(stream, memoryStream);
					}
				}
				else
				{
					using (MemoryStream memoryStream = new MemoryStream(bufferSize))
					{
						BinaryWriter writer = new BinaryWriter(memoryStream);
						writer.Write(Code.CUSTOMSTREAMDEBUG);
						writer.Write(call.Debug.DownloadSize);
						writer.Write(call.Debug.DonwloadTime);
						writer.Write(call.Debug.ExecutionCpuTime);
						call.ObjLocal.GetType().GetMethod("WriteMethodReturn", WriteMethodReturnTypes).Invoke(call.ObjLocal, new object[] { writer, call.MethodName, objReturn });
						writer.Flush();

						Sent(stream, memoryStream);
					}
				}
			}
			else
			{
				if (call.Debug == null)
				{
					using (MemoryStream memoryStream = new MemoryStream(bufferSize))
					{
						BinaryWriter writer = new BinaryWriter(memoryStream);
						writer.Write(Code.BSONSTREAM);

						byte[] bsonData = BsonFormatter.Serialize(objReturn);
						writer.Write(bsonData.Length);
						writer.Write(bsonData);
						writer.Flush();

						Sent(stream, memoryStream);
					}
				}
				else
				{
					using (MemoryStream memoryStream = new MemoryStream(bufferSize))
					{
						BinaryWriter writer = new BinaryWriter(memoryStream);
						writer.Write(Code.BSONSTREAMDEBUG);
						writer.Write(call.Debug.DownloadSize);
						writer.Write(call.Debug.DonwloadTime);
						writer.Write(call.Debug.ExecutionCpuTime);

						byte[] bsonData = BsonFormatter.Serialize(objReturn);
						writer.Write(bsonData.Length);
						writer.Write(bsonData);
						writer.Flush();

						Sent(stream, memoryStream);
					}
				}
			}
			//logger.Info(">> RpcTcpServer Sent Data");
		}
Beispiel #7
0
		private CallRemotable Receive(BufferedStream stream)
		{
			//logger.Info(">> RpcTcpServer start Receive Data");
			CallRemotable call = new CallRemotable();

			byte[] headerData = new byte[5];
			stream.Read(headerData, 0, headerData.Length);
			int totalStreamSize = BitConverter.ToInt32(headerData, 0);

			if (headerData[4] == Code.CUSTOMSTREAM)
			{
				using (BinaryReader reader = new BinaryReader(ReadStream(stream, bufferSize, totalStreamSize)))
				{
					//logger.Info(">> RpcTcpServer Receive: build stream");
					string clsName = reader.ReadString();

					object objLocal = assembly.NewInstance(clsName);
					if (objLocal != null)
					{
						call.ObjLocal = objLocal;
						call.CustomSerialization = true;
						call.MethodName = reader.ReadString();

						call.MethodParams = (object[])objLocal.GetType().GetMethod("ReadMethodParams", ReadMethodParamsTypes).Invoke(objLocal, new object[] { reader, call.MethodName });
					}
					else
					{
						throw new ClassNotFoundException("Update your dependence in side client, not found this class:" + clsName);
					}
				}

			}
			else if (headerData[4] == Code.CUSTOMSTREAMDEBUG)
			{
				long totalDownloadTime = 0L;
				using (MemoryStream memoryStream = ReadStreamDebug(stream, bufferSize, totalStreamSize, ref totalDownloadTime))
				{
					call.Debug = new RpcProfile();
					using (BinaryReader reader = new BinaryReader(memoryStream))
					{
						string clsName = reader.ReadString();

						object objLocal = assembly.NewInstance(clsName);
						if (objLocal != null)
						{
							call.ObjLocal = objLocal;
							call.CustomSerialization = true;
							call.MethodName = reader.ReadString();
							call.MethodParams = (object[])objLocal.GetType().GetMethod("ReadMethodParams", ReadMethodParamsTypes).Invoke(objLocal, new object[] { reader, call.MethodName });

							call.Debug.DownloadSize = (int)memoryStream.Length;
							call.Debug.DonwloadTime = totalDownloadTime;
						}
						else
						{
							throw new ClassNotFoundException("Update your dependence in side client, not found this class:" + clsName);
						}
					}
				}
			}
			else if (headerData[4] == Code.BSONSTREAM)
			{
				using (BinaryReader reader = new BinaryReader(ReadStream(stream, 4096, totalStreamSize)))
				{
					string clsName = reader.ReadString();

					object objLocal = assembly.NewInstance(clsName);
					if (objLocal != null)
					{
						call.ObjLocal = objLocal;
						call.MethodName = reader.ReadString();
						call.MethodParams = GetParams(reader);
					}
					else
					{
						throw new ClassNotFoundException("Update your dependence in side client, not found this class:" + clsName);
					}
				}
			}
			else if (headerData[4] == Code.BSONSTREAMDEBUG)
			{
				long totalDownloadTime = 0L;
				using (MemoryStream memoryStream = ReadStreamDebug(stream, 4096, totalStreamSize, ref totalDownloadTime))
				{
					call.Debug = new RpcProfile();
					using (BinaryReader reader = new BinaryReader(memoryStream))
					{
						string clsName = reader.ReadString();

						object objLocal = assembly.NewInstance(clsName);
						if (objLocal != null)
						{
							call.ObjLocal = objLocal;
							call.MethodName = reader.ReadString();
							call.MethodParams = GetParams(reader);
							call.Debug.DownloadSize = (int)memoryStream.Length;
							call.Debug.DonwloadTime = totalDownloadTime;
						}
						else
						{
							throw new ClassNotFoundException("Update your dependence in side client, not found this class:" + clsName);
						}
					}
				}
			}

			//logger.Info(">> RpcTcpServer end Receive Data");
			return call;
		}