![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| Диас |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 124 Регистрация: 11.6.2006 Репутация: нет Всего: нет |
Здравствуйте. Необходимо отправить файл с клиента на сервер. Использую Delphi 7 и Indy 9. На клиенте пишу:
filename берется из OpenDialog'а. А на сервере обработчик команды RegisterUser имеет вид:
Но сервер зависает на строчке "ASender.Thread.Connection.ReadStream(stream);" Может надо как-то передать, что стрим закончен? Или может предварительно отправить размер передаваемого файла? Кто знает в чем дело, прошу указать на недостатки/ошибки. |
||||
|
|||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 5 Всего: 98 |
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Диас |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 124 Регистрация: 11.6.2006 Репутация: нет Всего: нет |
Разумеется, это в первую очередь! И только, потому что там нет моего случая, пришлось создать тему!
Это сообщение отредактировал(а) Диас - 30.6.2006, 11:54 |
|||
|
||||
| Диас |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 124 Регистрация: 11.6.2006 Репутация: нет Всего: нет |
Уже пробую делать так: взято с примера Indy9Demos, ImageServer. Только пришлось немного переделать, потому что в примере пересылка тоже идет от сервера к клиенту.
Отправка с клиента:
На сервере существует CommandHandler - File. Его обработчик:
Проблема 1: После данной переделки файл отказывается загружаться в Image и даже открываться в Винде, хотя имеет тотже размер и расширение. Проблема 2: Как видно из кода сервера, поток читается до тех пор, пока клиент не отсоединится. А мне нужно, чтобы клиент не отсоединялся, чтобы узнал как там все прошло (GetResponse(200)). |
||||
|
|||||
| Romikgy |
|
||||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 3 Всего: 146 |
сравни файлы по содержимому, тотал командер это умеет, может просто зануляется файл
не понял что те нужно? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 53 Всего: 484 |
Сначала нужно передать размер передаваемых данных, чтобы сервер знал, сколько байт ему принимать.
|
|||
|
||||
| Диас |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 124 Регистрация: 11.6.2006 Репутация: нет Всего: нет |
Сервер заканчивает читать поток только после разъединения:
А мне не надо разъединяться.
А какое поставить условие? Или где потом на сервере указать сколько байт принимать? |
||||||
|
|||||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 53 Всего: 484 |
-1 это и есть читать до дисконнекта.
Хочешь другой результат - задавай размер. Чтобы его задать, его должен сообщить клиент, ибо серверу абсолютно неизвестен размер файла. Перед отправкой стрима, отправь 4 байта с длиной файла. На стороне сервера читай эти 4 байта. На клиенте отправляй стрим. На сервере принимай стрим, только вместо -1 указывай принятый размер. |
|||
|
||||
| Диас |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 124 Регистрация: 11.6.2006 Репутация: нет Всего: нет |
Все сделал, как ты сказал, файл принимается и идентичен по размеру оригиналу, но по содержимому они разные! При открытии их в блакноте у нового файла имеется пустая строка в начале. Щас попробую через Тотал командер.
|
|||
|
||||
| Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 53 Всего: 484 |
На клиенте соответственно нужно перед отправкой стрима послать размер WriteInteger; Добавлено @ 10:35
А нужно WriteStream(fstream); |
||||
|
|||||
| Диас |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 124 Регистрация: 11.6.2006 Репутация: нет Всего: нет |
Короче, все понятно!
Глюки проявляли себя так: Когда я передавал размер стрима в виде параметра, файл нормально принимался, но потом не открывался, потому что в него, зачем-то, в начало записывались 2 каких-то байта, вместо 2-х нулевых в конце. Если удалить их то файл открывается. Когда передаешь размер стрима WriteInteger(stream.size), то на приеме (sz:=ReadInteger) sz равняется всегда 218772273. Получается, что лучше передавать что-либо не через параметры, а так, Writ'ом. Всем спасибо!!! |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |