Evoi de donnees tcp/ip avec ics

beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011 - 30 mars 2009 à 11:52
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011 - 11 mai 2009 à 09:04
Bonjour, je dois réaliser un client/serveur qui doit permettre l'envoie de fichiers via TCP/IP, j'arrive à envoyer une chaîne de caractère, mais je bloque complètement pour les fichiers. J'ai commencé à faire un bout de code mais ça ne fonctionne pas. Pouvez-vous m'aider ?
 
Coté client :
SessionConnected
var
   fs : TFileStream;
   Buf : array[0..4095] Of Byte;
begin
      fs:= TFileStream.Create('C:\Documents and Settings\Stagiaire3\a.pdf', fmOpenRead);
      fs.Read(Buf, SizeOf(Buf));
      fs.Write(Buf, SizeOf(Buf));
      WSocket1.Send(fs, SizeOf(Buf));
end;

Coté serveur:
DataAvailable
var
   fs : TFileStream;
   Len : int64;
   Buf : array[0..4095] Of Byte;
begin
   //Création du Filestream
   fs:= TFileStream.Create('C:\Documents and Settings\Stagiaire3\Bureau\azerty.pdf',fmCreate);
   Len:= WSocket1.Receive(@Buf, SizeOf(Buf));
   fs.Write(Buf, Len);
end;

Merci

24 réponses

beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
9 avril 2009 à 09:12
Côté serveur :
unit exemple;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WSocket, StdCtrls;

type
   TForm1 = class(TForm)
   Memo1: TMemo;
   WSocket1: TWSocket;
   procedure FormCreate(Sender: TObject);
   procedure WSocket1SessionAvailable(Sender: TObject; ErrCode: Word);
   procedure WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   private
      {Déclarations privées}
   public
      {Déclarations publiques}
   end;

var
  Form1: TForm1;

implementation
   {$R *.dfm}

const
  StreamDataSize = 4096-256-8-4-4;

type
  TStreamPacket = record // 4Ko
    FileName : shortstring;
    FileSize : int64;
    DataSize : integer;
    Datas    : array[0..StreamDataSize-1] of Byte;
  end;

const
  StreamPacketSize = SizeOf(TStreamPacket);

procedure TForm1.FormCreate(Sender: TObject);
begin
   WSocket1.Addr:= '192.168.0.112';
   WSocket1.Port:= '1985';
   WSocket1.Proto:= 'tcp';
   WSocket1.Listen;   Memo1.Lines.Add('Serveur en écoute');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   WSocket1.Close;
end;

procedure TForm1.WSocket1SessionAvailable(Sender: TObject; ErrCode: Word);
var
   NewSocket : TSocket;
begin
   {We need to accept the client connection}
   NewSocket:= WSocket1.Accept;

   {And then associate this connection with our client socket}
   WSocket1.Dup(NewSocket);   Memo1.Lines.Add('Connexion établie');
end;

procedure TForm1.WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
var
   PQ : TStreamPacket;
   FileNameReceived: string;
   Len : Integer;
begin
   Len:= WSocket1.Receive(@PQ, StreamDataSize);
   if (Len <= 0) then Exit;
   FileNameReceived:= 'C:\Documents and Settings\Bureau\test.jpg';
   with TFileStream.Create(FileNameReceived, fmCreate) do begin
      try
         if (Size < PQ.FileSize) then begin
         //while (Size < PQ.FileSize) do begin
            //Position:= Size - 1;
            Memo1.Lines.Add('Taille : ' + IntToStr(Size));
            Memo1.Lines.Add('Position : ' + IntToStr(Position));
            Write(PQ.Datas[0], PQ.DataSize);
            Memo1.Lines.Add('Données : ' + IntToStr(Len));
         end;
      finally
         Memo1.Lines.Add('Taille finale : ' + IntToStr(Size));
         Free;
      end;
   end;
   WSocket1.SendStr('OK');
end;

end.

Côté client :
unit exempleclient;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WSocket, StdCtrls;

type
   TForm1 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Edit2: TEdit;
   Memo1: TMemo;
   WSocket1: TWSocket;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
   procedure WSocket1SessionConnected(Sender: TObject; ErrCode: Word);
   procedure WSocket1DataAvailable(Sender: TObject; ErrCode: Word);

  private
    { Déclarations privées }
  public
    { Déclarations publiques }
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  StreamDataSize = 4096-256-8-4-4;

type
  TStreamPacket = record // 4Ko
    FileName : shortstring;
    FileSize : int64;
    DataSize : integer;
    Datas    : array[0..StreamDataSize-1] of byte;
  end;

const
  StreamPacketSize = SizeOf(TStreamPacket);

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   WSocket1.Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   WSocket1.Addr:= '192.168.0.112';
   WSocket1.Port:= '1985';
   WSocket1.Proto:= 'tcp';
   WSocket1.Connect;
end;

procedure TForm1.WSocket1SessionConnected(Sender: TObject; ErrCode: Word);
var
   PQ : TStreamPacket;
begin
   if (ErrCode <> 0) then
        Memo1.Lines.Add('Impossible de se connecter, erreur #' + IntToStr(ErrCode))
   else begin      Memo1.Lines.Add('Connecté');
      PQ.FileName:= ExtractFileName('C:\Documents and Settings\test.jpg');
      with TFileStream.Create('C:\Documents and Settings\test.jpg', fmOpenRead) do begin
         try
            PQ.FileSize:= Size;
            Position:= 0;
            //PQ.DataSize:= StreamDataSize;
            while (Position <> Size) do begin
               PQ.DataSize:= Read(PQ.Datas[0], StreamDataSize);
               Memo1.Lines.Add('Position : ' + IntToStr(Position));
               WSocket1.Send(@PQ, PQ.DataSize);
            end;
         finally
            free;
         end;
      end;
   end;
end;

procedure TForm1.WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
var
   str : string;
begin
   str:= WSocket1.ReceiveStr;
   Memo1.Lines.Add(str);
end;

end.
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
14 avril 2009 à 13:38
help me please !!
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
14 avril 2009 à 16:18
voici le code un peu modifié, j'arrive à recevoir quelques données, sur une image par exemple j'ai quelques morceaux

SERVEUR

unit exemple;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WSocket, StdCtrls;

type
   TForm1 = class(TForm)
   Memo1: TMemo;
   WSocket1: TWSocket;
   procedure FormCreate(Sender: TObject);
   procedure WSocket1SessionAvailable(Sender: TObject; ErrCode: Word);
   procedure WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   private
      FStream: TFileStream;
      FileNameReceived: string;
      {Déclarations privées}
      procedure TimeBoot;
   public
      {Déclarations publiques}
   end;

var
  Form1: TForm1;

implementation
   {$R *.dfm}

const
  StreamDataSize = {4096-256-8-4-4;}2048-128-4-2-2;{1024-64-2-1-1;}

type
  TStreamPacket = record // 4Ko
    FileName : shortstring;
    FileSize : int64;
    DataSize : integer;
    Datas    : array[0..StreamDataSize-1] of Byte;
  end;

const
  StreamPacketSize = SizeOf(TStreamPacket);

procedure TForm1.FormCreate(Sender: TObject);
begin
   WSocket1.Addr:= '192.168.0.112';
   WSocket1.Port:= '1985';
   WSocket1.Proto:= 'tcp';
   WSocket1.Listen;
   TimeBoot;   Memo1.Lines.Add('Serveur en écoute');

   FileNameReceived:= 'C:\Documents and Settings\Bureau\test.jpg';
   //if not FileExists(FileNameReceived) then
      FStream:= TFileStream.Create(FileNameReceived, fmCreate);
      FStream.Position:= 0;
   //else
      //FStream:= TFileStream.Create(FileNameReceived, fmOpenReadWrite);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   WSocket1.Close;
   FStream.Free;
end;

procedure TForm1.WSocket1SessionAvailable(Sender: TObject; ErrCode: Word);
var
   NewSocket : TSocket;
begin
   {We need to accept the client connection}
   NewSocket:= WSocket1.Accept;

   {And then associate this connection with our client socket}
   WSocket1.Dup(NewSocket);   Memo1.Lines.Add('Connexion établie');

end;

procedure TForm1.WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
var
   PQ : TStreamPacket;
   Len : Integer;
begin
   Len:= WSocket1.Receive(@PQ, StreamDataSize);
   if (Len <= 0) then Exit;
   //FStream.Position:= 0;
   try
      //if (FStream.Size < PQ.FileSize) then begin
      //while (Size < PQ.FileSize) do begin
         Memo1.Lines.Add('Taille AVANT : ' + IntToStr(FStream.Size));
         Memo1.Lines.Add('Position AVANT : ' + IntToStr(FStream.Position));
         FStream.Write(PQ.Datas[0], PQ.DataSize);
         Memo1.Lines.Add('Données : ' + IntToStr(Len));
         FStream.Position:= FStream.Size;
         Memo1.Lines.Add('Taille APRES : ' + IntToStr(FStream.Size));
         Memo1.Lines.Add('Position APRES : ' + IntToStr(FStream.Position));
      //end;
   finally
      Memo1.Lines.Add('Taille finale : ' + IntToStr(FStream.Size));
   end;
   WSocket1.ProcessMessages;
   //WSocket1.SendStr('OK');
end;

procedure TForm1.TimeBoot;
var
   Millisecondes, Secondes, Minutes, Heures, Jours , tps: Integer;
begin
   Millisecondes:= GetTickCount;
   Secondes:= Millisecondes div 1000;
   Minutes:= Secondes div 60;
   Secondes:= Secondes mod 60;
   Heures:= Minutes div 60;
   Minutes:= Minutes mod 60;
   Jours:= Heures div 24;
   Heures:= Heures mod 24;
   tps:= Secondes + (Minutes * 60) + (Heures * 3600);

   if ((Now - Jours) = Now) then
      Memo1.Lines.Add('Windows n''a pas planté depuis aujourd''hui à ' + TimeToStr(Time - (tps/24/3600)) + Format(', ce qui représente %d heure(s), %d minute(s), %d seconde(s).',[heures, minutes, secondes]))
   else
      Memo1.Lines.Add('Windows n''a pas planté depuis le ' + DateToStr(Now - Jours) + ' à ' + TimeToStr(Time - (tps/24/3600)) + Format(', ce qui représente %d jour(s), %d heure(s), %d minute(s), %d seconde(s).',[jours, heures, minutes, secondes]));
end;

end.

CLIENT

unit exempleclient;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, WSocket, StdCtrls;

type
   TForm1 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Edit2: TEdit;
   Memo1: TMemo;
   WSocket1: TWSocket;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
   procedure WSocket1SessionConnected(Sender: TObject; ErrCode: Word);
   procedure WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
    procedure FormCreate(Sender: TObject);

  private
   {Déclarations privées}
  public
    { Déclarations publiques }
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  StreamDataSize = {4096-256-8-4-4;{1024-64-2-1-1;}2048-128-4-2-2;

type
  TStreamPacket = record // 4Ko
    FileName : shortstring;
    FileSize : int64;
    DataSize : integer;
    Datas    : array[0..StreamDataSize-1] of Byte;
  end;

const
  StreamPacketSize = SizeOf(TStreamPacket);
     
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   WSocket1.Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   WSocket1.Addr:= '192.168.0.112';
   WSocket1.Port:= '1985';
   WSocket1.Proto:= 'tcp';
   WSocket1.Connect;
end;

procedure TForm1.WSocket1SessionConnected(Sender: TObject; ErrCode: Word);
var
   PQ : TStreamPacket;
   FStream : TFileStream;
   fs : TFileStream;
begin
   if (ErrCode <> 0) then
        Memo1.Lines.Add('Impossible de se connecter, erreur #' + IntToStr(ErrCode))
   else begin      Memo1.Lines.Add('Connecté');
      PQ.FileName:= ExtractFileName('C:\Documents and Settings\test.jpg');
      FStream:= TFileStream.Create('C:\Documents and Settings\test.jpg', fmOpenRead);
      fs:= TFileStream.Create('C:\Documents and Settings\Bureau\ploptest.jpg', fmCreate);
      try
         PQ.FileSize:= FStream.Size;
         FStream.Position:= 0;
         //PQ.DataSize:= StreamDataSize;
         while (FStream.Position <> FStream.Size) do begin
            PQ.DataSize:= FStream.Read(PQ.Datas[0], StreamDataSize);
            Memo1.Lines.Add('Position : ' + IntToStr(FStream.Position));
            WSocket1.Send(@PQ, StreamDataSize);
            fs.Write(PQ.Datas[0], PQ.DataSize);
            WSocket1.ProcessMessages;          
         end;
      finally
         FStream.Free;
         fs.Free;
      end;
   end;
end;

procedure TForm1.WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
var
   str : string;
begin
   str:= WSocket1.ReceiveStr;
   Memo1.Lines.Add(str);
end;

end.
0
beudet Messages postés 122 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 24 février 2011
11 mai 2009 à 09:04
Quelqu'un pourrait-il m'aider ?
0
Rejoignez-nous