كيفي التفريق بين الرسائل النصية والملفات المرسلة ب Socket
#1
السلام عليكم ورحمة الله وبركاته ....
ليس لدي خبرة واسعة مع لغة الدلفي ولدي بعض المشاكل في التعامل مع مكونات السوكيت في 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
لاتعمل بشكل واضح للتفريق بين الاثنين
الرد


الردود في هذا الموضوع
كيفي التفريق بين الرسائل النصية والملفات المرسلة ب Socket - بواسطة أسامة - 29-03-2016, 08:53 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم