![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обмен данными по локальной сети
Sheng © (2003-06-19 11:44:00)
Привет всем! Такой вопрос уже много раз обсуждался, но я не нашел подходящего мне ответа.
Мне нужно обмениваться данными либо файлами между несколькими приложениями, причём данные могут быть от 120 байт до 200 метров и более (ну, более - маловероятно, но 200 - точно). Причём нужно как-то показывать процесс передачи (ПрогрессБар, например). Вот.
Как сие можно реализовать на Делфи?
Palladin (2003-06-20 14:55:00) [1]
программу ему надо... последовательность... что сделать, вот что ему надо...
сам он последовательность действий построить к сожалению не может...
Digitman (2003-06-19 16:43:00) [2]
> Sheng
Какие еще "намеки" ?
Что тебе кажется "намеком" в Digitman © (19.06.03 14:41) ?
Прямая рекомендация - для приема очередного блока данных использовать метод ReceiveBuf() в событии OnRead()
Anatoly Podgoretsky (2003-06-19 16:09:00) [3]
Должны быть (очень) конкретные вопросы.
Sheng (2003-06-19 15:58:00) [4]
Да тут всё, как говорится, намёками да намёками. Мне понятнее было бы на конкретных работающих примерах.
Digitman (2003-06-19 15:21:00) [5]
Что непонятно ? Конкретно ?
Sheng (2003-06-19 15:12:00) [6]
Например, как сделано копирование файлов по сети в WindowsCommander"e или в Far"e.
Sheng (2003-06-19 15:09:00) [7]
Всё равно не понятно.
Может кто сталкивался с этим или у кого есть пример процедуры Сервера и процедуры Клиента по передаче/приёму данных большого размера по сети?
Digitman (2003-06-19 14:41:00) [8]
На стороне приемника в событии OnRead() выполняй Socket.ReceiveBuf()
Sheng (2003-06-19 14:32:00) [9]
Так как правильно передать большой поток данных по сети?
Sheng (2003-06-19 13:35:00) [10]
Второй вопрос решён. А первый?? Теперь вообще непонятно, как пересылать поток.
Digitman (2003-06-19 13:32:00) [11]
> ServerSocket1.Socket.SendStream(); - пересылает поток
это неверно, потому что send/receive-методы на серверной стороне допустимо вызывать только для тех объектов, которые фигурируют в списке ServerSocket1.Socket.Connections[], т.е. только для объектов класса TServerClientWinSocket, но никак не для TServerWinSocket.
> как вывести индикатор прогресса передачи файла?
используй событие OnClientWrite().
в этом событии ты можешь обратиться к свойствам TFilestream.Position и TFilestream.Size.
Sheng (2003-06-19 13:02:00) [12]
Хотя можно использовать TFileStream. Остаются вопросы:
ServerSocket1.Socket.SendStream(); - пересылает поток.
Как его принять?
И как вывести индикатор прогресса передачи файла?
Sheng (2003-06-19 12:48:00) [13]
TFileStream - это конечно хорошо, но я вот и писал - данные либо файлы. Если файлы - то да, всё ок, хотя ещё не все и там ясно. А если не файл, а данные, которые вычисляются программой (например, из большой таблицы выбирается много строк, они преобразовываются и отправляются). Конечно, можно их сохранить в файл и затем отправить. Но это как-то не так.
И ещё вопрос по TClientSocket:
ServerSocket1.Socket.SendStream(); - пересылает поток.
А как его принять? (я с сетями ещё только начинаю работать, почти ничего не знаю)
Digitman (2003-06-19 12:22:00) [14]
> Если потоком - то нельзя, пишет памяти мало
А кто тебя заставляет использовать обязательно TMemoryStream ?
Открой файл для чтения объектом класса TFileStream и передавай его (файловый поток) на здоровье методом CustomWinSocket.SendStream() !
Метод SendStream() будет считывать файл, ассоциированный с TFileStream, в один и тот же фиксированный по размеру буфер памяти поблочно (по 4k за один прием) и точно так же поблочно отправлять.
Sheng (2003-06-19 12:11:00) [15]
А то можно на вопрос "Как написать программу ..." ответить:
см. Delphi, C++
Sheng (2003-06-19 12:09:00) [16]
> > данными либо файлами
Да это я так сказал... для общности.
Данные желательно передавать по TCP/IP.
На счет TClientSocket, TServerSocket: как там передать данные большого (>200 метров) размера. Если потоком - то нельзя, пишет памяти мало. По другому - я не знаю.
Если не затруднит, то на примере. На примере понятнее.
Digitman (2003-06-19 12:00:00) [17]
см. TClientSocket, TServerSocket для TCP-транспорта
см. NamedPipes- и MailSlot- спецификации для NetBIOS-транспорта
p.s.
> данными либо файлами
Надо понимать, по твоему файлы не являются данными ? Т.е. либо "данные" либо "файлы" ? Мухи - отдельно, котлеты - отдельно ?