Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Проблема с передачей файла через интернет


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

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

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

Автор: strk 19.10.2010, 18:30
На сервере:
Код

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 и в ней текст был нормальным каким был отправлен

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

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

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

код показан (или написан) не полностью. А что делать, если P^ не будет передан полностью за один вызов SendBuf?

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

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

Автор: v1m 21.10.2010, 20:20
лучше TFileStream использовать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)