Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как передать файл, при помощи индейцев 
:(
    Опции темы
BSOD
Дата 15.2.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 1.11.2004
Где: Гомель

Репутация: нет
Всего: 3



поиском не нашел...
как передать файл (поток) при помощи idUDPClient и Server ???

Это сообщение отредактировал(а) BSOD - 15.2.2006, 23:11


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
_hunter
Дата 16.2.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



http://forum.vingrad.ru/index.php?showtopic=2359
там есть пример UDP чата. файл передавать не намного сложнее.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
BSOD
Дата 16.2.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 1.11.2004
Где: Гомель

Репутация: нет
Всего: 3



тоесть файл передавать как текст?
(текст-то я умею =))


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
_hunter
Дата 16.2.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



должен и в бинарном виде уйти...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
BSOD
Дата 16.2.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 1.11.2004
Где: Гомель

Репутация: нет
Всего: 3



всмысле smile
просто, допустим у serverSocket и ClientSocket есть такая штука, как socket.sendstream.. что довольно удобно, так вот я и спрашиваю, нет ли в индейцах чего таково?


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Snowy
Дата 16.2.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Там есть SendBuf. Работает по аналогии, только не со стримом, а с блоком данных.
PM MAIL   Вверх
BSOD
Дата 17.2.2006, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 1.11.2004
Где: Гомель

Репутация: нет
Всего: 3



Вобщем, небольшая проблемка....
хочу передать скрин.
с одной стороны по таймеру делаю:
Код

  bitblt(bmp.canvas.Handle,0,0,screen.Width,screen.Height,dc,0,0,srccopy);
  jpg.Assign(bmp);
  jpg.CompressionQuality:=50;
  jpg.Compress;
  jpg.SaveToStream(str);
  str.Seek(0,soFromBeginning);
  idUDPClient2.Active:=true;
  idUDPClient2.Send('beg '+inttostr(str.Size));
  while str.Position<str.Size do
    begin
      str.Read(bb,sizeof(bb));
      idUDPClient1.SendBuffer(bb,sizeof(bb));
    end;
  idUDPClient2.Send('end');
  idUDPClient2.Active:=false;


с другой стороны:

у одного сервера onUDPread:
Код

  adata.Read(bb,sizeof(bb));
  str.Write(bb,sizeof(bb));


у другово:
Код

  SFS:=TStringStream.Create('');
  SFS.CopyFrom(adata,adata.Size);
  s:=SFS.DataString;
  if s='end' then
    begin
      if started then
        begin
          if str.Size=CRC then
            begin
              jp.loadFromStream(str);
              bmp:=Tbitmap.Create;
              bmp.Width:=screen.Width;
              bmp.Height:=screen.Height;
              jp.DIBNeeded;
              bmp.Assign(jp);
              bitblt(image1.Canvas.Handle,0,0,screen.Width,screen.Height,bmp.Canvas.Handle,0,0,srcCopy);
            end;
        end;
      str.Clear;
      started:=false;
    end;
  if pos('beg',s)<>0 then
    begin
      delete(s,1,4);
      CRC:=strtoint(s);
      str.Clear;
      started:=true;
    end;
  SFS.Free;


тоесть, сначала посылаю "beg", с другой стороны очищаю поток.
потом - по одному байту шлю весь поток
потом - шлю "end" и пытаюсь из принятого потока сделать JPG

так вот поток этот доходит уже совсем не таким, каким он был в начале, и при попытке перегнать его в jpg=>bmp - вылазит еррор, что типа jp - на самом деле не рисунок....

хотя, один раз он все-таки передался.....

что я делаю не так и что мне делать?


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Snowy
Дата 17.2.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



UDP нельзя слать по одному байту. Это неконтролируемый протокол. Байти могут придти в совершенно произвольном порядке.
Шли блоками по 60кб.
PM MAIL   Вверх
BSOD
Дата 17.2.2006, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 1.11.2004
Где: Гомель

Репутация: нет
Всего: 3



а по подробнее, как сие реализовать?


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Snowy
Дата 17.2.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Все также. Только отправляй не однобайтовый буфер, а используй буфер, большим размером.
Тут просто есть ограничение - ты не можешь за один раз отправить более 64 килобайт. А реально даже меньше. 60 вполне подойдет.
Но отправлять по 1 байту нельзя - UDP не сохраняет порядок в отличии от TCP.
Или используй TCP, или отправляй большими кусками - пока будешь отправлять новый кусок, старый уже дойдет.
Принцип отправки все тот же. Отличие лишь в том, что ты должен переписать часть данных в созданный буфер, отправить,переписать следующую часть и т.д.
В принципе то же самое, только используешь не 1байтовую переменную, а массив байтов.
PM MAIL   Вверх
Демо
Дата 18.2.2006, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 3
Всего: 50



Цитата(Snowy @ 17.2.2006, 21:52 Найти цитируемый пост)
пока будешь отправлять новый кусок, старый уже дойдет.


Думаю, что правильнее будет подход с идентификацией(нумерацией) каждого пакета на передающей стороне и "склеиванием" в соответствующем порядке на принимающей стороне. При этом еще необходимо реализовывать обработку ситуации с непринятыми и искаженными пакетами.
В общем, это написание полноценного протокола обмена.


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 18.2.2006, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Проще будет с TCP. UDP вещь сложная и имеет много ньюансов.
Но справиться с ней можно... сломав пару десятков граблей.
PM MAIL   Вверх
BSOD
Дата 18.2.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 1.11.2004
Где: Гомель

Репутация: нет
Всего: 3



вроде заработало, но как-то через раз... нужно будет еще не тока на себе потестить...


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Snowy
Дата 18.2.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Цитата(BSOD @ 18.2.2006, 12:39 Найти цитируемый пост)
вроде заработало, но как-то через раз...
Ну так UDP и не является надежным протоколом.
Если что-то в пути потерялось, то картинку уже не соберешь.
А оно может теряться, перемешиваться...
Особенно на линиях плохого качества.
Работает по принципу - кинул в сеть и забыл.
А хочешь надежности и гарантированной доставки - это уже TCP.
PM MAIL   Вверх
Демо
Дата 18.2.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 3
Всего: 50



Непонятно, почему UDP.
UDP имеет смысл использовать для передачи от сервера клиентам, как мне кажется, причем только в том случае, если потеря части данных некритична. Например, потоковая широковещательная трансляция видео по локальной сети, когда потеря пары кадров совершенно некритична.
Если уж использовать передачу на сервер - прямойсмысл использовать все преимущества TCP.


--------------------
    
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.