Здравствуйте, artur_rnd82, Вы писали:
_>Пробую с импользованием INDY10 написать процедуру по передачи потока TStream, есть такой вот код для записи потока в соккет
_>procedure TarCustomTCPSocket.WriteStream(AStream: TStream; AHandler: TIdIOHandler; ASleep: Integer; AContext: TIdContext); _>var DataSize, BlockSize: integer; _> Buffer: TBytes;begin _> try _> DataSize:=AStream.Size; _> AHandler.WriteLn(IntToStr(DataSize)); _> SetLength(Buffer,TCP_SOCKET_BUFFER_SIZE); _> while AStream.Position < AStream.Size do _> begin _> BlockSize:=AStream.Read(Buffer,TCP_SOCKET_BUFFER_SIZE); _> AHandler.WriteLn(IntToStr(BlockSize)); _>// AHandler.WriteBufferOpen; _> AHandler.Write(Buffer); _>// AHandler.WriteBufferClose; _> end; _> except _> on e: exception do _> begin _> doError('___Write Stream ERROR!!!'+#13+e.Message,FContext); _> end; _> end; _>end;
_>и процедура для чтения потока из соккета
_>procedure TarCustomTCPSocket.ReadStream(AStream: TStream; AHandler: TIdIOHandler; AContext: TIdContext = nil); _>var DataSize, BlockSize, readed: integer; _> Buffer: TBytes; _>begin _> try _> DataSize:=AHandler.ReadInteger; _> AHandler.RecvBufferSize:=TCP_SOCKET_BUFFER_SIZE; _> readed:=0; _> while DataSize>readed do _> begin _> BlockSize:=AHandler.ReadInteger; _> readed:=readed+BlockSize; _> doEvent(Format('reading %d bytes of %d',[BlockSize,DataSize]),AContext); _> FHandler.ReadBytes(Buffer,BlockSize,false); _> end; _> except _> on e: exception do _> begin _> doError('___Read Stream ERROR!!!'+#13+e.Message,FContext); _> end; _> end; _>end;
_>Так вот на выполнении AHandler.Write(Buffer); в процедуре WriteBuffer прога вылетает с ошибкой _>В чём может быть дело
Вместо Buffer передавай @Buffer[0]
Например вместо
как было показано в вопросе есть две проедуры: одна читает из потока, другая пишет в поток.
так вот когда в процедуре (WriteStream) я передаю размер потока строчкой AHandler.WriteLn(IntToStr(DataSize)), то по идеи клиент должен получать эти данные в строчке DataSize:=AHandler.ReadInteger, но на этом моменте клиент виснет, т.е. он ждёт данные, а их как бы нет.....пробовал запустить сервер и проверить телнетом,...всё прекрасно, сервер выполняет WriteStream и я в телнете вижу все данные и DataSize и BlockSize, а вот в клиентском приложении эти данные не приходят....
Заранее спасибо за помощь
Здравствуйте, artur_rnd82, Вы писали:
_>Вот вощникла ещё одна проблема
_>как было показано в вопросе есть две проедуры: одна читает из потока, другая пишет в поток. _>так вот когда в процедуре (WriteStream) я передаю размер потока строчкой AHandler.WriteLn(IntToStr(DataSize)), то по идеи клиент должен получать эти данные в строчке DataSize:=AHandler.ReadInteger, но на этом моменте клиент виснет, т.е. он ждёт данные, а их как бы нет.....пробовал запустить сервер и проверить телнетом,...всё прекрасно, сервер выполняет WriteStream и я в телнете вижу все данные и DataSize и BlockSize, а вот в клиентском приложении эти данные не приходят....
а ты что хотел? положить в ящичек грушку, а достать яблочко?
Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>Здравствуйте, artur_rnd82, Вы писали:
_>>Вот вощникла ещё одна проблема
_>>как было показано в вопросе есть две проедуры: одна читает из потока, другая пишет в поток. _>>так вот когда в процедуре (WriteStream) я передаю размер потока строчкой AHandler.WriteLn(IntToStr(DataSize)), то по идеи клиент должен получать эти данные в строчке DataSize:=AHandler.ReadInteger, но на этом моменте клиент виснет, т.е. он ждёт данные, а их как бы нет.....пробовал запустить сервер и проверить телнетом,...всё прекрасно, сервер выполняет WriteStream и я в телнете вижу все данные и DataSize и BlockSize, а вот в клиентском приложении эти данные не приходят....
OAB>а ты что хотел? положить в ящичек грушку, а достать яблочко?
Я спросил совета а не нравоучений, если ты такой умный то скажи в чём причина
Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>Здравствуйте, artur_rnd82, Вы писали:
_>>Вот вощникла ещё одна проблема
_>>как было показано в вопросе есть две проедуры: одна читает из потока, другая пишет в поток. _>>так вот когда в процедуре (WriteStream) я передаю размер потока строчкой AHandler.WriteLn(IntToStr(DataSize)), то по идеи клиент должен получать эти данные в строчке DataSize:=AHandler.ReadInteger, но на этом моменте клиент виснет, т.е. он ждёт данные, а их как бы нет.....пробовал запустить сервер и проверить телнетом,...всё прекрасно, сервер выполняет WriteStream и я в телнете вижу все данные и DataSize и BlockSize, а вот в клиентском приложении эти данные не приходят....
Продолжу, пробовал писать и DataSize:=IntToStr(AHandler.ReadLn), , не получается в любом случаи
Здравствуйте, artur_rnd82, Вы писали:
_>Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>>Здравствуйте, artur_rnd82, Вы писали:
_>>>Вот вощникла ещё одна проблема
_>>>как было показано в вопросе есть две проедуры: одна читает из потока, другая пишет в поток. _>>>так вот когда в процедуре (WriteStream) я передаю размер потока строчкой AHandler.WriteLn(IntToStr(DataSize)), то по идеи клиент должен получать эти данные в строчке DataSize:=AHandler.ReadInteger, но на этом моменте клиент виснет, т.е. он ждёт данные, а их как бы нет.....пробовал запустить сервер и проверить телнетом,...всё прекрасно, сервер выполняет WriteStream и я в телнете вижу все данные и DataSize и BlockSize, а вот в клиентском приложении эти данные не приходят....
OAB>>а ты что хотел? положить в ящичек грушку, а достать яблочко?
_>Я спросил совета а не нравоучений, если ты такой умный то скажи в чём причина
Ты пишеш как строку WriteLn(IntToStr(DataSize)) (это от 1 до несколько байт в ANSI кодировке)
а читаеш как число — тоесть 4 байта.
Определись — е всё будет класс. Я бы предпочёл писать так AHandler.WriteInteger(DataSize)
Здравствуйте, artur_rnd82, Вы писали:
_>Продолжу, пробовал писать и DataSize:=IntToStr(AHandler.ReadLn), , не получается в любом случаи
сядь, разберись и не паникуй, поскольку то что ты пишешь не только не могло заработать, а и не могло собраться. с таким подходом "пхнуть одну строчку и назад в форум" ты ничему не научишься. ведь ты именно этим занимаешься, а не проект пишешь, поскольку там такого кода не будет по определению.
Здравствуйте, artur_rnd82, Вы писали:
_>Продолжу, пробовал писать и DataSize:=IntToStr(AHandler.ReadLn), , не получается в любом случаи
Если пишешь integer — читай integer, если строку — читай строку. А ты пишешь строку а читаешь integer. Тебя не удивляет, что на конструкции типа String:=Integer; Delphi обламывается?