![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Передача файла я нашел в ДРКБ, тот который с помощью TFileStream. Ну немного переделал чтобы от клиента к серверу и клиенту мог выбирать файла, который хочет отправить. Вопрос следующий мне надо осуществить передачу файла от клиента другому клиенту через сервер? Приходит в голову пока только одно - сначала принимать файла на сервере, сохранять, а потом создавать новый поток и отправлять клиенту-получателю, но мне кажется это очень долго особенно если файл большого размера. Я можно ли это осуществить другим способом?
Это сообщение отредактировал(а) VanHelsing - 10.8.2008, 07:48 |
|||
|
||||
| SneG0K |
|
|||
|
Max Mara ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1887 Регистрация: 1.12.2007 Где: Wis Dells Репутация: 2 Всего: 54 |
||||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Не совсем понимаю как это сделать. Мы же копируем в буфер сокета, а как определять кому принимать? |
|||
|
||||
| Burka |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.5.2007 Репутация: -1 Всего: 2 |
Скорей всего для этого клиент должен запускать на своей машине сервер на время передачи файла и ждать соедениния от другого клиента. Но например в интернете с этим могут быть проблемы, так как у сервера должен быть выделенный айпи(многие провайдеры объеденяют несколько пользователей под одним айпи).
-------------------- Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей. |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
А больше ни у кого никаких предложений нет? Никто с этим не сталкивался?
|
|||
|
||||
| BaD_SeCt0R |
|
|||
![]() Lazy Coder ![]() ![]() Профиль Группа: Участник Сообщений: 432 Регистрация: 9.10.2006 Где: Анапа Репутация: нет Всего: 18 |
Первый вариант:
При этом один из клиентов становиться сервером и через другой порт принимает(отправляет) данные. Второй вариант: Если так необходимо все через сервер делать, без открытия доп. портов, то отправляй данные на сервер небольшими кусками, а принятые сразу же отправляй клиенту-получателю. Пока идет прием, идет и отправка. -------------------- Кто владеет информацией - владеет миром. (С) Френсис Бэкон. |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Хотелось бы увидеть какой-нибудь пример! |
|||
|
||||
| SneG0K |
|
|||
|
Max Mara ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1887 Регистрация: 1.12.2007 Где: Wis Dells Репутация: 2 Всего: 54 |
VanHelsing, пример на словах.
Клиент: Слыш сервер, я тут типа хочу передать файлик другому юзеру, ты мне дай его IP и скажи ему чтобы подготовился. Сервер:Вот держи его IP 127.0.0.1 . Сча я его предупрежу. Клиент:УГу.. спс _______ Сервер: Дарова чувак. Клиент-2: Ку Сервер: Тут лузер с ip 127.0.0.1 хочет тебе порнухи напихать. готовся Клиент-2: Ок. Жду |
|||
|
||||
| Exai1e |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 908 Регистрация: 3.12.2006 Где: Moscow Репутация: нет Всего: 30 |
SneG0K, мда...
а сервер / клиент2 обладают телепатией ?) откуда они узнают про размер принимаемых данных ? а что мешает сделать к примеру так: клиент1: Привет сервер, хочу передать одно клиенту с айпи (123.123.13.123) (именем компа, ником что угодно) фаил, размера 3 мб сервер: Хорошо передавай =), Клиент2 тебе Клиент1 хочет фаил передать на 3 мб, лови! клиент2: Принять или не принять... вот в чем вопрос. Принимаю. ... Спросите, откуда один клиент знает айпи (ник, имя компа) другого ? Все очень просто. При подключении клиент отсылает свои данные серверу (айпи и ник к примеру) сервер у себя хранит это гденить и когда клиент1 обращается к серверу с просьбой передать фаил "васе_пупкину", то сервер берет данные васи из своей структуры (списка) и отправляет ему. например для сокетов можно взять LocalHost (имя компа) но тогда могут возникнуть проблемы если компьютеров с одним именем подключено к серверу несколько. -------------------- "Решение зависит от выбранного геморроя" © Snowy "у нас как в армии - либо работает, либо так и задумано" |
|||
|
||||
| SneG0K |
|
|||
|
Max Mara ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1887 Регистрация: 1.12.2007 Где: Wis Dells Репутация: 2 Всего: 54 |
Exai1e, я надеюсь на то, что автор темы на форточке не катался.
|
|||
|
||||
| BaD_SeCt0R |
|
|||
![]() 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. Сохраняешь в файл. Все. -------------------- Кто владеет информацией - владеет миром. (С) Френсис Бэкон. |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Да... много информации.
Ну вот что я понял. Клиент выполняет запрос:отправляет серверу свой ip, ip того кому он хочет послать файл, и размер файла, ну можно и имя файла послать(хотя я думаю что имя файла можно послать по завершению приема). Сервер спрашивает клиент, которому предназначается файл, свободен ли он и не принимает ли в данный момент какие-либо файлы. Если клиент отвечает положительно, то клиенту, кот принимает он отправляет ip отправителя и размер файла. А клиенту отправителя говорит что клиент согласен и что тот может начинать пересылать данные. И клиент начинает пересылать данные. Только не нашел как написать в виде кода отправку с клиента на клиент? Если я правильно все понял? |
|||
|
||||
| Burka |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.5.2007 Репутация: -1 Всего: 2 |
Тут скорей будет не айпи а id клиента, ну мне кажется клиенты не должны знать айпи других клиентов. но это мне так кажется =)
Так как я написал в своем первом сообщении. Один из клиентов должен запускать на своем компе сервер и должен передать через главный сервер необходимые данные для коннекта (свой айпи и порт). -------------------- Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей. |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 14 Всего: 128 |
тут я так смотрю есть два варианта:
1. Пересылка файла(данных) между клиентами ЧЕРЕЗ сервер. (что позволит передавать данные между клиентами из локальных сетей без выделенного ИП в интернете. Главное, чтобы сервер имел свой ИП) 2. Пересылка файла(данных) между клиентами напрямую, но для инициации передачи используется сервер (aka P2P). судя по сабжевому сообщению, автору нужно первое. -------------------- There are always someone smarter than you... |
|||
|
||||
| Exai1e |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 908 Регистрация: 3.12.2006 Где: Moscow Репутация: нет Всего: 30 |
чем твой вариант отличается от предложенного мною ?... -------------------- "Решение зависит от выбранного геморроя" © Snowy "у нас как в армии - либо работает, либо так и задумано" |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |