안녕하세요. 항상 도움을 많이 받고 있습니다. 다름이 아니라 여쭙고 싶은게 있어서요.
개발환경 : Widnows2000 Pro (Server)
Windows2000 / Windows XP Home, Pro (Client)
Delphi 5.0
indy version 9.0.14 입니다.
클라이언트는 에서 서버로 데이타를 전송하는 프로그램입니다. 가공된 데이타를 StringList에 담아서 전송합니
다. Writeln, ReadLn method 를 이용하고 있습니다. 특정클라이언트를 지목해서 데이타 전송을 요청하면,
정확한 데이타가 서버로 들어옵니다. (서버쪽은 받자마자 StringGrid에 담았습니다.)
문제는 다중의 클라이언트를 선택하고, 데이타 전송 요청을 하면, 데이타가 서버로 들어는 옵니다만, 클라이언트
별 구분 아이디를 주었는데... 뒤죽박죽 섞여서 들어오다가 2000개의 정보를 Client가 전송했다면, 서버쪽에는
100개, 1000개, 1500 개 일정하지 않게 StringGrid 에 적혀집니다.
뭐 빼먹은게 있는건지... ㅠ.ㅠ
아래 코드는 서버쪽에서 접속된 클라이언트에 일괄 데이타 요청하는 부분입니다.
<!--CodeS-->
case TreeView1.selected.Level of
0 : begin
try
Client_List := Server.Threads.LockList;
for kk := 0 to Client_List.Count -1 do
begin
try
TIdPeerThread(Client_List.Items[kk]).Connection.WriteLn('300');
except
TIdPeerThread(Client_List.Items[kk]).Stop;
end;
end;
finally
Server.Threads.UnlockList;
end;
end;
<!--CodeE-->
클라이언트쪽에서 '300' 이라는 Protocol 을 받으면, 데이타를 전송하게 프로그래밍해뒀습니다.
머가 문제일까요 ?
혹 제가 빼먹은 것이 있는건지... 조언을 부탁드립니다.
참고로, Windows XP 방화벽 쪽은 프로그램으로 잠시 중단했다가 전송이 완료되면 다시 방화벽이
가동되도록 했습니다.
DB핸드링 하는 부분을 Server Execute 부분에 function 으로 넣었는데...
그때마다 DB부분을 확인하고, 돌아오고 하는 과정을 반복하고 있었습니다.
이런 실수를.... ㅠ.ㅠ
그 부분을 Server Active 될때 한번만 체크하고 돌아오는 것으로 해결했습니다.
좀더 들여다 봤어야 할것을...
어찌됐든, Server 에서 데이타를 받을 때는 될수 있음 DB쪽을 핸들링 하지 않거나
별도의 Thread 로 해결해야 함을 질문하면서 알았습니다.
봐주신 분들 감사합니다. 꾸벅.