소켓통신의 정석이라할수 잇는데 클라이언트 하나당 쓰레드 하나로 만들면 아주 이상적입니다.
첨부파일에는 실제 테스트까지 마친 Indy TCP를 사용한 쓰레드 예제입니다.
ListBox의 Items속성에 에 원하는 IP를 넣어두시면 실시간 동시 접속이 이루어집니다.
1. 현재 가장 큰 문제는 20개의 클라이언트를 순차적으로 생성하다보니 하나에서 락이걸려 멈춰버리면 그 뒤까지 영향이 있는거죠.
2. 그래서 쓰레드 클래스를 만들때 하나의 ip,port로 접속후 데이터를 전송하게 만듭니다.
3. 그리고 이 쓰래드를 20개 만들면 거의 실시간으로 동시접속, 데이터방송, 접속해제가 가능합니다.
4. 제가 외부라서 집에가면 완성된 소스로 도움을 드려볼게요.
5. 일단은 쓰레드에서 for문을 제거하고 하나의 ip,port 로 접속하도록 만듭니다
6. 그리고 버튼에서 쓰레드클래스를 20개 만들면 됩니다
7. 말씀하신 5~12개 생성시마다 지연시간이 발생하는것은 connection timeout이 너무짧거나
서버의 동시접속 능력이부족한 경우라 보이네요.
결론은 지연시간없이 20개 동시접속 데이터 전송 구현가능합니다. 서버가 능력이 된다면요.
김수정 님이 쓰신 글 :
: 처음 질문이 여러개의 TIdTCPClient를 생성해가며 여러대의 피시에 데이터를 전송할때의 문제였습니다.
:
: 예를들어 timeout을 200으로 하고 20대의 피시에 데이터를 전송하기 위해
: TIdTCPClient를 20개 생성하고
: 각 TIdTCPClient의 IPAddr에 각 피시의 IP를 넣어주고
: Connect;
: WriteLn(...);
: disconnect;
: 이렇게 했는데요.
:
: 이 과정을 루프문으로 돌려보면
: 1번쩨 부터 12번쩨 TIdTCPClient가 생성될때까지는 이상없이 잘 됩니다.
: 하지만 13번쩨 TIdTCPClient가 생성될때 약 30초(또는 그 이상) 정도 멈춰있습니다.
:
: 그리고 5개정도(정확하지 않음)의 TIdTCPClient가 더 생성되고 다시 한참을 멈춰있습니다.
: 그리고 또 5개의 TIdTCPClient가 생성되고 나서 다시 한참을 멈춰있구요.
: ...
: 이런 과정을 반복하며 나머지 TIdTCPClient가 생성되는데요.
:
: 이곳에 질문을 올리니 인디는 블로킹방식이므로 Thread를 사용하라는 조언을 받았습니다.
:
: 그리고 이번엔 20개의 쓰레드를 생성해서
: 각 쓰레드 안에서 TIdTCPClient를 생성하여 데이터를 전송해 보니
: 데이터 전송이 되지 않았습니다.
:
: 제 생각에는 다른 쓰레드에서 통신포트를 사용하고 있는 중에
: 또 다른 쓰레드가 생성되고 그 안에서 통신포트를 사용하기 때문이 아닌가 생각됩니다.
:
: 그래서 데이터를 전송하기 전에 현제 통신포트가 사용되고 있는지를 검사하고
: 사용중이면 대기하도록 하려 했으나
: 아무리 자료를 찾아봐도 제 힘으로는 역부족이라 포기했는데요.
:
: 그렇다고 쓰레드를 생성하고 그 안에서 여러개의 TIdTCPClient를 생성하는 것은 의미가 없어보입니다.
: 어차피 그 쓰레드에서도 12개의 TIdTCPClient가 생성되고 나면
: 13번쩨 TIdTCPClient가 생성될때 한참을 멈출테니까요.
:
: 어찌 되었든
: 한개의 어플리케이션 안에서 여러개의 TIdTCPClient를 생성하는 경우
: 처음엔 12개, 그 이후부터는 5개(정확하지 않음) 단위로 성성되고
: 그 사이 사이마다 무언가를 처리하는 것 같다는 결론입니다.
:
: 어쩌면 너무 많은 TIdTCPClient가 생성되기 때문에 메모리상에서 처리하지 못하고
: 하드디스크상에 물리적인 케시를 하는 것 일 수도 있고
: 어쩌면 메모리를 정리하는 것일 수도 있고....
: 하여간 제 능력으로 원인파악을 할 수 없지만
: 한개의 어플리케이션에서 여러개의 TIdTCPClient를 생성하여 각각의 IP로 데이터를 전송하기 위해서는
: TIdTCPClient를 12개 단위로 Create와 Free를 해야 하는 것이 아닌가 집작할 뿐입니다.
:
: 혹시 여러대의 IP로 데이터를 전송하기 위해 여러개의 TIdTCPClient를 생성해 보신 분 계시면 보충 설명 부탁드립니다.
|