Передача картинки через сокет
, (по примеру FAQ)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.37] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Передача картинки через сокет
, (по примеру FAQ)
|
Сообщ.
#1
,
|
|
|
|
Нужно передать картинку через сокет
Клиент обращается к серверу и запрашивает картинку, потом ее принимает... ![]() ![]() {str:TMemoryStream;} //Сервер //Создается картинка Jpg:= TJpegImage.Create; form1.makescreen(Jpg); jpg.CompressionQuality:=15; jpg.Compress; //Записывает ее в поток str:=TMemoryStream.Create; str.Position:=0; jpg.SaveToStream(str); //передаем клиенту размер картинки ClientSocket.Sendln(inttostr(str.Size)); str.Position:=0; //передаем клиенту картинку ClientSocket.SendStream(str); str.Free; jpg.Free; //Клиент //Запрос картинки form1.TcpClient1.Sendln('s'); //Зодаем поток str:=TMemoryStream.Create; //получаем размер принимаемой картинки size:=form1.TcpClient1.Receiveln; str.Position:=0; buf:=???? //Вот здесь надо указать будер размером size!!!! Как???? form1.TcpClient1.ReceiveBuf(buf, strtoint(size)); form1.TcpClient1.Disconnect; str.WriteBuffer(buf, strtoint(size)); str.Position:=0; Jpg:= TJpegImage.Create; jpg.LoadFromStream(str); Jpg.SaveToFile('c:\test2.jpg'); dispose(buf); Jpg.Free; str.Free; Помогите братцы 8))) Что не так??? |
|
Сообщ.
#2
,
|
|
|
|
А чего не работает-то?
|
|
Сообщ.
#3
,
|
|
|
|
Сервером картинка посылается, без возникновения ошибок.
На клиенте возникает ошибка "Access Violation" память под buf выделяю так GetMem(buf, strtoint(size)+1); где size получен с сервера |
|
Сообщ.
#4
,
|
|
|
|
Дык читай картинку в TMemoryStream, а потом TMemoryStream.SaveToFile(), когда файл примется полностью.
|
|
Сообщ.
#5
,
|
|
|
|
Сейчас делаю так
![]() ![]() var size:string; str:TMemoryStream; begin form1.TcpClient1.Sendln('s'); str:=TMemoryStream.Create; size:=form1.TcpClient1.Receiveln; str.Position:=0; form1.TcpClient1.ReceiveBuf(str, strtoint(size)); form1.TcpClient1.Disconnect; str.Free; end; То же самое... Ошибка. |
|
Сообщ.
#6
,
|
|
|
|
Конечно будет ошибка.
Ты принимай в строку, а потом строку пиши в TMemoryStream. И попробовать я не могу на разных тачках, чтобы определённей сказать.. |
|
Сообщ.
#7
,
|
|
|
|
Song, Спасибо. Вроде получилось.
Вопрос еще в дагонку 8) На локальном компе сокеты конектятся нормально (причем ip локальной сети использую 192.168.0.2) Когда пробую на 2-разных компах, они не хотят соединяться. В чем может быть баг? Где рыть? И возможно ли, что в инете это заработает? |
|
Сообщ.
#8
,
|
|
|
|
А что пишет? какая ошибка?
|
|
Сообщ.
#9
,
|
|
|
|
Ошибки никакой нет.
пытыюсь конект установить if TcpClient1.connect then begin //что-то end else showmessage('Could not connect'); и он не устанавливается пусть клиент 192.168.0.1 remotehost:=192.168.0.2 remoteport:=8888 сервер 192.168.0.2 localhost:=192.168.0.2 localport:=8888 |