Страница: 1 | 2 |
Вопрос: Передача файлов.
Добавлено: 06.01.06 16:56
Автор вопроса: Elkatib
Вообщем, не могу разобраться как передать файл от клиента к серверу. Просматрел примеры... но никак не могу вникнуть в суть кодов. Пожалуйста, помогите разобраться: как это можно сделать?
----
Если баян - прошу не шпынять меня! :)
Ответы
Всего ответов: 28
Номер ответа: 1
Автор ответа:
ASiD
ICQ: 259132473
Вопросов: 19
Ответов: 23
Профиль | | #1
Добавлено: 06.01.06 17:07
1. Открываешь файл
2. Записываешь его содержимое в переменную
3. Отправляешь его серверу по winsock
Номер ответа: 2
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #2
Добавлено: 06.01.06 17:59
баян. "как это можно сделать?" - в примерах показано. "помогите разобраться" - как (чем) помочь?
Номер ответа: 3
Автор ответа:
Elkatib
Вопросов: 18
Ответов: 25
Профиль | | #3
Добавлено: 06.01.06 18:02
А разве нет огрничения данных в передачи переменной от клиента к серверу?
И как открывать файл? как бинари или по обычному?
Номер ответа: 4
Автор ответа:
ASiD
ICQ: 259132473
Вопросов: 19
Ответов: 23
Профиль | | #4
Добавлено: 06.01.06 19:15
Ограничения есть. Чтобы они тебе не мешали, разбей файл на части по *** кб и отправляй частями.
Файл открывать коммандой open "file.exe" for input as #1
Номер ответа: 5
Автор ответа:
Elkatib
Вопросов: 18
Ответов: 25
Профиль | | #5
Добавлено: 06.01.06 19:40
Ооооо...ну это геморой... это во-первых надо как-то разделить файл, потом, надо, что бы сервер собрал их в один файл - что я даже не представляю как можно сделать!
Номер ответа: 6
Автор ответа:
Dushes
ICQ: 249195431
Вопросов: 8
Ответов: 110
Профиль | | #6
Добавлено: 06.01.06 20:47
Ну вот вариант:
Программа читает кусочек из файла, затем считает CRC32 для этого кусочка, затем передает на удаленный компьютер, где кусочек сверяется с CRC32. Если не сходится, программа на приеме приостанавливает прием и перезапрашивает данные. Кроме того программа передатчик следит, чтобы кусочек файла не потерялся при передаче. В процессе передачи программа следит, чтобы случайно не перполнился буффер на передаче. В случае такой опасности, передача приостанавливается до частичной разгрузки буффера. Вот это - довольно упрощенный протокол файлообмена V 1.0 одной моей программы (но это слишком громео сказано ). Там еще есть докачка, и еще койчего... Вот ! От этого можно исходить...
Номер ответа: 7
Автор ответа:
«UL.eXe»
ICQ: 197.895.916.247
Вопросов: 72
Ответов: 540
Профиль | | #7
Добавлено: 06.01.06 23:17
есть, поэтому файл и надо делить на части..
да как угодно, но в разумных приделах
если не ошибаюсь, как byte.
Номер ответа: 8
Автор ответа:
«UL.eXe»
ICQ: 197.895.916.247
Вопросов: 72
Ответов: 540
Профиль | | #8
Добавлено: 06.01.06 23:25
а этот метод не сильно повлияет на скорость выполнения приложения??
Номер ответа: 9
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #9
Добавлено: 07.01.06 04:06
Elkatib, общий вид примера передачи файла по локалке у тебя есть, конкретные непонятные места я готов прокоментировать лично. Если не понятно вообще ничего - читаем книги.
Номер ответа: 10
Автор ответа:
Elkatib
Вопросов: 18
Ответов: 25
Профиль | | #10
Добавлено: 07.01.06 11:45
Если честно не понятно вообще ничего - видимо придётся читать книги... но дело не в этом... я не совсем дурак :0 и о способах реализации, в принципе догадывался, но вот если бы сунули под нос код и сказали здесь он делает то-то мне было бы легче
В любом случае всем спасибо!
Номер ответа: 11
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #11
Добавлено: 07.01.06 17:10
Что там непонятного? Элементарно Ватсон!
Есть Winsock1 - ето контрол для работы с TCP/IP, UDP... Есть он как у клиента, так и у сервера... И знач контрол этот методом Winsock1.SendData "тута данные" умеет передавать данные туды куды он подключён щас... Для красоты в начале (перед передачей) возможно передают имя, размер файла, может crc32 итп... В итоге:
Сервак:
Winsock1.Close 'если до этого передпапли чё то
Winsock1.Protocol = sckTCPProtocol
Winsock1.LocalPort = какой нибуть порт...
Winsock1.Listen 'слушаем порт (ожидаем подключения)
далее при подключении происходит Private Sub Winsock1_Connect() ставят какой-то флаг что пора передавать итп...
затем
Winsock1.SendData "все содержимое файла итп..."
и пошла передача Разукрашуют, определением прогресса передачи, скорости итп...
Клиент:
по скольку сервак его ждёт, достаточно к нему подключится...
Winsock1.Connect IP, port...
начнётся передача, принимать данные тож просто...
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
происходит когда что-то пришло... (типа пакет...)
И получить этот пакет во так:
Winsock1.GetData strData, vbString
в strData будет то что пришло...
возможно все пакеты (части) собирают в одну порцию данные (в файл) т.е. может быть что-то типа Full$ = Full$ & strData а в конце передачи Full$ записывют в файл, или постоянно при кажом приходе порции данных сразу пишут её в файл
В bytesTotal - размер этого пакеты, так можно отследить скорость и прогресс передачи, закрыть соединения когда все данные переданы итп...
Ну это так... в общем представлении, более доходчиво - см. статьи в инете...
Номер ответа: 12
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #12
Добавлено: 08.01.06 21:41
Незачем сверять данные, если используешь TCP - он гарантирует верную передачу. Поэтому ПРОСТО последовательно отсылаешь серваку файл (можно просто сразу весь его как бы отправить - он будет в буфере винсока сидеть и потихоньку отправляться - разумеется, если ты не фильм перекачиваешь), а на серваке всё приходящее записывать в конец файла. Я уже давно написал прогу для передачи файлов и переписки по сети, раздал многим знакомым - по телефонной линии скорость ~25, а на искажённые данные никто не жаловался.
Номер ответа: 13
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #13
Добавлено: 08.01.06 21:48
Кстати.
Для пересылки файла используешь отдельную пару винсоков. Перед этим пересылая имя файла перешли и его размер - тогда сервер (получающий файл) получив весь файл узнает об этом первым и будет считать передачу завершённой.
Только ни в коем случае, не отправляй через другой винсок уведомление от клиента, типа "я тебе передал весь файл - закрывай" - оно может придти раньше, чем на другом винсоке (рабочем) придёт конец файла и хана - файл не дописан.
Номер ответа: 14
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #14
Добавлено: 08.01.06 22:12
ну вот я, допустим, юзаю такой способ:
dim f as string
open "file.dat" for input as #1
for i=1 to flen(1)
get #1, , f
call ws.senddata(f)
doevents
next
close
end sub
а у сервера там они потихоньку рассосуться...
Номер ответа: 15
Автор ответа:
Dushes
ICQ: 249195431
Вопросов: 8
Ответов: 110
Профиль | | #15
Добавлено: 09.01.06 07:34
2 Neco
Я бы на твоем месте не всегда полагался бы на родной TCP. Возможно сама структура протокола и обеспечиват безглючную передачу данных, но вот глюки откуда то берутся (иногда). Знаешь такое: береженого бог бережет. А эту библиотеку на асме - в ней 4 кб и все равно программе нужна, поскольку он у меня недокачанные файлы смотрит по CRC32.