Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Tsockets ........... Достали [D5, Win2k]


Dmitry V. Averuanov ©   (2001-12-26 17:33:00) 

Отправляю рисонок, находящийся в TImage c сервера на клиент по запросу клиента
В ServerSocketClientRead пишу :

R := Socket.ReceiveText;
If R = "GET" then // пришел запрос
Begin
Try
MStream := TMemoryStream.Create;
Form1.Image.Picture.BitMap.SaveToStream (Mstream);

ShowMessage ("K_Video - sending > " +IntToStr (Mstream.Size)+ " bytes.");
Socket.SendBuf ( Mstream,Mstream.Size );
Finally
MStream.Free;
end;
End; // If R="GET"


На клиенте в ClientSocketRead :
Try
MStream := TMemoryStream.Create;
BufLength := Socket.ReceiveLength;
GetMem (Buffer , BufLength);
Socket.ReceiveBuf (Buffer^ , BufLength);
Mstream.Position:=0;
MStream.WriteBuffer(buffer,BufLength);
If Mstream.Size > 0 then Begin
Mstream.Position:=0;
ShowMessage ("Received stream size = " + IntToStr (Mstream.Size));
Mstream.Position :=0;
Image.Picture.Bitmap.LoadFromStream (Mstream);
Image.Invalidate;
end
Else
ShowMessage ("Received stream size = 0 ");
Finally
MStream.Free;
end;


При этом размеры принятого и отправленного Mstream равны,
Но TImage ругается на принятый рисунок -
Bitmap image is not valid
КАК ЭТО ПОБОРОТЬ ?


Dmitry V. Averuanov   (2001-12-27 13:22:00) [1]

А размер передаваемого буфера установить нельзя ?


nikkie   (2001-12-27 13:09:00) [2]

никто тебе не гарантирует, что картинка дойдет вся сразу. передавай через сокет размер картинки, а потом саму картинку.

при получении жди, пока не получишь все.

http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=991237103&n=20


Dmitry V. Averuanov   (2001-12-27 12:19:00) [3]

ТО panov >Да читал я пример - тупой наверное я - не работает у меня, как там написано.

Вышел на такой код :
ПРИЕМ
Try
MStream := TMemoryStream.Create;
Jpeg_Image := TJPEGImage.Create;

BufLength := Socket.ReceiveLength;
GetMem (Buffer , BufLength);

Socket.ReceiveBuf (Buffer^ , BufLength);
Mstream.Position :=0;
MStream.WriteBuffer(buffer,BufLength);

If Mstream.Size > 0 then Begin

Mstream.Position:=0;
Jpeg_Image.LoadFromStream (Mstream);
ShowMessage ("Received stream size = " + IntToStr (Mstream.Size));
Mstream.Position :=0;

Image.Picture.Bitmap.Assign (Jpeg_Image);
Image.Invalidate;
end
Else
ShowMessage ("Received stream size = 0 ");
Finally
FreeMem (Buffer , BufLength);
Jpeg_Image.Free;
MStream.Free;
end;
ShowMessage ("Ok");


ПЕРЕДАЧА :
Try
MStream := TMemoryStream.Create;
Jpeg_Image := TJPEGImage.Create;

Mstream.Position:=0;
JPEG_Image.Assign ( Form1.Image.Picture.BitMap );

Jpeg_Image.CompressionQuality := 50;
Jpeg_Image.Smoothing := True;
Jpeg_Image.Compress;

Jpeg_Image.SaveToStream (Mstream);

Mstream.Position :=0;
ShowMessage ("K_Video - sending > " +IntToStr (Mstream.Size)+ " bytes.");
//Socket.SendBuf ( Buffer^,BufLength );
Socket.SendStream (Mstream);

Finally
Jpeg_Image.Free;
// FreeMem (Buffer , BufLength);
//MStream.Free;

end;

Результат - Jpeg error #51 - тобиш опять мусор приходит.
Кстати - как установить длину передаваемого буфера - там по умолчанию 4 килобайта, и если рисунок больше - приходит в нескольких пакетах.



panov   (2001-12-27 11:05:00) [4]

Ну есть же в статье на сайте пример - посмотрите.


nikkie   (2001-12-27 11:00:00) [5]

вот так не валится:


var
ms : TMemoryStream;
begin
ms := TMemoryStream.Create;
try
ms.Write("abc", 3);
ms.Position := 0;
Socket.SendText(inttostr(ms.Size));
Socket.SendStream(ms);
finally
// ms.Free;
end;
end;


если ms.Free раскомментарить - возникает AV.

насколько я понимаю - проблема в ассинхронности сокета. SendStream не означает, что данные уже отправлены, а stream уже разрушается. по идее, это должно лечиться выставлением ServerType = stThreadBlocking, но у меня это приводит к тому, что события перестают срабатывать.

может кто подскажет решение, я его не знаю. сам я забил на борландовские компоненты - какие-то они неприятные (имхо) и использую инди.


Dmitry V.   (2001-12-26 18:24:00) [6]

Как тогда - на SendStream ругается ?


nikkie   (2001-12-26 18:05:00) [7]

так делать нельзя. SendBuf ты передаешь указатель на TMemoryStream - операция бессмысленная. естественно, что клиент получает мусор вместо картинки.


Наверх

Титульная страница Поиск, карта сайта Написать письмо