![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приписать к потоку данных его размер
KIR © (2004-09-21 14:42:00)Народ, можно ли решить след. задачу: в сети имеются клиент и сервер (взаимодействуют через сокеты), клиент передает серверу информацию (строку символов) ввиде потока данных, но для правильного чтения этого потока в его (потока) первых 4 байтах необходимо указывать его (потока) длинну... можно ли как-то это сделать?
ASMiD (2004-09-21 15:07:00) [1]примени следующее извращение
tr : record
case byte of
0:(b1:byte;i1:integer);
1:(st:string[4]);
end;
tr.b1:=4;
tr.i1:=Size;
StringStream.WriteString(tr.st);
KIR (2004-09-21 14:59:00) [2]>ASMiD (21.09.04 14:57) [19]
Тогда, подскажи, как средствами PhP, которые на сокет может кидать только строки. Кинуть строку вместе с ее длинной.
ASMiD (2004-09-21 14:57:00) [3]А какая разница на чем писать?
KIR (2004-09-21 14:55:00) [4]Вообще-то вопрос в том, как в целом приписать к потоку его длинну. Т.к. возможно, что данные на сервер будут поступать с клиента не обязательно написанного на Дельфе или Билдере... А чтоб правильно считать требуется в первых 4 байтах иметь длинну... в том ивопрос как алгоритмически дополнить бинарный поток бинарными же данными...
Digitman (2004-09-21 14:54:00) [5]var
Size: Integer;
..
StringStream.WriteBuffer(Size, SizeOf(Size));
StringStream.WriteString(..);
StringStream.WriteString(..);
StringStream.WriteString(..);
..
StringStream.WriteString(..);
Size := StringStream.Size - SizeOf(Size);
StringStream.Seek(0, soFromBeginning);
StringStream.WriteBuffer(Size, SizeOf(Size));
StringStream.Seek(0, soFromBeginning);
Суслик (2004-09-21 14:53:00) [6]что такое readstream?
KIR (2004-09-21 14:52:00) [7]сорри:
//на стороне клиента
Stream := TStringStream.Create('');
Client.OpenWriteBuffer;
Client.WriteStream(Stream);
Client.CloseWriteBuffer;
//на стороне сервера
With AThread.Connection do
begin
Stream := TStringStream.Create('');
ReadStream(Stream,-1,False);
Stream.Seek(0,soFromBeginning);
Memo1.Lines.LoadFromStream(Stream);
Stream.Free;
end;
ASMiD (2004-09-21 14:52:00) [8]В TStringStream есть метод Write Его надо вызвать в самом начале, когда поток пуст, а в качестве Buffer (см. Delphi Help) переменную, в которой храниться длина потока.
KIR (2004-09-21 14:51:00) [9]
//на стороне клиента
Stream := TStringStream.Create('');
ReadStream(Stream,-1,False);
Client.OpenWriteBuffer;
Client.WriteStream(Stream);
Client.CloseWriteBuffer;
//на стороне сервера
With AThread.Connection do
begin
Stream := TStringStream.Create('');
ReadStream(Stream,-1,False);
Stream.Seek(0,soFromBeginning);
Memo1.Lines.LoadFromStream(Stream);
Stream.Free;
end;
Суслик (2004-09-21 14:51:00) [10]Тогда у тебя два варианта:
1) либо выкатить код с попытками (неудачными) использовать поток
2) либо если кода нет словесно подробноописать, что нужно.
Тогда имхо шанс получить дельный совет велик.
ASMiD (2004-09-21 14:49:00) [11]Тогда - код на стол.
KIR (2004-09-21 14:49:00) [12]TStringStream
KIR (2004-09-21 14:48:00) [13]>ASMiD (21.09.04 14:47) [7]
Я-то, конечно, понял...
Суслик (2004-09-21 14:48:00) [14]это ты для наводки написал бы хоть про какие потоки ты говоришь:)
тогда бы мы разобрались и дали тебе наводу разобраться
ASMiD (2004-09-21 14:47:00) [15]Ты хоть понял что спросил?
Суслик (2004-09-21 14:47:00) [16]в чем проблемы то?
в компьютере все в бинарном виде.
KIR (2004-09-21 14:47:00) [17]Народ, заранее прошу прщения за, возможно, нелепые вопросы, но с потоками первый раз сталкиваюсь, поэтому не могу понять как к потоку прибавить инфу да еще в бинарном представлении... вы уж простите, но можно пару строчек кода для наводки, а дальше я уж разгребусь, спасибо.
Суслик (2004-09-21 14:45:00) [18]класс :)
KIR (2004-09-21 14:45:00) [19]Поток же идет в бинарном виде...
Digitman (2004-09-21 14:44:00) [20]
> можно ли как-то это сделать?
не только можно, но и нужно !
а в чем, собссно, сложности-то ?