Форум: "Сети";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c