Модераторы: 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   Вверх
BaD_SeCt0R
Дата 14.8.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lazy Coder
**


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

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



Exai1e, у тебя сервер принимает файл целиком и только потом отправляет. 3 МБ немного, а если 3 ГБ?


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


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



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

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



Цитата

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

Я просто хочу разобраться с двумя вариантами. С первым я все понял и как сделать представлю. Хотелось бы разобраться со вторым. 
Обратился клиент к серверу тот передал запрос клиенту получателю, тот ответил серверу, а сервер в свою очередь клиенту-отправителю. Как это сделать я знаю! Я не знаю как написать пересылку от клиента-отправителя к клиенту получателя.
Например чтобы с сервера отправить что-либо определенному клиенту нужно написать:
Код

 ServerSocket1.Socket.Connections[i].SendStream()

А как это сделать с клиента клиенту?


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


Lazy Coder
**


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

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



Цитата(VanHelsing @  14.8.2008,  15:56 Найти цитируемый пост)
А как это сделать с клиента клиенту?

Точно так же. Клиент тоже должен содержать на форме TServerSocket для открытия ДРУГОГО порта


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


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



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

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



Извините може задаю слишком много тупых вопросов, но все же...
Получается мне придется на клиенте включать сервер? Если так, то возникает несколько вопросов. То есть мне придется открывать новый сервер по другому порту. Далее клиент-получатель подключается к новому серверу  и начинается передача файла?
P.S. А может ли клиент быть одновременно подключен в нескольким серверам?  


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


Lazy Coder
**


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

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



Цитата(VanHelsing @  14.8.2008,  18:43 Найти цитируемый пост)
То есть мне придется открывать новый сервер по другому порту

А как иначе? smile 

Цитата(VanHelsing @  14.8.2008,  18:43 Найти цитируемый пост)
Далее клиент-получатель подключается к новому серверу  и начинается передача файла?

Можно для этого предусмотреть и другого клиента.

Цитата(VanHelsing @  14.8.2008,  18:43 Найти цитируемый пост)
А может ли клиент быть одновременно подключен в нескольким серверам?

TClientSocket? Нет. По определению. Дублируй компонент.


--------------------
Кто владеет информацией - владеет миром. (С) Френсис Бэкон.
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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