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

Вниз

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

 
непонимающий   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.014 c
3-1143189367
Emik
2006-03-24 11:36
2006.05.21
InterBase+SQL


2-1146654488
De
2006-05-03 15:08
2006.05.21
Как грамотно написать?


1-1144745826
MiHoY
2006-04-11 12:57
2006.05.21
поиск дочернего окна


15-1145625698
Ketmar
2006-04-21 17:21
2006.05.21
php-форум, похожий на этот, а не на phpBB %-)


15-1146032967
Alex.
2006-04-26 10:29
2006.05.21
Конвертирование фотографий в DVD фильм.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский