Delphi XE - SendText通过ServerSocket在另一端返回中文或越南文字符

问题描述 投票:0回答:3

我写了一个在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;
string delphi tcp client-server delphi-xe
3个回答
1
投票

好吧,您的问题来自于您将数据作为AnsiString发送,并使用WideChars读取它(Char是Delphi XE中WideChar的别名)。

为此更改代码很可能会解决您的问题。

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

1
投票

自Delphi 6(请参阅Is Delphi TClientSocket (still) deprecated?)以来,TClientSocket已被弃用,因此我预计Unicode数据和其他方面存在问题。正如其中一个答案中所写,TClientSocket和TServerSocket也使用基于Windows消息的无效设计。所以我会尝试使用Indy或Synapse。这也使它可以用于跨平台使用(Windows消息在OSX上不可用)。


0
投票

我解决了我的问题。我不确定为什么它在Windows XP上完美运行。

无论如何,我发送和接收文本如下。我最初是通过ReceiveBuf方法将文本读入字符数组。

Socket.SendText('File.log');

theStr:String;
theStr := Socket.ReceiveText;

感谢您帮助我实现自己的编程问题。

© www.soinside.com 2019 - 2024. All rights reserved.