Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с передачей файла через интернет, C ошибкой сохраняется TStream 
V
    Опции темы
strk
Дата 19.10.2010, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.2.2009

Репутация: нет
Всего: нет



Здравствуйте! Возникла проблема с передачей файла(TMemoryStream) через TServerSocket и TClientSocket в Delphi 2010/XE...
Проблема такая: Сам по себе файл передаётся вроде без проблем, но при попытке получить файл иp TMemoryStream он получается как будто в неправильной кодировке.
Вроде больше нечего сказать про проблему.
Но известно что проблема точно не в коде программы, т.к. проверял на Delphi 7/2010/XE и на 7ой версии проект без проблем передавался и сохранялся(без изменений кода) как надо, но в 7ой версии не компилируется вся остальная программа и по этому хотелось бы решить эту проблему и продолжить писать в Delphi XE.
Зарание спасибо

P.S. Передавать пробовал разными способами, все работали только на 7ой версии...

Это сообщение отредактировал(а) strk - 19.10.2010, 17:20
PM MAIL   Вверх
bems
Дата 19.10.2010, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



А как файл попадает в TMemoryStream? до его попадания туда не возникает проблем с переходом на уникод?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
strk
Дата 19.10.2010, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.2.2009

Репутация: нет
Всего: нет



На сервере:
Код

Var MS: TMemoryStream;
      P: ^Byte;
...
MS := TMemoryStream.Create;
MS.LoadFromFile(Edit1.Text);
P := MS.Memory;
ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size);


На клиенте:
Код

if MS.Size < Size then //MS: TMemoryStream
MS.Write(Text[1], Length(Text)); //Text: String и = Socket.ReceiveText
if MS.Size = Size then
begin
Receive := false;
MS.Position := 0;
MS.SaveToFile(FileName);
ClientSocket1.Socket.SendText('end');
MS.Free;


то что описано в клиенте повторяется пока файл не загружен, а точнее пока Receive = true
там еще перед передачей отправляется размер и имя файла, но с ними проблем нет.
Файл точно передается полностью, так как при сохранении количество символов и их положение совпадают, но сами символы другие...
И как я уже писал, такая проблема только в 2010 и XE, а в Delphi 7 с этим проблем нет, всё отлично передается.

Цитата

до его попадания туда не возникает проблем с переходом на уникод?


вроде бы нет, по крайней мере я ставил перед пиремом BreakPoint и смотрел что происходит с переменными на каждом действии, а именно с переменной Text и в ней текст был нормальным каким был отправлен

Это сообщение отредактировал(а) strk - 19.10.2010, 18:34
PM MAIL   Вверх
bems
Дата 19.10.2010, 18:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Цитата(strk @  19.10.2010,  18:30 Найти цитируемый пост)
MS.Write(Text[1], Length(Text)); //Text: String и = Socket.ReceiveText
с уникодом символ больше не равен байту.  Чтобы записать всю строку нужно вместо Length(Text) сделать Length(Text) * SizeOf(Char)

Ну и заполнение Text не показано, там может быть проблема с кодировкой. Лучше бы вообще отказаться от использования строки как просто буффера. Ну или напиши там AnsiString и проверь



--------------------
Обижено школьников: 8
PM MAIL   Вверх
kami
Дата 20.10.2010, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(strk @  19.10.2010,  18:30 Найти цитируемый пост)
Connections[0].SendBuf(P^, MS.Size);

код показан (или написан) не полностью. А что делать, если P^ не будет передан полностью за один вызов SendBuf?
PM MAIL WWW   Вверх
strk
  Дата 20.10.2010, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.2.2009

Репутация: нет
Всего: нет



Цитата(bems @  19.10.2010,  18:38 Найти цитируемый пост)
Ну или напиши там AnsiString и проверь

Спасибо огромное, с AnsiString заработало smile

PM MAIL   Вверх
v1m
Дата 21.10.2010, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


v1mka



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 10.6.2010

Репутация: нет
Всего: 1



лучше TFileStream использовать
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.