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

Вниз

Tsockets ........... Достали   Найти похожие ветки 

 
Dmitry V. Averuanov ©   (2001-12-26 17:33) [0]

Отправляю рисонок, находящийся в 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
КАК ЭТО ПОБОРОТЬ ?


 
nikkie ©   (2001-12-26 18:05) [1]

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


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

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


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

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


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, но у меня это приводит к тому, что события перестают срабатывать.

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


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

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


 
Dmitry V. Averuanov ©   (2001-12-27 12:19) [5]

ТО 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 килобайта, и если рисунок больше - приходит в нескольких пакетах.




 
nikkie ©   (2001-12-27 13:09) [6]

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

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

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


 
Dmitry V. Averuanov ©   (2001-12-27 13:22) [7]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.019 c
1-42990
tovSuhov
2002-02-28 11:05
2002.03.14
TChart : паразитные значения...


3-42915
DmitryPV
2002-02-14 10:28
2002.03.14
Не удается модифицировать поле!


1-43032
Aris
2002-02-26 13:16
2002.03.14
Чтение из файла в динамический массив.


14-43174
Dimk
2002-01-31 11:10
2002.03.14
Proxies.pas


14-43175
ЕвгенийА
2002-01-31 00:57
2002.03.14
Копирование