2011-09-07 3 views
3

저는 델파이 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

답변

4

TIdCmdTCPClient에는 TIdCmdTCPServer을 사용할 수 없습니다. TIdCmdTCPClient은 연결에서 계속해서 읽는 내부 스레드를 실행하지만 SendCmd() 메서드는 자체 읽기 작업도 수행하므로 두 스레드는 서로 간섭하고 서로의 데이터를 가져옵니다. 그래서 타임 아웃 오류가 발생합니다. TIdCmdTCPClient 대신 TIdTCPClient을 사용하도록 클라이언트 코드를 변경해야합니다.

+0

레미! 네가 전에 다른 사람에게 말했을 때 네가 의미하는 바를 이해하지 못했다. –

+0

> "TIdCmdTCPServer와 함께 TIdCmdTCPClient를 사용할 수 없습니다." 정말? 그렇다면 TIdCmdTCPClient의 목적은 무엇입니까? 그리고 클라이언트 구성 요소가 자동으로 무언가를 읽는 이유는 무엇입니까? 이 동작은 서버 측과 관련이 있습니까? 간단한 명령을 보내는 작은 클라이언트 - 서버 응용 프로그램이 필요했기 때문에 두 구성 요소를 모두 시험해보고 싶었지만 자체 프로토콜을 구현하고 싶지 않았습니다. TIdTCPServer 용 문서조차도 TCP 전용 구성 요소가 응용 프로그램 수준에서 프로토콜을 제공하지 않기 때문에 Cmd 구성 요소를 사용한다고 말합니다. – StanE

+0

이름의'Cmd'는'CommandHandlers' 콜렉션을 가리키며,'TIdCmdTCPClient'와'TIdCmdTCPServer' 모두 가지고 있습니다. 'TIdCmdTCPClient'는 클라이언트 소켓이 서버 소켓에 연결하고 클라이언트가 서버로부터 요청되지 않은/비동기 패킷을 수신하는 프로토콜을 의미합니다.이 패킷은 클라이언트의'CommandHandlers'에 의해 처리됩니다. 패킷은 명령에 대한 응답 일 수도 있고 아닐 수도 있지만 대부분의 프로토콜에서 사용되는 전통적인 클라이언트 명령/서버 응답 모델을 따르지는 않습니다. 'TIdIRC'는 이것의 한 예입니다 ... –

관련 문제