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

Вниз

Приписать к потоку данных его размер   Найти похожие ветки 

 
KIR   (2004-09-21 14:42) [0]

Народ, можно ли решить след. задачу: в сети имеются клиент и сервер (взаимодействуют через сокеты), клиент передает серверу информацию (строку символов) ввиде потока данных, но для правильного чтения этого потока в его (потока) первых 4 байтах необходимо указывать его (потока) длинну... можно ли как-то это сделать?


 
Digitman ©   (2004-09-21 14:44) [1]


> можно ли как-то это сделать?


не только можно, но и нужно !

а в чем, собссно, сложности-то ?


 
Суслик ©   (2004-09-21 14:44) [2]

А что проблемы есть?
Пиши 4 байта строки и все...
В чем проблема?


 
KIR   (2004-09-21 14:45) [3]

Поток же идет в бинарном виде...


 
Суслик ©   (2004-09-21 14:45) [4]

класс :)


 
KIR   (2004-09-21 14:47) [5]

Народ, заранее прошу прщения за, возможно, нелепые вопросы, но с потоками первый раз сталкиваюсь, поэтому не могу понять как к потоку прибавить инфу да еще в бинарном представлении... вы уж простите, но можно пару строчек кода для наводки, а дальше я уж разгребусь, спасибо.


 
Суслик ©   (2004-09-21 14:47) [6]

в чем проблемы то?
в компьютере все в бинарном виде.


 
ASMiD   (2004-09-21 14:47) [7]

Ты хоть понял что спросил?


 
Суслик ©   (2004-09-21 14:48) [8]

это ты для наводки написал бы хоть про какие потоки ты говоришь:)
тогда бы мы разобрались и дали тебе наводу разобраться


 
KIR   (2004-09-21 14:48) [9]

>ASMiD   (21.09.04 14:47) [7]
Я-то, конечно, понял...


 
KIR   (2004-09-21 14:49) [10]

TStringStream


 
ASMiD   (2004-09-21 14:49) [11]

Тогда - код на стол.


 
Суслик ©   (2004-09-21 14:51) [12]

Тогда у тебя два варианта:
1) либо выкатить код с попытками (неудачными) использовать поток
2) либо если кода нет словесно подробно описать, что нужно.

Тогда имхо шанс получить дельный совет велик.


 
KIR   (2004-09-21 14:51) [13]


//на стороне клиента
  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;


 
ASMiD   (2004-09-21 14:52) [14]

В TStringStream есть метод Write Его надо вызвать в самом начале, когда поток пуст, а в качестве Buffer (см. Delphi Help) переменную, в которой храниться длина потока.


 
KIR   (2004-09-21 14:52) [15]

сорри:

//на стороне клиента
 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;


 
Суслик ©   (2004-09-21 14:53) [16]

что такое readstream?


 
Digitman ©   (2004-09-21 14:54) [17]

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);


 
KIR   (2004-09-21 14:55) [18]

Вообще-то вопрос в том, как в целом приписать к потоку его длинну. Т.к. возможно, что данные на сервер будут поступать с клиента не обязательно написанного на Дельфе или Билдере... А чтоб правильно считать требуется в первых 4 байтах иметь длинну... в том ивопрос как алгоритмически дополнить бинарный поток бинарными же данными...


 
ASMiD   (2004-09-21 14:57) [19]

А какая разница на чем писать?


 
KIR   (2004-09-21 14:59) [20]

>ASMiD   (21.09.04 14:57) [19]

Тогда, подскажи, как средствами PhP, которые на сокет может кидать только строки. Кинуть строку вместе с ее длинной.


 
ASMiD   (2004-09-21 15:07) [21]

примени следующее извращение
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);



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

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

Наверх




Память: 0.51 MB
Время: 0.054 c
14-1100196571
Никита
2004-11-11 21:09
2004.11.28
Как конвертировать *.dcu обратно в *.pas?


14-1100193273
Викусик
2004-11-11 20:14
2004.11.28
А у меня тоже задачка...


1-1100177535
andrey__
2004-11-11 15:52
2004.11.28
TServiceApplication - Pause, Continue, Stop


3-1099332069
MMN
2004-11-01 21:01
2004.11.28
Инкрементирование поля


14-1100384582
Змей
2004-11-14 01:23
2004.11.28
MailSlot