Главная страница
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.036 c
4-1097254182
Artin
2004-10-08 20:49
2004.11.28
Delphi: Чтения бит с CD диска


1-1100252897
Shalnsk
2004-11-12 12:48
2004.11.28
DBGrid


3-1098770945
Serg-SE
2004-10-26 10:09
2004.11.28
Проблема из-за отсутствие длинного целого в IB


4-1097937491
Creep
2004-10-16 18:38
2004.11.28
Com порт


14-1100070632
Суслик
2004-11-10 10:10
2004.11.28
service pack