Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
Ламер 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.04 c
2-1168510227
root
2007-01-11 13:10
2007.01.28
Как правельно обрабатывать исключения


2-1168708886
petrovi4-078
2007-01-13 20:21
2007.01.28
Про Китай


2-1168305883
Yuz
2007-01-09 04:24
2007.01.28
Помогите начинаещему)


15-1167850639
Kolan
2007-01-03 21:57
2007.01.28
Не пойму почему код работает :)


1-1165416784
Чапаев
2006-12-06 17:53
2007.01.28
Service application, ServiceType<>stWin32





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский