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
謝謝雷米!當你對別人說這些話時,我並不明白你的意思。 –
>「您不能將TIdCmdTCPClient與TIdCmdTCPServer一起使用」。真?那麼TIdCmdTCPClient的目的是什麼?爲什麼客戶端組件會自動讀取某些內容?這種行爲不正常與服務器端相關嗎?我想嘗試兩個組件,因爲我需要一個發送簡單命令的小型客戶端 - 服務器應用程序,但我不想實現自己的協議。即使TIdTCPServer的文件說使用Cmd組件,因爲tcp only組件不提供應用程序級別的協議。 – StanE
名稱中的'Cmd'指的是'CommandHandlers'集合,其中'TIdCmdTCPClient'和'TIdCmdTCPServer'都具有。 'TIdCmdTCPClient'用於客戶端套接字連接到服務器套接字的協議,然後客戶端接收來自服務器的未經請求/異步的數據包,由客戶端的'CommandHandlers'處理。數據包可能會或可能不會響應命令,但它們不遵循大多數協議使用的傳統客戶端命令/服務器響應模式。 'TIdIRC'就是一個例子... –