저는 델파이 XE에서 TIdCmdTCPServer를 사용하여 개념 증명 (proof-of-concept) 앱을 개발 중입니다.은 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
레미! 네가 전에 다른 사람에게 말했을 때 네가 의미하는 바를 이해하지 못했다. –
> "TIdCmdTCPServer와 함께 TIdCmdTCPClient를 사용할 수 없습니다." 정말? 그렇다면 TIdCmdTCPClient의 목적은 무엇입니까? 그리고 클라이언트 구성 요소가 자동으로 무언가를 읽는 이유는 무엇입니까? 이 동작은 서버 측과 관련이 있습니까? 간단한 명령을 보내는 작은 클라이언트 - 서버 응용 프로그램이 필요했기 때문에 두 구성 요소를 모두 시험해보고 싶었지만 자체 프로토콜을 구현하고 싶지 않았습니다. TIdTCPServer 용 문서조차도 TCP 전용 구성 요소가 응용 프로그램 수준에서 프로토콜을 제공하지 않기 때문에 Cmd 구성 요소를 사용한다고 말합니다. – StanE
이름의'Cmd'는'CommandHandlers' 콜렉션을 가리키며,'TIdCmdTCPClient'와'TIdCmdTCPServer' 모두 가지고 있습니다. 'TIdCmdTCPClient'는 클라이언트 소켓이 서버 소켓에 연결하고 클라이언트가 서버로부터 요청되지 않은/비동기 패킷을 수신하는 프로토콜을 의미합니다.이 패킷은 클라이언트의'CommandHandlers'에 의해 처리됩니다. 패킷은 명령에 대한 응답 일 수도 있고 아닐 수도 있지만 대부분의 프로토콜에서 사용되는 전통적인 클라이언트 명령/서버 응답 모델을 따르지는 않습니다. 'TIdIRC'는 이것의 한 예입니다 ... –