안녕하세요
소켓 프로그램에서 어려운 문제가 발생되어 질문을 드립니다
프로그램 구조는 채트형 프로그램인데요
인디를 사용했구요
* 서버 프로그램 구조 :
특정 클라인트에서 소켓 서버로 data를 전송하면
서버는 연결되어 있는 모든 소켓 클라이언트에 동일한
메세지를 뿌려 주는 구조입니다
* 클라이언트 구조 :
클라이어트 프로그램 시작시 서버에 connect 되어 하루 종일 연결되어
서버에서 보내 주는 data를 받기 위해 쓰레드를
이용하여 항상 감시를 하고 있다가 data 가 들어오면 필요한
프로시저를 수행합니다 (프로그램 종료시 disconnect)
* 문제는 모든 클라이언트가 서버로 부터 동일한 data를 받아야 되는데
불 특정 클라이언트에서 data를 받지 못하는 경우가 있습니다..
아래는 서버와 클라언트 프로그램의 부분 소스입니다
---------------------- 서버 소스 -------------------------------
procedure TFMserver.ServerExecute(AThread: TIdPeerThread);
var
Msg: String;
begin
while AThread.Connection.Connected do begin
Msg := AThread.Connection.ReadLn;
Broadcast(Msg);
end;
end;
---------------------- 서버 소스(broadcast) ---------------------
procedure TFMserver.Broadcast(Msg: String);
var
i: Integer;
ClientList: TList;
begin
ClientList := Server.Threads.LockList;
try
for i := 0 to ClientList.Count - 1 do
TIdPeerThread(ClientList.Items[i]).Connection.Writeln(Msg);
finally
Server.Threads.UnlockList;
end;
end;
---------------------- 클라이언트 소스 -------------------------
// 프로그램 activate 시 소켓클이언트가 서버에 connect 되어
// 아래의 쓰레드가 실행되며 프로그램 종료시 disconnect 될때
// 쓰레드 종료 됩니다
procedure TMyThread.Execute;
begin
while (not Terminated) do begin
try
Msg := Fmmain.Client1.ReadLn;
Synchronize(View);
except
Terminate;
end;
end;
end;
* 제 생각에는 서버와 클라이언트가 하루 종일 연결되어 있는 구조가
문제가 되질않나 생각됩니다, 라인에 문제가 발생 될수도 있고, 등 .
여러가지 문제점이 있을수 있을것 같습니다
이런 구조로는 data가 유실될수 밖에 없는지 ??,.
* 모든 클라이언트에서 data 유실 없이 다 받을수 있는 안전한 구조가
무었인지 알고 싶습니다
여러분의 도움을 부탁드립니다.
인디나 다른소켓도 마찬가지일 수도 있는데여,,
ADSL의 경우는 일정시간 소켓의 자료흐름이 일정시간
없으면 소켓이 끊기는것처럼 보이는 수가 있서여,,
그래서,, 음,, 젤 좋은건,,,
서버에서는 클라이언트에서든,,, 일정 간격으로,,
"내가 살았어여..."라는 의미의 짤막한 메시지를 보내거나..
받는것도 더 나아질 수 있는 방법일 수 있습니다..
물론 소켓통신이라는것은 여러가지 미묘한 문제를 발생시키기
때문에 정확히 어떤상황에서 못받는건지는 체크를 해봐야하지요..
보내는애가 안보냈는지.. 아님.. 보내는쪽에서 로그를 쌓았을때
예외가 발생했는지... 아니면 끊김이 발생했는지등등,,
단순히 못받는다라는것은 여러가지 경우때문에 근본적인
접근이 안될 수 있습니다.. 그럼..