2011-10-05 17 views
1

請告知爲什麼發生這種情況。 於簡單的服務器應用程序,我有以下代碼:德爾福tserversocket忽略第1條消息

procedure TForm13.ServerSocket1ClientRead(Sender: TObject; 
Socket: TCustomWinSocket); 
var str : string; 
begin 
    str := socket.ReceiveText; 
    showmessage(str); 
end; 

,並在客戶端上我有

clientsocket1.Open; 
clientsocket1.Socket.SendText(txtMSG.Text); 

沒有什麼花哨。 奇怪的是,當我第一次向服務器發送消息時,它會被忽略。每一次之後,它都很棒。 ClientRead事件在第1條消息中根本不會觸發

我可以在服務器上更改哪些內容以使其接受第1條消息。 由於第三方向我發送消息,我無法控制客戶端,所以我總是錯過第一條消息。

謝謝!

+1

我建議移動到突觸或互聯網直接(印),舊插座組件,因爲德爾福6棄用 – mjn

+1

@mjn:他們不再被推薦使用D2009,而不是D6。僅僅因爲它們被棄用並不意味着它們仍然不能被使用,或者它們仍然不是有用的。 –

回答

3

如果您在非阻塞模式下使用TClientSocket(這是默認設置),則在Open()返回後不能立即發送數據,因爲連接尚未準備好。你必須等待OnConnect事件首先被觸發,例如:

Procedure TForm1.StartConnectingToServer; 
Begin 
    ClientSocket1.Open; 
End; 

Procedure TForm1.ClientSocket1Connect(Socket: TCustomWinSocket); 
Begin 
    Socket.SendText(txtMSG.Text); 
End; 
+0

說明了很多!不幸的是,在真實世界的例子中,我沒有控制客戶端,因爲它是由GE編寫的第三方系統,我不認爲它們會讓我的這段代碼隨時更改 – Crudler

+0

您不必擔心這一點。你的服務器代碼沒問題(儘管在現實世界的情況下,'ReceiveText()'很少用,你會更頻繁地使用'ReceiveBuf()')。您的問題是由於您的測試客戶端錯誤地嘗試在錯誤的時間發送數據。寫自己客戶的人會以自己的方式處理同樣的問題。這不是你的責任。 –