2011-09-07 101 views
3

我正在使用delphi XE中的TIdCmdTCPServer進行一個概念驗證應用程序。需要基本使用TIdCmdTCPServer的幫助

我的代碼似乎有些問題,因爲只有第一個命令有效。如果我重複相同的命令,它會「超時」。查看下面的客戶代碼列表。

這裏是我的命令處理程序:

procedure TForm1.IdCmdTCPServer1CommandHandlersGetDateTimeCommand(ASender: TIdCommand); 
begin 
    ASender.Reply.SetReply(200, 'OK!'); 
    ASender.Reply.Text.Add(DateTimeToStr(Now)); 
    ASender.SendReply; // I expect this must be redundant 
end; 

這裏的服務器組件(這裏沒有什麼特別;我設定的端口號,並創建了一個命令處理程序):

object IdCmdTCPServer1: TIdCmdTCPServer 
    Bindings = <> 
    DefaultPort = 7000 
    CommandHandlers = < 
    item 
     CmdDelimiter = ' ' 
     Command = 'GetDateTime' 
     Disconnect = False 
     Name = 'TIdCommandHandler0' 
     NormalReply.Code = '200' 
     ParamDelimiter = ' ' 
     ParseParams = True 
     Tag = 0 
     OnCommand = IdCmdTCPServer1CommandHandlersGetDateTimeCommand 
    end 
    ExceptionReply.Code = '500' 
    ExceptionReply.Text.Strings = (
    'Unknown Internal Error') 
    Greeting.Code = '200' 
    Greeting.Text.Strings = (
    'Welcome') 
    HelpReply.Code = '100' 
    HelpReply.Text.Strings = (
    'Help follows') 
    MaxConnectionReply.Code = '300' 
    MaxConnectionReply.Text.Strings = (
    'Too many connections. Try again later.') 
    ReplyTexts = <> 
    ReplyUnknownCommand.Code = '400' 
    ReplyUnknownCommand.Text.Strings = (
    'Unknown Command') 
    Left = 64 
    Top = 8 
end 

這裏的客戶端代碼,其中問題發生:

Client.Connect; 
    try 
    // retrieve welcome text 
    memo1.lines.AddStrings(Client.LastCmdResult.Text); 

    Client.SendCmd('GetDateTime', 200); 
    memo1.lines.AddStrings(Client.LastCmdResult.Text); 

    //////////////////////////// FAILS HERE (timeout) 
    Client.SendCmd('GetDateTime', 200); 
    memo1.lines.AddStrings(Client.LastCmdResult.Text); 
    finally 
    Client.Disconnect(true); 
    end; 

和客戶端組件(這裏沒什麼特別的;我設置主機&端口#):

object Client: TIdCmdTCPClient 
    ConnectTimeout = 1000 
    Host = '127.0.0.1' 
    IPVersion = Id_IPv4 
    Port = 7000 
    ReadTimeout = 1000 
    CommandHandlers = <> 
    ExceptionReply.Code = '500' 
    ExceptionReply.Text.Strings = (
    'Unknown Internal Error') 
    Left = 144 
    Top = 96 
end 

任何想法爲什麼會發生這種情況?

謝謝! mp

回答

4

您不能使用TIdCmdTCPClientTIdCmdTCPServerTIdCmdTCPClient運行一個連續從連接中讀取的內部線程,但該方法也會執行自己的讀取操作,因此兩者會相互干擾並獲取對方的數據。這就是爲什麼你會遇到超時錯誤。您需要更改客戶端代碼才能使用TIdTCPClient而不是TIdCmdTCPClient

+0

謝謝雷米!當你對別人說這些話時,我並不明白你的意思。 –

+0

>「您不能將TIdCmdTCPClient與TIdCmdTCPServer一起使用」。真?那麼TIdCmdTCPClient的目的是什麼?爲什麼客戶端組件會自動讀取某些內容?這種行爲不正常與服務器端相關嗎?我想嘗試兩個組件,因爲我需要一個發送簡單命令的小型客戶端 - 服務器應用程序,但我不想實現自己的協議。即使TIdTCPServer的文件說使用Cmd組件,因爲tcp only組件不提供應用程序級別的協議。 – StanE

+0

名稱中的'Cmd'指的是'CommandHandlers'集合,其中'TIdCmdTCPClient'和'TIdCmdTCPServer'都具有。 'TIdCmdTCPClient'用於客戶端套接字連接到服務器套接字的協議,然後客戶端接收來自服務器的未經請求/異步的數據包,由客戶端的'CommandHandlers'處理。數據包可能會或可能不會響應命令,但它們不遵循大多數協議使用的傳統客戶端命令/服務器響應模式。 'TIdIRC'就是一個例子... –