Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обмен данными по локальной сети


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.


> данными либо файлами


Надо понимать, по твоему файлы не являются данными ? Т.е. либо "данные" либо "файлы" ? Мухи - отдельно, котлеты - отдельно ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо