Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2012, 17:05   #21
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

теперь надо как-то это всё принять?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 30.11.2012, 17:18   #22
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

прими файл длинной 10 байт с содержимым 1234567890
согласно твоего протокола получится сообщение
Fil101234567890
допустим я принимаю твое сообщение, но я не понимаю какой размер файла
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 30.11.2012, 17:21   #23
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

тыпытаешьсявсокетзасунутьэтопредлож ение - понятно?
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 30.11.2012, 18:38   #24
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
прими файл длинной 10 байт с содержимым 1234567890
согласно твоего протокола получится сообщение
Fil101234567890
допустим я принимаю твое сообщение, но я не понимаю какой размер файла
fil-это индикатор файла. Client и Server 3 у меня меточки. Принимают только определеный текст.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 30.11.2012, 18:51   #25
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

только щас увидел что у тебя 2 конекта
Client3.Socket.SendText('Fil');
Client2.Socket.SendStream(stream);
можно и так конечно но нафега?
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 30.11.2012, 18:55   #26
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
только щас увидел что у тебя 2 конекта
Client3.Socket.SendText('Fil');
Client2.Socket.SendStream(stream);
можно и так конечно но нафега?
чтобы потом можно было передать не файл, а директорию.

Кстати о деректории. Я вот сам нашел способ передачи деректории, но как это всё зациклить, ведь надо знать когда передался паток?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.

Последний раз редактировалось Stilet; 30.11.2012 в 20:54.
саша40 вне форума Ответить с цитированием
Старый 30.11.2012, 20:04   #27
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Брр, что за неправильная передача данных?
На отправителе открываете файл, читаете размер данных, имя файла, калькулируете CRC32. Разбиваете файл на равные блоки данных, допустим по 4 кб, узнаете сколько блоков всего.
На клиент уходит структура, открывающая входящую передачу:
Код:
type
   TInputStreamHeader = packed record
     pFile:PChar; //Имя файла
     pSize:DWORD; //Размер в байтах
     pCRC32:DWORD; //Контрольная сумма
     pBlockCount:DWORD; //Кол-во блоков
   end;
Принимающий клиент открывает соединение и знает, сколько блоков должно придти с отправителя, а в конце может очень хорошо проконтролировать целостность переданных данных.

Теперь, отправитель режет файл на, я уже говорил, на блоки по 4 кб, собирая в массив. Каждый блок данных это пакет данных, он должен дойти до клиента и не просто дойти, а дойти правильно!
Код:
type
  TInputStreamBlock = packed record
  Indx:DWORD; //Номер блока
  Offset:DWORD; //Смещение откуда был взят блок данных(начальное смещение)
  DataCount:DWORD; //Размер массива
  Data: array of byte; //Сам массив
  CRC32:DWORD; //Контрольная сумма для пущей проверки целостности передачи
  end;
По пакетной передачи это все.
Как это работает, и что дает?
Отправитель отправляет пакет с данными, который готовит принимающий клиент к приему файла данных. Клиент узнает размер файла, его контрольную сумму, имя файла.
На ПК клиента создается файл размером TInputStreamHeader.pSize заполненный нулями.

Затем клиент ждет пакетов данных. Приходит пакет, если надо, проверяете целостность(на клиенте считаете CRC данных и сравниваете с той что записана в пришедшем пакете),
далее нам плевать что это не 1-й тот пакет данных, мы читаем Offset перемещаемся туда, и пишем блок данных размером DataCount.

И так, пока счетчик пришедших блоков не будет равен тому что пришел в информационном пакете.


По окончанию, вы сравниваете итоговый размер загруженного файла с инф. из инф. пакета(TInputStreamHeader), а так же контрольную сумму.

В конце клиент передает серверу инф. сообщение что данные получены успешно, и оба могут закрыть подключение передачи данных.

И так, что дает такой способ?
1. Прием-передачу пакететов можно вести в несколько потоков одновременно. Ярким примером такого приема данных будет Download Master.
Можно не заботится о последовательности пакетов, главное чтобы пакет пришел целым и записался по Offset'у в нужном кол-ве.
2. Размер передаваемого блока, нужно калькулировать исходя из скорости передачи/приема данных на клиент(тупо пропускная способность):
а. Если на сервере хорошая выходная мощность, то клиент захлебнется и будет overflow
б. Если слишком малая, то могут возникнуть овер9000 выкидышей и с клиента и с сервера
3. Нужно учитывать вероятность потери пакетов, поэтому клиент должен асинхронно держать сервер(передающий) на контакте и если пакет битый - попросить этот пакет ещё раз.

Все это довольно просто =)
Человек_Борща вне форума Ответить с цитированием
Старый 30.11.2012, 21:22   #28
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Брр, что за неправильная передача данных?
На отправителе открываете файл, читаете размер данных, имя файла, калькулируете CRC32. Разбиваете файл на равные блоки данных, допустим по 4 кб, узнаете сколько блоков всего.
На клиент уходит структура, открывающая входящую передачу:
Код:
type
   TInputStreamHeader = packed record
     pFile:PChar; //Имя файла
     pSize:DWORD; //Размер в байтах
     pCRC32:DWORD; //Контрольная сумма
     pBlockCount:DWORD; //Кол-во блоков
   end;
Принимающий клиент открывает соединение и знает, сколько блоков должно придти с отправителя, а в конце может очень хорошо проконтролировать целостность переданных данных.

Теперь, отправитель режет файл на, я уже говорил, на блоки по 4 кб, собирая в массив. Каждый блок данных это пакет данных, он должен дойти до клиента и не просто дойти, а дойти правильно!
Код:
type
  TInputStreamBlock = packed record
  Indx:DWORD; //Номер блока
  Offset:DWORD; //Смещение откуда был взят блок данных(начальное смещение)
  DataCount:DWORD; //Размер массива
  Data: array of byte; //Сам массив
  CRC32:DWORD; //Контрольная сумма для пущей проверки целостности передачи
  end;
По пакетной передачи это все.
Как это работает, и что дает?
Отправитель отправляет пакет с данными, который готовит принимающий клиент к приему файла данных. Клиент узнает размер файла, его контрольную сумму, имя файла.
На ПК клиента создается файл размером TInputStreamHeader.pSize заполненный нулями.

Затем клиент ждет пакетов данных. Приходит пакет, если надо, проверяете целостность(на клиенте считаете CRC данных и сравниваете с той что записана в пришедшем пакете),
далее нам плевать что это не 1-й тот пакет данных, мы читаем Offset перемещаемся туда, и пишем блок данных размером DataCount.

И так, пока счетчик пришедших блоков не будет равен тому что пришел в информационном пакете.


По окончанию, вы сравниваете итоговый размер загруженного файла с инф. из инф. пакета(TInputStreamHeader), а так же контрольную сумму.

В конце клиент передает серверу инф. сообщение что данные получены успешно, и оба могут закрыть подключение передачи данных.

И так, что дает такой способ?
1. Прием-передачу пакететов можно вести в несколько потоков одновременно. Ярким примером такого приема данных будет Download Master.
Можно не заботится о последовательности пакетов, главное чтобы пакет пришел целым и записался по Offset'у в нужном кол-ве.
2. Размер передаваемого блока, нужно калькулировать исходя из скорости передачи/приема данных на клиент(тупо пропускная способность):
а. Если на сервере хорошая выходная мощность, то клиент захлебнется и будет overflow
б. Если слишком малая, то могут возникнуть овер9000 выкидышей и с клиента и с сервера
3. Нужно учитывать вероятность потери пакетов, поэтому клиент должен асинхронно держать сервер(передающий) на контакте и если пакет битый - попросить этот пакет ещё раз.

Все это довольно просто =)
Дествительно, всё гениально просто.
А можно даже и передавать пакетами в размере 1 кб и по несколько в зависимости от скорости соеденения. Так передает и скайп. Ты решил несколько моих задач:
-Передача файлов.
-Передача несколько файлов и даже деректорий.
-Прогресс передачи(прогресс бар бедет увеличиватся на 1 по мере передачи пакетов), притом можно узнать ли Кол-во блоков в Integer.
-Скорость соеденения.
Зато будет хорошо. Только где информацию по этому искать.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 30.11.2012, 21:24   #29
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

А можно ли эти пакеты передавать и принимать через соккеты?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 30.11.2012, 21:29   #30
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Зато будет хорошо. Только где информацию по этому искать.
Я вам все расписал. Изучайте потоки и асинхронние потоки, синхронизацию. Winsock, Winsock2.


Цитата:
А можно ли эти пакеты передавать и принимать через соккеты?
да.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача файла по сокетам grorg Работа с сетью в Delphi 8 23.09.2012 19:41
Передача файла по сокетам bigmak Помощь студентам 1 24.03.2009 12:50
Передача файлов Malder Общие вопросы .NET 2 03.11.2008 08:04
Передача файлов DM_bite Свободное общение 1 15.09.2008 16:22
Передача файлов wolff Работа с сетью в Delphi 3 03.03.2007 15:54