Q&A

  • indy TCP 소켓관련 ...
윈도우 2000, 델파이 5.0, indy 9 최신 베타판 에서 서버 프로그램 작성중입니다...



소켓관련하여 서버프로그램이 경험이 많치 않은 관계로 몇가지 난관에 부딪쳤네요...



9버전의 데모를 응용하여 만들어서 클라이언트 개발자와 테스트 중인데...



쓰레드 onExecute 이벤트 안에서 프로그램의 처리를 하는데...



일단 클라이언트의 요구가 오면 TQuery를 동적생성한후 사용자 인증 후



해당쿼리 해제한 후 요구에 해당하는 쿼리를 동적 생성 발행하여



하나의 패킷의 크기에 맞게



잘게 쪼개면서 채워지며 보내는 형태로 진행 합니다...



즉 두번째 쿼리에서는 쿼리가 끝이 될때까지 반복을 수행하는데...



이게 테스트 과정에서 자동으로 죽어버리는 군여 서버프로그램이



기존에서는 연결시에 리치에디트에다 뿌려 놨더니 리치에디트 DLL 오류가



발생합니다.(아마도 너무 빠르게 돌다 보니 개가 감당을 못하는것 같기에



디스플레이 루틴을 제거하고) 했더니 해당 에러는 발생하지 않는데 자동죽네요



아마도 요구가 많으니 서버에 할당되는 메모리의 부하가 상당한간 봅니다...



해당 테스트 서버가 ibm 왓스 서버가 셋팅 되어 있어서 그런지 쓰레드가



800개 가까이 돌고 있는 것 같은데...(메모리 2기가 일반 PC서버)



메모리는 널널한것 같은데...



그래서설라무네 쿼리부분을 제거하고 나니 몇배의 접속자 요구에도 프로그램이



죽는 현상이 없어졌습니다...



동적 생성 쿼리의 생성이 문제 일것 같기에 집으로 걸어오면서 생각해봤는데



1.

쿼리를 동적으로 생성하는 것에 갯수 제한을 둬야 할것 같기도 하고



2.

서버의 클라이언트 동시 연결 갯수 제한을 둬야 할것 같기도 하고



3.

로칼 동적으로 생성하는 쿼리를 타이머를 돌려서 전역의 한개의 쿼리를 만들고(select)



쓰레드 내부에서는 쿼리를 생성하는게 아니라 읽혀진 쿼리를 반복하면서 요구에



맞게 위치를 찾아서 보내야 할지?





어떤 방법이 좋을 지 관련 경험 계신분 답변 좀 부탁 드립니다...



2.일 경우 만약 100명이 접속하더라도 서버에서 10개로 한정한다면 나머지



90명의 연결자 어떤 현상이 발생하는지요?



어떤 방법이 가장 좋을까요?

























2  COMMENTS
  • Profile
    김진호 2001.12.01 00:01
    개인적인 생각 입니다만...



    저두 인디로 서버 프로그램 만드는것에 대해 많은 고민을 해보았습니다만..

    현재 한 10여명 붙여서 테스트 한결과 이상은 없어서 많은 유저에대한 자부심을

    가지고 있습니다만.



    일단..제 생각을 말씀 드리면..



    TQuery를 쓰신다구 하셨는데...

    정확한 이유는 모르겠습니다만..저두 TQuery와 TADOQuery를 사용하다..

    관둔적이 있었습니다.

    TADOQuery 같은경우...WIN2000의 작업 관리자로 보면 디비에 접속 하는 경우

    리소스(핸들갯수 증가, 스레드 갯수 증가)가 계속해서 증가 하는 현생이 발생
  • Profile
    김하늘 2001.12.01 04:31
    개략적으로 쓰레드 안의 동적 쿼리는 문제가 있다고 판단되기에



    디자인 타임 TQuery를 하나만 맹글고 일정 타이머마다 select 해서



    그리고 빠른 속도를 리얼그리드 두개를 얹쳐 놓고 일정 타이머마다 밀어 넣습니다...



    쿼리의 자료의 양이 생각 보단 많치 않다는군여(이런 자료양의 상태가 지속적으로 유지



    가 관건이지만)...



    일단 서버를 active하기전에 a 그리드 에다 밀어놓고 다음타이머때는 b 그리드



    에다 밀어 넣는 식이죠



    쓰레드 이벤트 안에서 b그리드에 타이머가 돌때는 밀어 넣는 중에는



    a의 내용에서 요구에 맞는 것만 골라내고 다시 a그리드에 밀어넣는 타이머가 돌때는



    b의 내용을 골라내서 보냈더니 프로그램이 죽는 현상은 없어졌습니다...



    물론 실시간적인 자료라고 볼수는 없지만 이게 최선의 방법이라 현재는 생각되기에...



    이렇게 처릴 했네요...



    섹션 개념은 데모에 나와있듯이 동시접속자 카운팅할때만 했어요...



    클라이언트가 비정상 종료일때 카운팅이 의미는 없지만 서도...



    개인적으로 델파이에서도 컴포넌트가 하두 많아서 일일이 다 써볼수가 없더군여...



    그래서 아는게 편한거다 싶어서 아는걸루다 썼어요...



    DB서버가 떨어져 있고 2tier 방식에서도 세션이 끊기는 문제 담시 타이머 안에서



    타이머 enable false하고



    데이타베이스를 연결하고 쿼리 발행(select)하고 그리드에 밀어놓고 쿼리close(free안



    함) 데이타베이스 닫고 타이머 enable true



    이런식으로 처릴 했네요...



    어쨌거나 간단한 서버 프로그램이지만 서도 프로그램하기에



    쉽지는 않다는 것을 이번 기회에 안것 같네요...



    김진호 wrote:

    > 개인적인 생각 입니다만...

    >

    > 저두 인디로 서버 프로그램 만드는것에 대해 많은 고민을 해보았습니다만..

    > 현재 한 10여명 붙여서 테스트 한결과 이상은 없어서 많은 유저에대한 자부심을

    > 가지고 있습니다만.

    >

    > 일단..제 생각을 말씀 드리면..

    >

    > TQuery를 쓰신다구 하셨는데...

    > 정확한 이유는 모르겠습니다만..저두 TQuery와 TADOQuery를 사용하다..

    > 관둔적이 있었습니다.

    > TADOQuery 같은경우...WIN2000의 작업 관리자로 보면 디비에 접속 하는 경우

    > 리소스(핸들갯수 증가, 스레드 갯수 증가)가 계속해서 증가 하는 현생이 발생