![]() |
|
Модераторы: 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 "у нас как в армии - либо работает, либо так и задумано" |
|||
|
||||
| BaD_SeCt0R |
|
|||
![]() Lazy Coder ![]() ![]() Профиль Группа: Участник Сообщений: 432 Регистрация: 9.10.2006 Где: Анапа Репутация: нет Всего: 18 |
Exai1e, у тебя сервер принимает файл целиком и только потом отправляет. 3 МБ немного, а если 3 ГБ?
-------------------- Кто владеет информацией - владеет миром. (С) Френсис Бэкон. |
|||
|
||||
| VanHelsing |
|
||||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Я просто хочу разобраться с двумя вариантами. С первым я все понял и как сделать представлю. Хотелось бы разобраться со вторым. Обратился клиент к серверу тот передал запрос клиенту получателю, тот ответил серверу, а сервер в свою очередь клиенту-отправителю. Как это сделать я знаю! Я не знаю как написать пересылку от клиента-отправителя к клиенту получателя. Например чтобы с сервера отправить что-либо определенному клиенту нужно написать:
А как это сделать с клиента клиенту? |
||||
|
|||||
| BaD_SeCt0R |
|
|||
![]() Lazy Coder ![]() ![]() Профиль Группа: Участник Сообщений: 432 Регистрация: 9.10.2006 Где: Анапа Репутация: нет Всего: 18 |
Точно так же. Клиент тоже должен содержать на форме TServerSocket для открытия ДРУГОГО порта -------------------- Кто владеет информацией - владеет миром. (С) Френсис Бэкон. |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Извините може задаю слишком много тупых вопросов, но все же...
Получается мне придется на клиенте включать сервер? Если так, то возникает несколько вопросов. То есть мне придется открывать новый сервер по другому порту. Далее клиент-получатель подключается к новому серверу и начинается передача файла? P.S. А может ли клиент быть одновременно подключен в нескольким серверам? |
|||
|
||||
| BaD_SeCt0R |
|
||||
![]() Lazy Coder ![]() ![]() Профиль Группа: Участник Сообщений: 432 Регистрация: 9.10.2006 Где: Анапа Репутация: нет Всего: 18 |
А как иначе?
Можно для этого предусмотреть и другого клиента.
TClientSocket? Нет. По определению. Дублируй компонент. -------------------- Кто владеет информацией - владеет миром. (С) Френсис Бэкон. |
||||
|
|||||
![]()
|
| Правила форума "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. |