Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Надежность передачи???   Найти похожие ветки 

 
Ламер 2.Х ©   (2007-01-07 13:11) [0]

Как Вы думаете, на сколько передача файла таким способом надежна, а какие могут возникнуть ошибки???

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   ClientSocket1: TClientSocket;
   ServerSocket1: TServerSocket;
   btnTestSockets: TButton;
   procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure ClientSocket1Disconnect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ClientSocket1Connect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ServerSocket1ClientConnect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure btnTestSocketsClick(Sender: TObject);
 private
   FStream: TFileStream;
   { Private-Deklarationen }
 public
   { Public-Deklarationen }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
 iLen: Integer;
 Bfr: Pointer;
begin
 iLen := Socket.ReceiveLength;
 GetMem(Bfr, iLen);
 try
   Socket.ReceiveBuf(Bfr^, iLen);
   FStream.Write(Bfr^, iLen);
 finally
   FreeMem(Bfr);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FStream := nil;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if Assigned(FStream) then
 begin
   FStream.Free;
   FStream := nil;
 end;
end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 if Assigned(FStream) then
 begin
   FStream.Free;
   FStream := nil;
 end;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 FStream := TFileStream.Create("c:\temp\test.stream.html", fmCreate or fmShareDenyWrite);
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 Socket.SendStream(TFileStream.Create("c:\temp\test.html", fmOpenRead or fmShareDenyWrite));
end;

procedure TForm1.btnTestSocketsClick(Sender: TObject);
begin
 ServerSocket1.Active := True;
 ClientSocket1.Active := True;
end;

end.


 
Anatoly Podgoretsky ©   (2007-01-07 13:41) [1]

> Ламер 2.Х  (07.01.2007 13:11:00)  [0]

Вот это лишнее

procedure TForm1.FormCreate(Sender: TObject);
begin
FStream := nil;
end;

Весь обработчик.

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FStream) then
begin
  FStream.Free;
->   FStream := nil;

Это тоже лишнее

А вот в обработчике
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Assigned(FStream) then
begin
  FStream.Free;
->   FStream := nil;

как раз обязательно.

Ошибки возникнуть могут любые, как правило сработает обработчик исключения, как минимум глобальный и приложение закроется. Если этого не должно произойти, то надо писать блоки защиты try except end.


 
Ламер 2.Х ©   (2007-01-07 14:08) [2]

Спасибо!!!
А как насчет целостности данных при передачи!!!
Если все пройдет "без ошибок" (явных)
на клиентском ПК все собирется как надо?


 
Ламер 2.Х ©   (2007-01-07 14:12) [3]

Может ето получше:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ScktComp, ExtCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   Image1: TImage;
   Image2: TImage;
   ClientSocket1: TClientSocket;
   ServerSocket1: TServerSocket;
   Button1: TButton;
   procedure Image1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure ClientSocket1Connect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ServerSocket1ClientRead(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
 private
   { Private declarations }
   Reciving: boolean;
   DataSize: integer;
   Data: TMemoryStream;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Image1Click(Sender: TObject);
begin
 // Это процедура для открытия сокета на ПРИЁМ (RECEIVING).
 // Button1.Click is this procedure as well.
 ClientSocket1.Active:= true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 // Открытие ОТПРАВЛЯЮЩЕГО (SENDING) сокета.
 ServerSocket1.Active:= true;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 // Посылаем команду для начала передачи файла.
 Socket.SendText("send");
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
 s, sl: string;
begin
 s:= Socket.ReceiveText;
 // Если мы не в режиме приёма:
 if not Reciving then
 begin
   // Теперь нам необходимо получить длину потока данных.
   SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
   StrLCopy(@sl[1], PChar(s), Length(sl)-1);
   DataSize:= StrToInt(sl);
   Data:= TMemoryStream.Create;
   // Удаляем информацию о размере из данных.
   Delete(s, 1, Length(sl));
   Reciving:= true;
 end;
 // Сохраняем данные в файл, до тех пор, пока не получим все данные.
 try
   Data.Write(s[1], length(s));
   if Data.Size = DataSize then
   begin
     Data.Position:= 0;
     Image2.Picture.Bitmap.LoadFromStream(Data);
     Data.Free;
     Reciving:= false;
     Socket.Close;
   end;
 except
   Data.Free;
 end;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var
 ms: TMemoryStream;
begin
 // Клиент получает команду на передачу файла.
 if Socket.ReceiveText = "send" then
 begin
   ms:= TMemoryStream.Create;
   try
     // Получаем данные на передачу.
     Image1.Picture.Bitmap.SaveToStream(ms);
     ms.Position:= 0;
     // Добавляем длину данных, чтобы клиент знал, сколько данных будет передано
     // Добавляем #0 , чтобы можно было определить, где заканчивается информация о размере.
     Socket.SendText(IntToStr(ms.Size) + #0);
     // Посылаем его.
     Socket.SendStream(ms);
   except
     // Итак, осталось освободить поток, если что-то не так.
     ms.Free;
   end;
 end;
end;

end.



 
Anatoly Podgoretsky ©   (2007-01-07 14:21) [4]

> Ламер 2.Х  (07.01.2007 14:12:03)  [3]

Теперь утечка памяти, если ошибки не будет, то ms и data не будет освобождены.


 
Ламер 2.Х ©   (2007-01-07 14:24) [5]

Спасибо большое!!!
Буду разбираться!!!



Страницы: 1 вся ветка

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
15-1168371669
Cincinnut
2007-01-09 22:41
2007.01.28
iPhone


15-1167866497
lookin
2007-01-04 02:21
2007.01.28
В Скайп?


2-1168257030
Marvin
2007-01-08 14:50
2007.01.28
работа с tmemo


1-1164875226
Igor_Zal
2006-11-30 11:27
2007.01.28
Тот же Stringgrid


5-1147344578
q-q
2006-05-11 14:49
2007.01.28
Как сделать DBGrid - наследник TGraphicControl