Проблема с отправкой MemoryStream от сервера к клиенту
, все это с помощью INDY из Делфи 7
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.249] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Проблема с отправкой MemoryStream от сервера к клиенту
, все это с помощью INDY из Делфи 7
|
Сообщ.
#1
,
|
|
|
|
Друзья, в чем дело? Что не так? вот строчка сервера, который получая строку от клиента, отправляет ему Strings:
Код: ![]() ![]() if(AThread.Connection.ReadLn()='clientexec')then begin OnlnS := TMemoryStream.Create; OnlnS.Position:=0; ValueListEditor1.Strings.SaveToStream(OnlnS); Athread.Connection.WriteStream(OnlnS,true,false); //Athread.Connection.WriteInteger(5); Onlns.Free; end; а вот клиент: Код: ![]() ![]() Client.Connect(); OnlineS := TMemoryStream.Create; Client.WriteLn('clientexec'); OnlineS.Position:=0; Client.ReadStream(OnlineS,-1,true); //в этой строчке таймаут!!!! ValueListEditor1.Strings.LoadFromStream(OnlineS); Client.Disconnect(); почему, возникает ошибка таймаута??? Помогите пожалуйста! это было час назад. теперь я очень намудрил, и просто шлю мемористрим от клиента к серверу: клиент: ![]() ![]() procedure TForm1.FormCreate(Sender: TObject); var i:Int64; //думал проблема в представлении чисел, но даже инт64 не помогает p:TStringList; begin client.Connect(); OnlineS := TMemoryStream.Create; p:=TStringList.Create; p.Add('vovik'); client.WriteInteger(5); //ValueListEditor1.Strings.SaveToStream(OnlineS); p.SaveToStream(OnlineS); //OnlineS.Position:=0; i:=OnlineS.Size; client.WriteStream(OnlineS,true,false,i); client.Disconnect(); Onlines.Free; end; сервер: ![]() ![]() procedure TForm1.ServerExecute(AThread: TIdPeerThread); var FN: String; F: TFileStream;p:TStringList;h:TStrings; begin i:=AThread.Connection.ReadInteger(true); h:=TStrings.Create; ShowMessage(intToStr(i)); OnlnS := TMemoryStream.Create; p:=TStringList.Create; //AThread.Connection.ReadStream(OnlnS,-1,false); //если эта строка, то ошибка памяти AThread.Connection.ReadStrings(h); //если эта(вообще не передаю поток), то ошибка абстрактного класса ShowMessage('proverka svza'); OnlnS.Position:=0; p.LoadFromStream(OnlnS); p.Free; OnlnS.Free; помогите очень прошу! |
|
Сообщ.
#2
,
|
|
|
|
![]() ![]() client.WriteStream(OnlineS,true,true,OnlineS.Size); // посылай так AThread.Connection.ReadStream(OnlnS,-1,false); // принимай так А h:TStrings переделай в h:TStringList; TStrings не годится, так как он абстрактный |
|
Сообщ.
#3
,
|
|
|
|
Абстрактный клас,это клас, методы которого надо перекрыть?Ладно, тут я допустил ошибку. Но с передачей размера,ничего не меняется!
WildBear пишет: ![]() ![]() client.WriteStream(OnlineS,true,true,OnlineS.Size); // посылай так у меня во втором примере клиента вот как: ![]() ![]() var i:Int64; //думал проблема в представлении чисел, но даже инт64 не помогает ..... i:=OnlineS.Size; client.WriteStream(OnlineS,true,false,i); тогда в строчке сервера ![]() ![]() AThread.Connection.ReadStream(OnlnS,-1,false); возникает ошибка: Out of memory while expanding memory stream |
|
Сообщ.
#4
,
|
|
|
|
Киньте кто-нибудь рабочий исходник передачи MemoryStream()!!!
|
|
Сообщ.
#5
,
|
|
|
|
Глянь еще раз мою строчку на передачу...
|
|
Сообщ.
#6
,
|
|
|
|
офигеть, спасибо! Я чуть с ума не сошел пока передвал)) Объясни пожалуйста, почему в случае FileStream
![]() ![]() client.WriteStream(OnlineS,true,FALSE); a MemoryStream ![]() ![]() client.WriteStream(OnlineS,true,TRUE,OnlineS.Size); |
|
Сообщ.
#7
,
|
|
|
|
Нет, в обоих случаях подходит один и тот же вариант. Просто второе TRUE означает, что перед посылкой потока должен быть передан его размер (OnlineS.Size)
|