Delphi XE - SendText через ServerSocket возвращает китайские или вьетнамские символы на другом конце - PullRequest
0 голосов
/ 28 сентября 2011

Я написал простую программу передачи файлов, которая работает в Windows 7. Я запускаю эту программу как сервер на одном компьютере и клиент на другом. Клиент отправляет запрос на передачу файла, а затем сервер сначала отправляет имя файла. Затем клиент подтверждает, что он получил имя файла и отправляет содержимое файла.

Эта программа работала безупречно на XP. Сейчас мы пытаемся запустить его на компьютерах с Windows 7, и у него есть проблема. Проблема в том, что каждый раз, когда сервер отвечает клиенту с именем файла.

Сервер отправляет текст, вызывая ServerSocket1.SendText ('File1.dat').

То, что получает клиент, похоже на китайские или вьетнамские символы. Итак, моя программа не работает. Моя клиентская программа должна знать имя файла. Таким образом, он знает, где сохранить его в определенном месте в hardrive.

Я думаю, функция SendText принимает AnsiString, и я посылаю строковые данные. Как вы думаете, в этом причина?

UPDATE

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   Socket.SendText(AnsiString('calibrate.log'));
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
   Buffer:array[0..999] of char;
begin
   Socket.ReceiveBuf(Buffer,Socket.ReceiveLength);
end;

Ответы [ 3 ]

1 голос
/ 29 сентября 2011

TClientSocket не рекомендуется с Delphi 6 (см. Является ли Delphi TClientSocket (все еще) устаревшим? ), поэтому можно ожидать проблем с данными Unicode и в других областях.Как написано в одном из ответов, TClientSocket и TServerSocket также используют неэффективный дизайн, основанный на сообщениях Windows.Поэтому я бы попытался использовать Indy или Synapse.Это также сделало бы его готовым к межплатформенному использованию (сообщения Windows явно недоступны в OSX).

1 голос
/ 29 сентября 2011

Ну, ваши проблемы связаны с тем, что вы отправляете свои данные как AnsiString и читаете их с WideChars (Char - это псевдоним WideChar в Delphi XE).

Изменение вашего кода для этого, скорее всего, решит вашу проблему.

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var    
  Buffer:array[0..999] of Ansichar; 
begin    
  Socket.ReceiveBuf(Buffer,Socket.ReceiveLength); 
end; 
0 голосов
/ 28 сентября 2011

Я решил свой вопрос.Я не уверен, почему он работает безупречно в Windows XP.

В любом случае, я отправляю и получаю тексты следующим образом.Первоначально я читал текст в массив символов с помощью метода ReceiveBuf. * ​​1003 *

Socket.SendText('File.log');

theStr:String;
theStr := Socket.ReceiveText;

Спасибо за помощь в реализации моей собственной проблемы программирования.

...