我正在使用在delphi XE中使用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;
Run Code Online (Sandbox Code Playgroud)
这是服务器组件(这里没什么特别的;我设置端口号并创建了命令处理程序):
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
Run Code Online (Sandbox Code Playgroud)
这是发生问题的客户端代码:
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;
Run Code Online (Sandbox Code Playgroud)
和客户端组件(这里没什么特别的;我设置了主机和端口号):
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
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会这样?
谢谢!mp
您不能将TIdCmdTCPClient搭配使用TIdCmdTCPServer。 TIdCmdTCPClient运行一个内部线程,该线程从连接中连续读取数据,但是该SendCmd()方法还执行其自身的读取操作,因此两者相互干扰,并相互获取数据。这就是为什么您会收到超时错误的原因。您需要更改客户端代码,以使用TIdTCPClient而不是TIdCmdTCPClient。
| 归档时间: |
|
| 查看次数: |
2575 次 |
| 最近记录: |