![]() |
|
كيفي التفريق بين الرسائل النصية والملفات المرسلة ب Socket - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15) +--- الموضوع : كيفي التفريق بين الرسائل النصية والملفات المرسلة ب Socket (/showthread.php?tid=7666) |
كيفي التفريق بين الرسائل النصية والملفات المرسلة ب Socket - أسامة - 29-03-2016 السلام عليكم ورحمة الله وبركاته .... ليس لدي خبرة واسعة مع لغة الدلفي ولدي بعض المشاكل في التعامل مع مكونات السوكيت في DELPHI 10 ,Tserversocket,Tclientsoket وساقوم بتفصيل ماأنجزته والمشاكل الحالية والمطلوب للتوضيح أكثر .. المنجز . Server side . send file stream to all clients may connected . procedure TServer.btnsendfileClick(Sender: TObject); var ms: TFileStream; size: Integer; FileName: array [0..255] of char; i,total:integer; begin total:=SKserver.Socket.ActiveConnections; if total=0 then Exit; if OpenDialog1.Execute then begin ms:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead); ms.Position:= 0; Size:= MS.Size; try for i:=0 to total-1 do begin SKserver.Socket.Connections[i].SendBuf(Size,SizeOf(Size)); StrPLCopy(FileName, ExtractFileName(OpenDialog1.FileName), High(FileName)); SKserver.Socket.Connections[i].SendBuf(FileName, SizeOf(FileName)); SKserver.Socket.Connections[i].SendStream(ms); memstatues.Lines.Add('Waiting Client'+SKserver.Socket.Connections[i].RemoteAddress+'to recive'); end; except ms.Size:=0; end; end; ms.Size:=0; end; ------------------------------------------------ client side >> recive from server procedure TClient.skclientRead(Sender: TObject; Socket: TCustomWinSocket); var BytesReceived: Longint; CopyBuffer: Pointer; { buffer for copying } ChunkSize: Integer; TempSize: Integer; FileName: array [0..255] of char; pro:integer; const MaxChunkSize: Longint =8192; { copy in 8K chunks } begin If FSize=0 then begin If Socket.ReceiveLength>SizeOf(TempSize) then begin Socket.ReceiveBuf(TempSize,SizeOf(TempSize)); Socket.ReceiveBuf(FileName, sizeOf(FileName)); SaveDialog1.FileName:= FileName; Stream:=TMemoryStream.Create; Stream.SetSize(TempSize); Stream.Position:=0; FSize:= TempSize; writing:= True; End; End; If (FSize>0) and (writing) then begin GetMem(CopyBuffer, MaxChunkSize); While Socket.ReceiveLength>0 do Begin ChunkSize:= Socket.ReceiveLength; If ChunkSize > MaxChunkSize then ChunkSize:= MaxChunkSize; BytesReceived:= Socket.ReceiveBuf(CopyBuffer^,ChunkSize); Stream.Write(CopyBuffer^, BytesReceived); { ...write chunk } memstatues.Lines.Add('Recived :'+IntToStr(BytesReceived)+' byte'); Dec(FSize,BytesReceived); End; FreeMem(CopyBuffer, MaxChunkSize); If FSize=0 then If SaveDialog1.Execute then begin If FileExists(SaveDialog1.Filename) then DeleteFile(SaveDialog1.Filename); Stream.SaveToFile(SaveDialog1.Filename); Socket.SendText('File received!'); Stream.SetSize(0); FSize:= 0; Writing:= False; End; End; end; ------------------------------------------------- المشاكل يتم الأرسال والأستقبال مع رسائل خطأ رغم إتمام العملية بنجاح , وغالبا رسائل خطأ في الميموري message 1 > system erroe .code 6 the handle is invalid بمجرد أنهاء الأرسال من السيرفر message 2 > out of memort بمجرد التخزين في العميل ...... المطلوب حل هذه المشاكل وكيفية التفريق بين رسائل النصية والملفات المرسلة ... skclient.Socket.SendText Socket.ReceiveLength لاتعمل بشكل واضح للتفريق بين الاثنين |