2011-09-28 95 views
0

我寫了一個簡單的文件傳輸程序,運行在Windows 7上。我在一臺計算機上運行該程序作爲服務器,另一臺運行客戶端。客戶端發送一個文件傳輸的請求,然後服務器首先發送文件的名稱。然後,客戶端確認它獲得了文件名併發送文件的內容。Delphi XE - SendText通過ServerSocket在另一端返回中文或越南字符

這個程序在XP上運行得非常完美。現在我們試圖在Windows 7電腦上運行它,它有問題。問題是每當服務器回覆文件名到客戶端。

服務器通過調用ServerSocket1.SendText('File1.dat')發送文本。

客戶端看起來像中文或越南文字符。所以,我的程序失敗了。我的客戶程序必須知道文件的名稱。因此,它知道將其保存在硬盤的特定位置。

我想,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; 
+0

向我們展示代碼。你是否在XP和Win7上運行相同的exe文件?是的,發送ANSI編碼的文本到期望UTF-16編碼文本的管道會導致中文文本被接收! –

+0

@ David,是的,我只在Windows 7系統上運行相同的exe。 – ThN

+0

@DavidHeffernan,我明白了。當編譯它給我警告的sendtext方法,它需要AnsiString,並通過隱式轉換我可能會丟失數據。所以,我將它明確地轉換爲AnsiString,如上所示。 – ThN

回答

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; 
+0

@肯,這是我的錯誤。 – ThN

0

我解決我的問題。我不確定它爲什麼能在Windows XP上完美地工作。

無論如何,我發送和接收文本如下。我原本是通過ReceiveBuf方法將文本讀入字符數組中的。

Socket.SendText('File.log'); 

theStr:String; 
theStr := Socket.ReceiveText; 

感謝您幫助我實現自己的編程問題。

1

TClientSocket自Delphi 6以來已棄用(請參閱 Is Delphi TClientSocket (still) deprecated?),所以我期望Unicode數據和其他方面的問題。正如其中一個答案所寫,TClientSocket和TServerSocket也使用基於Windows消息的無效設計。所以我會嘗試使用Indy或Synapse。這也將使它可以用於跨平臺的使用(Windows消息在OSX上不可用)。

+0

@ mjn有趣。我將不得不在下一次修訂中實施您的建議。謝謝。 – ThN