public override StreamInfo RegisterFileToDownload(NetworkStream stream, CompressMode compressMode, ClientInfo client, bool isWebSocket) { var bytes = GoStreamReader.ReadBlockToEnd(stream, compressMode, ProviderSetting.MaximumReceiveDataBlock, isWebSocket); var json = Encoding.UTF8.GetString(bytes); MethodCallInfo callInfo = ServerSerializationHelper.Deserialize <MethodCallInfo>(json); MethodCallbackInfo callback = new MethodCallbackInfo(); callback.Guid = callInfo.Guid; var serviceType = RegisteredServiceTypes[callInfo.ServiceName]; var sessionId = callInfo.Data.ToString(); var clientInfo = (from x in Services.ToArray() where x.Key.SessionId == sessionId select x.Key).FirstOrDefault(); if (clientInfo == null) { throw new Exception("RegisterFile client not found!"); } var service = FindClientServiceByType(clientInfo, serviceType); #if (NETSTANDARD1_6 || NETCOREAPP1_1) var method = serviceType.GetTypeInfo().GetMethod(callInfo.MethodName, RuntimeTypeHelper.GetMethodTypes(serviceType, callInfo).ToArray()); #else var method = serviceType.GetMethod(callInfo.MethodName, RuntimeTypeHelper.GetMethodTypes(serviceType, callInfo).ToArray()); #endif List <object> parameters = new List <object>(); int index = 0; var prms = method.GetParameters(); foreach (var item in callInfo.Parameters) { parameters.Add(ServerSerializationHelper.Deserialize(item.Value, prms[index].ParameterType)); index++; } if (method.ReturnType != typeof(StreamInfo)) { throw new Exception("return type for upload must StreamInfo!"); } else { StreamInfo data = null; data = (StreamInfo)method.Invoke(service, parameters.ToArray()); if (data == null) { throw new Exception($"StreamInfo cannot be null"); } var streamReader = data.Stream; data.Stream = null; callback.Data = ServerSerializationHelper.SerializeObject(data, this); SendCallbackData(callback, client); data.Stream = streamReader; return(data); } }
/// <summary> /// start client to reading stream and data from server /// </summary> /// <param name="client"></param> internal void StartToReadingClientData() { AsyncActions.Run(() => { try { var stream = _client.GetStream(); while (true) { //first byte is DataType var dataType = (DataType)stream.ReadByte(); //secound byte is compress mode var compresssMode = (CompressMode)stream.ReadByte(); // server is called client method if (dataType == DataType.CallMethod) { var bytes = GoStreamReader.ReadBlockToEnd(stream, compresssMode, ProviderSetting.MaximumReceiveDataBlock, IsWebSocket); if (SecuritySettings != null) { bytes = DecryptBytes(bytes); } var json = Encoding.UTF8.GetString(bytes); MethodCallInfo callInfo = JsonConvert.DeserializeObject <MethodCallInfo>(json); if (callInfo.Type == MethodType.User) { CallMethod(callInfo); } else if (callInfo.Type == MethodType.SignalGo) { if (callInfo.MethodName == "/MustReconnectUdpServer") { ReconnectToUdp(callInfo); } } } //after client called server method, server response to client else if (dataType == DataType.ResponseCallMethod) { var bytes = GoStreamReader.ReadBlockToEnd(stream, compresssMode, ProviderSetting.MaximumReceiveDataBlock, IsWebSocket); if (SecuritySettings != null) { bytes = DecryptBytes(bytes); } var json = Encoding.UTF8.GetString(bytes); MethodCallbackInfo callback = JsonConvert.DeserializeObject <MethodCallbackInfo>(json); var geted = ConnectorExtension.WaitedMethodsForResponse.TryGetValue(callback.Guid, out KeyValue <AutoResetEvent, MethodCallbackInfo> keyValue); if (geted) { keyValue.Value = callback; keyValue.Key.Set(); } } else if (dataType == DataType.GetServiceDetails) { var bytes = GoStreamReader.ReadBlockToEnd(stream, compresssMode, ProviderSetting.MaximumReceiveDataBlock, IsWebSocket); if (SecuritySettings != null) { bytes = DecryptBytes(bytes); } var json = Encoding.UTF8.GetString(bytes); getServiceDetialResult = JsonConvert.DeserializeObject <ProviderDetailsInfo>(json); if (getServiceDetialResult == null) { getServiceDetialExceptionResult = JsonConvert.DeserializeObject <Exception>(json); } getServiceDetailEvent.Set(); getServiceDetailEvent.Reset(); } else if (dataType == DataType.GetMethodParameterDetails) { var bytes = GoStreamReader.ReadBlockToEnd(stream, compresssMode, ProviderSetting.MaximumReceiveDataBlock, IsWebSocket); if (SecuritySettings != null) { bytes = DecryptBytes(bytes); } var json = Encoding.UTF8.GetString(bytes); getmethodParameterDetailsResult = json; getServiceDetailEvent.Set(); getServiceDetailEvent.Reset(); } else { //incorrect data! :| SignalGo.Shared.Log.AutoLogger.LogText("StartToReadingClientData Incorrect Data!"); Dispose(); break; } } } catch (Exception ex) { SignalGo.Shared.Log.AutoLogger.LogError(ex, "StartToReadingClientData"); Dispose(); } }); }
internal override StreamInfo RegisterFileStreamToDownload(MethodCallInfo Data) { if (IsDisposed || !_client.Connected) { return(null); } //connect to tcp #if (NETSTANDARD1_6 || NETCOREAPP1_1) var downloadFileSocket = new TcpClient(); var waitable = downloadFileSocket.ConnectAsync(_address, _port); waitable.Wait(); #else var downloadFileSocket = new TcpClient(_address, _port); #endif var socketStream = downloadFileSocket.GetStream(); downloadFileSocket.Client.Send(Encoding.UTF8.GetBytes("SignalGo/1.0")); //get OK SignalGo/1.0 int o = socketStream.ReadByte(); int k = socketStream.ReadByte(); //register client var json = JsonConvert.SerializeObject(new List <string>() { "/DownloadFile" }); List <byte> bytes = new List <byte>(); var jsonBytes = Encoding.UTF8.GetBytes(json); byte[] dataLen = BitConverter.GetBytes(jsonBytes.Length); bytes.AddRange(dataLen); bytes.AddRange(jsonBytes); GoStreamWriter.WriteToStream(socketStream, bytes.ToArray(), IsWebSocket); ///send method data json = JsonConvert.SerializeObject(Data); bytes = new List <byte>(); bytes.Add((byte)DataType.RegisterFileDownload); bytes.Add((byte)CompressMode.None); jsonBytes = Encoding.UTF8.GetBytes(json); dataLen = BitConverter.GetBytes(jsonBytes.Length); bytes.AddRange(dataLen); bytes.AddRange(jsonBytes); if (bytes.Count > ProviderSetting.MaximumSendDataBlock) { throw new Exception("SendData data length is upper than MaximumSendDataBlock"); } GoStreamWriter.WriteToStream(socketStream, bytes.ToArray(), IsWebSocket); //get OK SignalGo/1.0 //int o = socketStream.ReadByte(); //int k = socketStream.ReadByte(); //get DataType var dataType = (DataType)socketStream.ReadByte(); //secound byte is compress mode var compresssMode = (CompressMode)socketStream.ReadByte(); // server is called client method if (dataType == DataType.ResponseCallMethod) { var bytesArray = GoStreamReader.ReadBlockToEnd(socketStream, compresssMode, ProviderSetting.MaximumReceiveDataBlock, IsWebSocket); json = Encoding.UTF8.GetString(bytesArray); MethodCallInfo callInfo = JsonConvert.DeserializeObject <MethodCallInfo>(json); var data = JsonConvert.DeserializeObject <StreamInfo>(callInfo.Data.ToString()); data.Stream = socketStream; return(data); } return(null); }