Q&A

  • 얼어버리는 문제....추워서?????
질문 하지 않고 해보려고 했는데... 결국은 ... -.-;

지금 Indy10.xx component를 사용해서 TCP/IP 채팅을 맹글고 있습니다.
서버로 보내면, 서버에서 모든 클라이언트에게 뿌려주는 그런 류의... 류종택님이 인터넷에서
동영상 강좌까지 했던  그걸 인디 10.xx으로 하고 있습니다.

문제는,
클라이언트에서 서버로 데이타를 계속 빠르게 보내면 클라이언트가 안 die합니다.
클라이언트에서 서버로 보낸 글자가 다시 보낸 클라이언트로 잘 돌아와서 표현되구요.
참고로... 클라이언트에서는 타이머를 사용해서 타이머 틱마다 서버에서 오는 데이타를 체크합니다.

그런데, 잠시 손을 놓고 있노라치면(3~4초??) 바로 클라이언트가 얼어버립니다.
학술적 표현으로는 폼 위의 어떤 단추도 마우스를 받지 않는다.... ^^;

이곳 Q/A에서 살펴보니 IdAntiFreeze를 이용하라고 하는데, 이용해도 마찬가지입니다.
AntiFreeze의 Property가 몇개 있던데.... 뜻을 잘 모르니 셋팅은 그냥 default로 놔두었구요.

그리고 더 살펴보니 timeout이란 것도 필요하다고 ... 구구절절 글들이 써져 있는데, 잘 모르겠습니다.


왜 클라이언트가 얼어붙는거죠? (서버는 멀쩡합니다)

고수님들의 현답을 바라며....
2  COMMENTS
  • Profile
    최용일 2005.12.20 05:49
    안녕하세요. 최용일입니다.

    인디 10버전대는 사용해본적은 없지만 뭐 비슷하겠죠...

    아마도 클라이언트에서 서버의 데이터를 받을때 대기시간(TimeOut)없이 서버에서 데이터가 올때까지 무한정 기다리나 봅니다. 서버에서 데이터를 계속적으로 보내면 이상없이 작동하겠지만... 데이터를 보내지 않으면 받을때까지 한없이 기다리게되겠죠... 이때문에 얼게 되는것 같네요...

    클라이언트 메소드들 보시면 TimeOut설정해서 서버의 데이터를 읽어오도록 하는 메소드들이 있을겁니다. 그걸 이용하세요. 그래야 서버로부터 일정시간동안 데이터가 안들어와도 작업을 마치고 다른넘들도 딴 일을 할 수 있도록 됩니다. 안그럼 데이터가 올때까지 한없이 기다리기만 합니다...

    ^^ 항상 즐코하세요...

  • Profile
    쿠나 2005.12.20 09:52
    답변 감사드립니다.
    질문 올려놓고 답변 나올때까지 모니터만 죽어라고 보고 있었는데... ^^:
    말씀하신 대로, 메소드를 찾아보니 ReadLn 함수 중에 걍 String만 읽는 것이 있고,
    Timeout 설정하여 읽는 것이 있더군요. 그래서 아래와 같이 했더니 잠시
    화장실 갔다 와도 여전히 클라이언트는 살아있었습니다.

    특이한 점은 AntiFreeze 컴포넌트를 빼도 특별히 이상증상은 없더군요.
    아마 채팅과 같은 프로그램에서는 한쪽이 일방적으로 긴 데이타를 보내는 경우가
    아니기 때문에 앤티프리즈가 없어도 문제가 안되는 것이라 추정됩니다.

    아래 코드는 혹시 Indy10.x.x (델파이 2005버전)을 사용하는 분들을 위한
    참고로 적었습니다.  인디는 버젼마다 약간씩 다른 것 같아서요.....

    그럼... 꾸벅

    procedure TForm3.Timer1Timer(Sender: TObject);
    var
    rText : string;
    begin
      rText := IdTCPClient1.Socket.ReadLn('',1,-1);
      if rText <> '' then
        Memo1.Lines.Add(rText) else exit;
    end;