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

Вниз

сохранение в файл   Найти похожие ветки 

 
непонимающий   (2006-04-25 22:20) [0]

Здраствуйте! Я использую компонент TServerSocket, и мне нужно сохранить приходящие данные в файл, не подскажете как это сделать...
Я делаю вот так, но пишет ошибку ввода/вывода...

procedure TServer.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
begin
Len := Socket.ReceiveLength;
GetMem(Buf, Len);
Len := Socket.ReceiveBuf(Buf^, Len);
if (Len<>0) then
begin
 try
  AssignFile(F,"film.avi");
  Rewrite(F,1);
  BlockWrite(F,Buf^,schet);
  Write(F);
  CloseFile(F);
  finally
   Freemem(Buf);
  end;
 end;
end;

Не подскажете что я не так делаю...


 
MBo ©   (2006-04-26 05:47) [1]

Не вижу объявлений переменных, но, скорее всего, ^ у Buf надо убрать, да и выкрутасы с Len и schet настораживают


 
эксперт   (2006-04-26 06:16) [2]

они объявлены как глобальные:
 Len,schet: Integer;
 Buf: Pointer;
 F: File;


 
Сергей М. ©   (2006-04-26 08:46) [3]


> непонимающий   (25.04.06 22:20)


1. В справке к Rewrite() сказано:

If an external file with the same name already exists, it is deleted and a new empty file is created in its place

А ты это не учитываешь ..

2.
> BlockWrite(F,Buf^,schet);


Почему schet, когда д.б. Len ?

3.
> Write(F);


А это зачем ?

4. У тебя данные принятые ото всех клиентов будут записываться в один и тот же файл. Странная логика ...

5. В стравке к ReceiveBuf() написано:

If no bytes are read, ReceiveBuf returns –1

Почему же тогда, спрашивается, у тебя

> if (Len<>0) then


?


 
непонимающий   (2006-04-27 07:33) [4]

все учел, но все равно не пишет в файл, он его создает и все...

насчет 2 пункта: где-то было сказано что 3 параметр это количество передаваемых блоков а не их размер... вот я и не знаю как мне узнать это количество передаваемых блоков, как мне их описать не подскажете?

насчет 4 пункта: у меня будет только один клиент, и от него нужно принять эти данные и сохранить в файл, передача от клиента идет блоками...


 
ЮЮ ©   (2006-04-27 08:15) [5]


> 3 параметр это количество передаваемых блоков а не их размер

А когда размер блока = 1 (> Rewrite(F,1), то это одно и то же, а вот непонятный  schet может быть и нулю равен.
)

Ну и про Rewrite уже сказали: при неполучении данных файл тоже затрется


 
Сергей М. ©   (2006-04-27 08:30) [6]


> все учел


Приводи исправленный код.


> 3 параметр это количество передаваемых блоков а не их размер


Размер этого самого "блока" ты указал 2-м параметром вызова Rewrite() , и равен он у тебя 1, т.е. размер блока эквивалентен 1 байту.

Можешь считать, что переменная Len после вызова ReceiveBuf() как раз и содержит число таких "блоков" размером в 1 байт каждый.


> передача от клиента идет блоками


Методы SendBuf/ReceiveBuf не знают ни о каких "блоках", они оперируют размером передаваемой/принимаемой инф-ции, выраженном в кол-ве байт.


 
непонимающий   (2006-04-28 07:30) [7]

С сервером вроде разобрался, вот код, поправьте если неправильно:
Len := Socket.ReceiveLength;
GetMem(Buf, Len);
Len := Socket.ReceiveBuf(Buf^, Len);

if (Len<>-1) then
begin
 try
  AssignFile(F,"film.dat");
  Reset(F,sizeof(Buf));
  repeat
   BlockWrite(F,Buf,sizeof(Buf));
   Socket.SendText("priem");
  until sizeof(Buf)=0;
   CloseFile(F);
  finally
   Freemem(Buf);
  end;
end;

но как тогда быть с клиентом? вот код, но он не работает,как мне записать что в буфер нужно считывать из этого файла, вот код:
type
Tpacket = packed record
dan: array [0..2000000] of Byte;
md5: Cardinal;
end;
procedure packet;
var
 Client1: TClient1;
 pack: Tpacket;
 F1: File;
 FileName: String;
 buffer: Pointer;
............................
procedure packet;
begin
AssignFile(F1,FileName);
reset(F1,sizeof(pack.dan));  
try
 BlockRead(F1,pack.dan,????);   {????????}
finally
 CloseFile(F1);
end;
end;

в строчке {???????} если я пишу sizeof(pack.dan) то у меня сразу возникает ошибка, как мне там написать не подскажете?


 
MBo ©   (2006-04-28 07:59) [8]

Включаем логику, внимательно читаем хелп, и думаем над каждой написанной строчкой:
reset(F1,sizeof(pack.dan));
//открыли файл на чтение, задали размер записи

BlockRead(F1,pack.dan,????);  
//Для чтения одной записи что нужно поставить? Как ни странно, единицу!


 
Сергей М. ©   (2006-04-28 08:21) [9]

var
 FS: TFilestream;
..

Len := Socket.ReceiveLength;
if Len = 0 then Exit;
GetMem(Buf, Len);
try
 Len := Socket.ReceiveBuf(Buf^, Len);
 if Len <= 0 then Exit;
 FS := TFilestream.Create("film.dat", fmCreate);
 try
   FS.Seek(0, soFromEnd);
   FS.WriteBuffer(Buf^, Len);
   Socket.SendText("priem");
 finally
   FS.Free;
 end;
finally
Freemem(Buf);
end;


 
непонимающий   (2006-04-28 14:00) [10]

вообщем все сделал, и в коде клиента выдает ошибку ввода-вывода 32, на строке {???????}, помогите пожалуйста как разобраться с этой ошибкой и почему она возникает??? код приведен ниже...
type
Tpacket = packed record
dan: array [0..2000000] of Byte;
md5: Cardinal;
end;
procedure packet;
var
Client1: TClient1;
pack: Tpacket;
F1: File;
FileName: String;
buffer: Pointer;
............................
procedure packet;
begin
AssignFile(F1,FileName);
reset(F1,sizeof(pack.dan));    {????????}
try
BlockRead(F1,pack.dan,1);  
finally
CloseFile(F1);
end;
end;


 
Сергей М. ©   (2006-04-28 14:26) [11]

Тебя что, заклинило на Assign+ReXXX ?

TFileStream чем не угодил ?


 
непонимающий   (2006-04-28 15:42) [12]

мне нужно отправлять данные пакетами по 2 с чем-то мегабайта раз в секунду, т.е. один пакет в одну секунду, если это можно реализовать через TFileStream, то подскажите пожалуйста как... я не смог найти ни примеров ни литературы где было бы сказано что это можно сделать в TFileStream... если вас не затруднит, расскажите как это можно сделать по-другому...


 
Сергей М. ©   (2006-04-28 15:58) [13]


> мне нужно отправлять


Именно отправлять ? Т.е. о приеме речь не идет, с ним все в порядке ?

Тогда есть резон задействовать метод SendStream()

var
FS: TStream;
..

FS := TFilestream.Create("film.dat", fmOpenRead);
SomeClientSocket.Socket.SendStream(FS);


 
непонимающий   (2006-04-28 18:54) [14]

так мне же тут подсказали все, и сервер заработал вроде...
а вот клиент не хочет работать...
А как в методе TFilestream сделать чтоб он отправлял пакетами по например 2000000, и чтоб было sleep(1000)???


 
непонимающий   (2006-04-29 22:21) [15]

Удалено модератором
Примечание: Создание пустых сообщений


 
непонимающий   (2006-05-02 11:57) [16]

не подскажете почему может возникать ошибка на функции Reset()???


 
Сергей М. ©   (2006-05-02 12:05) [17]


> непонимающий



> TFilestream сделать чтоб он отправлял пакетами по например
> 2000000, и чтоб было sleep(1000)?


Это еще зачем ?
Объясни ..


> почему может возникать ошибка на функции Reset()?


Мало ли почему ..

Например потому что файл в этот момент открыт в режиме монопольного доступа.


 
Anatoly Podgoretsky ©   (2006-05-02 12:08) [18]

http://podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/PasFiles.html&file_id=app-files


 
непонимающий   (2006-05-03 09:59) [19]


> TFilestream сделать чтоб он отправлял пакетами по например
>
> > 2000000, и чтоб было sleep(1000)?
>
>
> Это еще зачем ?
> Объясни ..

задача такая поставлена...

Если использовавть на сервере FileStream то данные не приходят, он принимает один пакет и все, считает что поток закончен, уже все что можно испробовал ничего не получается...
Если клиентом использовать BlockRead, то он открывает файл считывает одну порцию файла и отправляет его и так по кругу...
Если можно через FileStream так сделать то объясмните пожалуйста как...
Прочитал эту статью, но не понятно как переслать через BlockRead файл и как через BlockWrite сохранить этот файл, они сохраняют один кусок файла(первый) и так по кругу...


 
непонимающий   (2006-05-03 11:08) [20]

клиент:
unit Client;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ScktComp, IdBaseComponent, IdComponent, IdRawBase,
 IdRawClient;

type
 TClient1 = class(TForm)
   ClientSocket1: TClientSocket;
   OpenDialog1: TOpenDialog;
   Edit1: TEdit;
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Label1: TLabel;
   Edit2: TEdit;
   ListBox1: TListBox;
   Label2: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure ClientSocket1Connect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
   procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
     ErrorEvent: TErrorEvent; var ErrorCode: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
type
TInform_packet = packed record
num_message: Cardinal;
dan_message: array [0..3885000] of Byte;
end;
procedure packet;
var
 Client1: TClient1;
 pack: TInform_packet;
 Filek: File;
 FileName: String;
implementation

{$R *.dfm}
procedure packet;
begin
Inc(pack.num_message);
AssignFile(Filek,FileName);
try
 {$I-}
 Reset(Filek,1);
 {$I+}
 
 if IOResult <> 0 then
 begin
   MessageDlg("Ioeaea ainooia e oaeeo " + FileName,mtError,[mbOk],0);
   exit;
 end;

 if not EOF(Filek) then
  begin
   BlockRead(Filek,pack.dan_message,sizeof(pack.dan_message));
  end
 else
  begin
   CloseFile(Filek);
   ShowMessage("oaee ia?aaai");
  end;

except
end;

end;

procedure TClient1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
 begin
  Edit1.Text:=OpenDialog1.FileName;
  FileName:=OpenDialog1.FileName;
 end;
end;

procedure TClient1.Button2Click(Sender: TObject);
begin
ClientSocket1.Host:=Edit2.Text;
ClientSocket1.Active:=True;
end;

procedure TClient1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
ClientSocket1.Socket.SendText("otpravka");
end;

procedure TClient1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
begin
packet();
if Socket.ReceiveText="priem" then
 begin
  Sleep(1000);
  Socket.SendBuf(pack,sizeof(pack));
  Socket.SendText("otpravka");
 end;
end;

procedure TClient1.ClientSocket1Error(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
begin
ErrorCode:=0;
ClientSocket1.Active:=False;
end;

end.



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

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

Наверх




Память: 0.53 MB
Время: 0.046 c
10-1119427098
Mozart_mcs
2005-06-22 11:58
2006.05.21
Не могу найти закладку, работаю в Word2003...


6-1138373276
BSimon
2006-01-27 17:47
2006.05.21
Вопрос по TidHTTP (Indy)


15-1145954816
Strate
2006-04-25 12:46
2006.05.21
Создание djvu


15-1145624942
oldman
2006-04-21 17:09
2006.05.21
Надо заполнить таблицу. Очень надо! :(


1-1144746277
DeadMoroz
2006-04-11 13:04
2006.05.21
Два и более обработчика события