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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача файла через сокеты, от клиета через сервер к другому клиенту 
:(
    Опции темы
VanHelsing
Дата 10.8.2008, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



Передача файла я нашел в ДРКБ, тот который с помощью TFileStream.  Ну немного переделал чтобы от клиента к серверу и клиенту мог выбирать файла, который хочет отправить. Вопрос следующий мне надо осуществить передачу файла от клиента другому клиенту через сервер? Приходит в голову пока только одно - сначала принимать файла на сервере, сохранять, а потом создавать новый поток и отправлять клиенту-получателю, но мне кажется это очень долго особенно если файл большого размера. Я можно ли это осуществить другим способом?

Это сообщение отредактировал(а) VanHelsing - 10.8.2008, 07:48


--------------------
PM MAIL   Вверх
SneG0K
Дата 10.8.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

Репутация: 2
Всего: 54



Цитата(VanHelsing @  10.8.2008,  06:47 Найти цитируемый пост)
передачу файла от клиента другому клиенту через сервер

Пусть клиент делает запрос серверу, сервер дает IP другого клиента и клиент начинает на прямую передавать другому клиенту.
PM WWW Skype   Вверх
VanHelsing
Дата 10.8.2008, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



Цитата

Пусть клиент делает запрос серверу, сервер дает IP другого клиента и клиент начинает на прямую передавать другому клиенту.

Не совсем понимаю как это сделать. Мы же копируем в буфер сокета, а как определять кому принимать?


--------------------
PM MAIL   Вверх
Burka
Дата 10.8.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 2



Скорей всего для этого клиент должен запускать на своей машине сервер на время передачи файла и ждать соедениния от другого клиента. Но например в интернете с этим могут быть проблемы, так как у сервера должен быть выделенный айпи(многие провайдеры объеденяют несколько пользователей под одним айпи).


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
VanHelsing
Дата 11.8.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



А больше ни у кого никаких предложений нет? Никто с этим не сталкивался?


--------------------
PM MAIL   Вверх
BaD_SeCt0R
Дата 12.8.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


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

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



Первый вариант:

Цитата(SneG0K @  10.8.2008,  11:12 Найти цитируемый пост)
Пусть клиент делает запрос серверу, сервер дает IP другого клиента и клиент начинает на прямую передавать другому клиенту.

При этом один из клиентов становиться сервером и через другой порт принимает(отправляет) данные.

Второй вариант:

Если  так необходимо все через сервер делать, без открытия доп. портов, то отправляй данные на сервер небольшими кусками, а принятые сразу же отправляй клиенту-получателю. Пока идет прием, идет и отправка.


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
VanHelsing
Дата 12.8.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



Цитата

Если  так необходимо все через сервер делать, без открытия доп. портов, то отправляй данные на сервер небольшими кусками, а принятые сразу же отправляй клиенту-получателю. Пока идет прием, идет и отправка.

Хотелось бы увидеть какой-нибудь пример! smile 


--------------------
PM MAIL   Вверх
SneG0K
Дата 13.8.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

Репутация: 2
Всего: 54



VanHelsing, пример на словах.

Клиент: Слыш сервер, я тут типа хочу передать файлик другому юзеру, ты мне дай его IP и скажи ему чтобы подготовился.
Сервер:Вот держи его IP 127.0.0.1 . Сча я его предупрежу.
Клиент:УГу.. спс
_______

Сервер: Дарова чувак.
Клиент-2: Ку
Сервер: Тут лузер с ip 127.0.0.1 хочет тебе порнухи напихать. готовся
Клиент-2: Ок. Жду
PM WWW Skype   Вверх
Exai1e
Дата 13.8.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SneG0K, мда...
а сервер / клиент2 обладают телепатией ?) откуда они узнают про размер принимаемых данных ?

а что мешает сделать к примеру так:
клиент1: Привет сервер, хочу передать одно клиенту с айпи (123.123.13.123) (именем компа, ником что угодно) фаил, размера 3 мб
сервер: Хорошо передавай =), Клиент2 тебе Клиент1 хочет фаил передать на 3 мб, лови!
клиент2: Принять или не принять... вот в чем вопрос. Принимаю.
...

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


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
SneG0K
Дата 13.8.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

Репутация: 2
Всего: 54



Exai1e, я надеюсь на то, что автор темы на форточке не катался.
PM WWW Skype   Вверх
BaD_SeCt0R
Дата 13.8.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


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

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



Exai1e, SneG0K, шутники...

Если не ошибаюсь, то в ДРКБ пример на основе Client/ServerSocket.  Тогда действия такие.

Для первого примера:

Отсылаешь текстовый запрос на передачу файла (указывая ip клиента #2) серверу. Открываешь новый порт на клиенте №1 . С сервера посылаешь ip клиента №1 клиенту №2. Клиентом соединяешься через новый порт с ip клиента №1. В эвентах серверсокета клиента №1 в OnClientConnect при соединении ip клиента №2 шлешь ему файл стандартным способом, описанным в ДРКБ. Не забудь про хедер с именем и размером файла.

Для второго примера:

На клиенте №1 готовишь и отправляешь хедер (инфо о файле, размер, имя, ip кому и т.п.), следом шлешь весь файл (буфер строка, через SendText). На сервере принимаешь хедер, затем файл кусками в стрим, готовишь хедер шлешь его и полностью полученные куски клиенту №2. Склеиваешь куски в TFileStream. Сохраняешь в файл. Все.


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
VanHelsing
Дата 13.8.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



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

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



Да... много информации. 
Ну вот что я понял.
Клиент выполняет запрос:отправляет серверу свой ip, ip того кому он хочет послать файл, и размер файла, ну можно и имя файла послать(хотя я думаю что имя файла можно послать по завершению приема).
Сервер спрашивает клиент, которому предназначается файл, свободен ли он и не принимает ли в данный момент какие-либо файлы.  Если клиент отвечает положительно, то клиенту, кот принимает он отправляет ip отправителя и размер файла. А клиенту отправителя говорит что клиент согласен и что тот может начинать пересылать данные. И клиент начинает пересылать данные.
Только не нашел как написать в виде кода отправку с клиента на клиент? Если я правильно все понял?



--------------------
PM MAIL   Вверх
Burka
Дата 14.8.2008, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 2



Цитата

Клиент выполняет запрос:отправляет серверу свой ip, ip того кому он хочет послать файл,

Тут скорей будет не айпи а id клиента, ну мне кажется клиенты не должны знать айпи других клиентов. но это мне так кажется =)

Цитата

Только не нашел как написать в виде кода отправку с клиента на клиент? Если я правильно все понял?

Так как я написал в своем первом сообщении. Один из клиентов должен запускать на своем компе сервер и должен передать через главный сервер необходимые данные для коннекта (свой айпи и порт).




--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
MetalFan
Дата 14.8.2008, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 14
Всего: 128



тут я так смотрю есть два варианта:
1. Пересылка файла(данных) между клиентами ЧЕРЕЗ сервер. (что позволит передавать данные между клиентами из локальных сетей без выделенного ИП в интернете. Главное, чтобы сервер имел свой ИП)
2. Пересылка файла(данных) между клиентами напрямую, но для инициации передачи используется сервер (aka P2P).
судя по сабжевому сообщению, автору нужно первое.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Exai1e
Дата 14.8.2008, 08:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(BaD_SeCt0R @  13.8.2008,  17:09 Найти цитируемый пост)
Exai1e, SneG0K, шутники...

Цитата(BaD_SeCt0R @  13.8.2008,  17:09 Найти цитируемый пост)
Для второго примера:

На клиенте №1 готовишь и отправляешь хедер (инфо о файле, размер, имя, ip кому и т.п.), следом шлешь весь файл (буфер строка, через SendText). На сервере принимаешь хедер, затем файл кусками в стрим, готовишь хедер шлешь его и полностью полученные куски клиенту №2. Склеиваешь куски в TFileStream. Сохраняешь в файл. Все. 

чем твой вариант отличается от предложенного мною ?...




--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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