Форум: "Начинающим";
Текущий архив: 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