Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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
open "file.exe" for input as #1

а этот метод не сильно повлияет на скорость выполнения приложения??

Ответить

Номер ответа: 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-сайт: neco.pisem.net
 Профиль | | #12
Добавлено: 08.01.06 21:41
Программа читает кусочек из файла, затем считает CRC32

Незачем сверять данные, если используешь TCP - он гарантирует верную передачу. Поэтому ПРОСТО последовательно отсылаешь серваку файл (можно просто сразу весь его как бы отправить - он будет в буфере винсока сидеть и потихоньку отправляться - разумеется, если ты не фильм перекачиваешь), а на серваке всё приходящее записывать в конец файла. Я уже давно написал прогу для передачи файлов и переписки по сети, раздал многим знакомым - по телефонной линии скорость ~25, а на искажённые данные никто не жаловался.

Ответить

Номер ответа: 13
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #13
Добавлено: 08.01.06 21:48
Кстати.
Для пересылки файла используешь отдельную пару винсоков. Перед этим пересылая имя файла перешли и его размер - тогда сервер (получающий файл) получив весь файл узнает об этом первым и будет считать передачу завершённой.
Только ни в коем случае, не отправляй через другой винсок уведомление от клиента, типа "я тебе передал весь файл - закрывай" - оно может придти раньше, чем на другом винсоке (рабочем) придёт конец файла и хана - файл не дописан.

Ответить

Номер ответа: 14
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #14 Добавлено: 08.01.06 22:12
ну вот я, допустим, юзаю такой способ:

private sub WS_Connect()
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.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам