Главная страница
    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-43022
nick_vstu
2002-03-01 02:40
2002.03.14
Что делает TSomeType.Create?


1-43099
Anar
2002-02-27 00:18
2002.03.14
JPG2BMP


3-42932
Juri
2002-02-14 16:12
2002.03.14
Консоль + SQL запрос


3-42982
Люк
2002-02-15 11:45
2002.03.14
Работа ADO под WindowsXP


1-43021
wonder_boy
2002-02-26 12:03
2002.03.14
Декомпиляция





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский