Я написал простую программу для передачи файлов, которая работает в Windows 7. Я запускаю эту программу как сервер на одном компьютере и как клиент на другом. Клиент отправляет запрос на передачу файла, а затем сервер сначала отправляет имя файла. Затем клиент подтверждает, что он получил имя файла и отправляет содержимое файла.
Эта программа безупречно работала на XP. Теперь мы пытаемся запустить его на компьютерах с Windows 7, и у него есть проблема. Проблема заключается в том, что всякий раз, когда сервер отвечает клиенту с именем файла.
Сервер отправляет текст, вызывая ServerSocket1.SendText('File1.dat').
То, что получает клиент, выглядит как китайские или вьетнамские иероглифы. Итак, моя программа не работает. Моя клиентская программа должна знать имя файла. Таким образом, он знает, где сохранить его в определенном месте на жестком диске.
Я думаю, что функция SendText принимает AnsiString, а я отправляю строковые данные. Как вы думаете, это причина?
ОБНОВЛЕНИЕ
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;
TClientSocket
иTServerSocket
НЕ реализуют поддержкуUnicodeString
правильно, поэтому вам лучше кодировать строковые данные, скажем, в UTF-8, а затем вместо этого использоватьSendBuf()
иReceiveBuf()
. - person Remy Lebeau   schedule 28.09.2011SendText()
иReceiveText()
работают сAnsiString
, а не сUnicodeString
или даже сRawByteString
.AnsiString
поддерживает кодовую страницу в D2009+, что означает, что при вызовеSendText()
произойдет неявное преобразование данных, аReceiveText()
может вернуть неверныйAnsiString
, чьи данные не соответствуют его кодовой странице правильно. - person Remy Lebeau   schedule 29.09.2011