Server Tarafı:
Bu da Client Tarafı
Bilgisayar server telefon client olarak çalıştığında dosya telefonda oluşturulup bilgisayara gönderiliyor. Hiçbir sorun yok. Fakat server telefon client'da başka bir telefon olduğunda dosya clientda oluşturuluyor. server olan telefonda Start File ve Start Data memo'ya ekleniyor. Ama dosya server telefonda oluşmuyor. Dosya boyutu 7.34 kb büyüklüğünden olduğunu sanmıyorum. Neyi atlıyorum?
unit ServerUnit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Memo.Types, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, FMX.Media, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, IdGlobal, IdSocketHandle, system.Generics.Collections, FMX.StdCtrls, FMX.Edit, FMX.Objects; type TDataTransRec = Record Block : TBytes; PeerIp :String; IdData : Byte; Constructor Create (aData:TidBytes; Const aPeerIp : String); Function Info : String; Function Tostring : String; End; TVoiceserver = class(TForm) Memo1: TMemo; MediaPlayer1: TMediaPlayer; IdUDPServer1: TIdUDPServer; Panel1: TPanel; Image1: TImage; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); procedure Image1Click(Sender: TObject); private { Private declarations } public liste : TList<TDataTransRec>; StartPos:Integer; Procedure DosyaKaydet(Const aStartpos : integer); Function strdizin:String; end; var Voiceserver: TVoiceserver; implementation uses ioutils, Math; {$R *.fmx} procedure TVoiceserver.DosyaKaydet(const aStartpos: integer); var A:Integer; F:String; M:TMemoryStream; begin A := aStartpos+1; F := strdizin+Liste[A].Tostring; A := A + 1; if (Liste[A].Tostring = 'StartData') and (Liste[A].IdData = 3) then Begin M := TMemoryStream.Create; Repeat inc(A); if Liste[A].IdData = 0 then M.Write(Liste[A].Block, Length(Liste[A].Block)); Until Liste[A].IdData = 4 ; M.Position := 0; M.SaveToFile(F); M.Free; Liste.Clear; MediaPlayer1.FileName := F; MediaPlayer1.Play; End; end; procedure TVoiceserver.FormCreate(Sender: TObject); begin Liste := TList<TDataTransRec>.Create; end; procedure TVoiceserver.FormDestroy(Sender: TObject); begin FreeAndNil(Liste); end; procedure TVoiceserver.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); var w:TDataTransRec; S: String; begin W := TDataTransRec.Create(AData, ABinding.PeerIp); Liste.Add(W); S := W.Info; if W.IdData = 1 then StartPos := Liste.Count - 1; if W.IdData = 4 then DosyaKaydet(StartPos); if S <> '' then Memo1.Lines.Add(S); end; procedure TVoiceserver.Image1Click(Sender: TObject); begin close; end; procedure WorkArrays(var aWorking: array of integer); begin if High(aWorking) >= 0 then aWorking[0] := 1; if High(aWorking) >= 3 then aWorking[3] := 5; end; function TVoiceserver.strdizin: String; begin {$IFDEF ANDROID} Result := TPath.GetHomePath; {$ELSE} Result := TPath.GetHomePath + TPath.DirectorySeparatorChar + 'Unitech'; ForceDirectories(Result); {$ENDIF} Result := Result + TPath.DirectorySeparatorChar; end; { TDataTransRec } constructor TDataTransRec.Create(aData: TidBytes; const aPeerIp: String); var s:String; begin PeerIp := aPeerIp; SetLength(Block, Length(aData)); System.Move(aData[0],Block[0],Length(aData)); S := ToString; Iddata := 0; if Pos ('StartFile', S) > 0 then IdData := 1; if Pos ('StartData', S) > 0 then IdData := 3; if Pos ('EndData', S) > 0 then IdData := 4; end; function TDataTransRec.Info: String; begin Result := ToString; if (Pos ('StartFile', Result) > 0) or (Pos ('StartData', Result) > 0) or (Pos ('EndData', Result) > 0) then Result := PeerIp + '==>' + Result else Result := ''; end; function TDataTransRec.Tostring: String; var A : integer; begin for a := 0 to Length(Block)-1 do Result := Result + Char(Block[A]); end; end.
Bu da Client Tarafı
unit Mobileunit; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Ani, FMX.Objects, FMX.Media, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, MobilePermissions.Model.Signature, MobilePermissions.Model.Dangerous, MobilePermissions.Model.Standard, MobilePermissions.Component, FMX.Layouts, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Edit; type TForm1 = class(TForm) Rectangle1: TRectangle; FloatAnimation1: TFloatAnimation; MediaPlayer1: TMediaPlayer; IdUDPClient1: TIdUDPClient; MobilePermissions1: TMobilePermissions; Layout1: TLayout; Panel1: TPanel; Edit1: TEdit; Button1: TButton; Edit2: TEdit; Image1: TImage; Panel2: TPanel; GridPanelLayout1: TGridPanelLayout; procedure Rectangle1Click(Sender: TObject); procedure FloatAnimation1Finish(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Image1Click(Sender: TObject); procedure FormShow(Sender: TObject); private { Private declarations } public Micro : TAudioCaptureDevice; Index : Integer; Procedure StartRec; Function strdizin : String; Function FileName : String; end; var Form1: TForm1; ipno :string; implementation uses IdGlobal, IOUtils,FMX.ZDeviceInfo; {$R *.fmx} function TForm1.FileName: String; begin index := index + 1; Result := Format('Test%u.mp3', [index]); Result := strdizin + Result; end; procedure TForm1.FloatAnimation1Finish(Sender: TObject); begin StartRec; end; procedure TForm1.FormShow(Sender: TObject); var di: TZDeviceInfo; begin di := TZDeviceInfo.Create; try edit1.Text := di.IPAddress; finally di.Free; end; end; procedure TForm1.Image1Click(Sender: TObject); begin Close; end; procedure TForm1.Rectangle1Click(Sender: TObject); begin if rectangle1.Fill.Color <> TAlphaColors.Red then Begin rectangle1.Fill.Color := TAlphaColors.Red; StartRec; End else rectangle1.Fill.Color := TAlphaColors.Chartreuse; Rectangle1.Repaint; end; procedure TForm1.StartRec; var M : TMemoryStream; K : TidBytes; B : TBytes; A,L : Integer; begin if Micro.State = TCaptureDeviceState.Capturing then Begin Micro.StopCapture; M := TMemoryStream.Create; if FileExists(Micro.FileName) then begin M.LoadFromFile(Micro.FileName); IdUDPClient1.Send('StartFile', IndyTextEncoding_Utf8); IdUDPClient1.Send(ExtractFileName(Micro.FileName), IndyTextEncoding_Utf8); IdUDPClient1.Send('StartData', IndyTextEncoding_Utf8); M.Position := 0; L := 80; SetLength(K,L); SetLength(B,L); While M.Read(B,L) > 0 do begin for A := 0 to L-1 do K[A]:=B[A]; with IdUDPClient1 do SendBuffer(Host,Port,K); for A := 0 to L-1 do B[A]:=0; end; IdUDPClient1.Send('EndData', IndyTextEncoding_Utf8); end; End; if Rectangle1.Fill.Color <> TAlphaColors.Red then Exit; Micro.FileName := FileName; Micro.StartCapture; FloatAnimation1.Start; end; function TForm1.strdizin: String; begin {$IFDEF ANDROID} Result := TPath.GetHomePath; {$ELSE} Result := TPath.GetHomePath + TPath.DirectorySeparatorChar + 'Unitech'; ForceDirectories(Result); {$ENDIF} Result := Result + TPath.DirectorySeparatorChar; end; procedure TForm1.Button1Click(Sender: TObject); begin IdUDPClient1.Host := edit2.text; IdUDPClient1.Port := 5556; MobilePermissions1.Dangerous.RecordAudio := True; MobilePermissions1.Apply; Micro := TCaptureDeviceManager.Current.DefaultAudioCaptureDevice; Rectangle1.Enabled := Assigned(Micro); Index := 0; end; end.
Bilgisayar server telefon client olarak çalıştığında dosya telefonda oluşturulup bilgisayara gönderiliyor. Hiçbir sorun yok. Fakat server telefon client'da başka bir telefon olduğunda dosya clientda oluşturuluyor. server olan telefonda Start File ve Start Data memo'ya ekleniyor. Ama dosya server telefonda oluşmuyor. Dosya boyutu 7.34 kb büyüklüğünden olduğunu sanmıyorum. Neyi atlıyorum?