2014-03-12 5 views
0

한 클라이언트가 연결 한 다음 연결을 끊은 후에 idSimpleServer에 다시 연결할 수 있기를 원합니다. 첫 번째 클라이언트는 문제없이 연결하고 연결할 수 있지만 다음 클라이언트는 문제를 해결할 수 없습니다. 내 문제를 설명하기 위해 간단한 테스트 절차를 수행했습니다.Indy의 idSimpleServer 재 연결

procedure Tfrmmain.btnBlockingClick(Sender: TObject); 
begin 
    Server1.BeginListen; 
    Server1.Listen; 
    CodeSite.Send(csmLevel2, 'Listen'); 
    CodeSite.Send(csmLevel2, 'Server1.IOHandler.Connected', Server1.IOHandler.Connected); 
    try 
    while (Server1.Connected) do 
    begin 
     while Server1.IOHandler.CheckForDataOnSource() do 
     begin 
     CodeSite.Send(csmLevel3, 'InputBufferAsString', Server1.IOHandler.InputBufferAsString); 
     Server1.IOHandler.WriteLn('0006CANPDD'); 
     end; 
    end; 
    finally 
    Server1.Disconnect; 
    CodeSite.Send(csmLevel4, 'Finally'); 
    end; 
end; 

이 내 코드 사이트 로그에 다음과 같은 결과를 얻을 :

Listen 
Server1.IOHandler.Connected = True 
Finally 
Listen 
Server1.IOHandler.Connected = False 
Finally 

공지 사항이 두 번째 연결이 제대로 IOHandler을 결합하지 않는 것 같습니다. 내가 어디에 있어야하는지 잘 모르겠다. 어떤 아이디어?

감사

스티브

답변

1

문제는 당신이 같은 TIdSimpleServer 개체마다 재사용한다는 것이다.

첫 번째 연결이 끊어진 후에도 다음 연결에 동일한 IOHandler이 다시 사용되지만 IOHandler.ClosedGracefully 속성은 매번 다시 설정되지 않기 때문에 이전 연결에서 true로 유지됩니다. ClosedGracefully 속성은 IOHander.Open() 메서드로만 다시 설정되며를 새로 만들 때만 TIdSimpleServer 메서드가 호출됩니다. Disconnect()IOHandler을 해제하지 않지만 IOHandler.Close()을 호출합니다.

후속 연결에서 Open()에 대한 누락 된 전화가 버그처럼 보입니다. 그래서 Indy의 SVN (rev 5103)에 대한 수정 내용을 확인했습니다.

latest SVN release으로 업그레이드하거나 각 연결 사이에 TIdSimpleServer.IOHandler (또는 TIdSimpleServer 그 자체)을 파괴해야합니다.

+0

정말로 도움이 된 설명에 감사드립니다. - 많이 감사합니다. – Steve