Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
1-43093
Gayrus
2002-02-27 05:10
2002.03.14
Свой компонент


1-42993
ne
2002-02-28 12:20
2002.03.14
окно типа пенели пуск


3-42930
Koks
2002-02-14 13:53
2002.03.14
экспорт в Excel


14-43172
Григорий Ситнин
2002-01-31 12:04
2002.03.14
Хм... Жизненное... =)


14-43165
SV
2002-01-30 13:34
2002.03.14
Зухел connect...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский