류종택님의 동영상 강좌중 대용량 트랜젝션처리 소켓작성을 를 참고해,
클라이언트와 서버가 1:1 통신을 하며,
수신된 데이터를 리스트에 저장하고, 쓰레드를 통해 리스트에서 한껀씩 꺼내서 처리해 주고,
송신해 주는 TCP Server 프로그램을 구현중 입니다.
1:1 통신이다 보니, 자체적으로 멀티 쓰레드를 구현할려고 하는데,
동시에, 여러껀이 수신이 되면, 레코드가 꼬입니다.
예를들어, 1111 또는 2222라고 수신이 되면,
서버는 수신데이터뒤에 AAAA 또는 BBBB를 붙여 1111AAAA, 2222BBBB라는 레코드를 송신해줘야 하는데
이를 멀티쓰레드를 통해서 처리하니
1111BBBB혹은 2222AAAA라는 식으로 레코드가 꼬여서 처리되는경우가 발생을 하더군요.
다음이 문제가 되는 부분의 소스 입니다.
//----------쓰레드 처리 부분 입니다.
procedure TDBThread.Execute;
var
Item : TPacketItem;
begin
while not Terminated do
begin
try
CoInitialize(nil);
Item := fmMain.Database.PacketList.Get;
try
if Item <> nil then
begin
Item.Execute;
end
else
Self.Terminate;
Sleep(25);
finally
CoUninitialize;
Item.Free;
end;
except
on E:Exception do
begin
Self.Terminate;
Self.Resume;
end;
end;
end;
end;
//------------리스트에 담겨 있는 수신데이터의 포인터를 가져오는 부분 입니다.
type
TPacketList = class
private
FList : TList;
FCS : TCriticalSection;
public
constructor Create;
destructor Destroy; override;
function Get : TPacketItem;
end;
:
:
:
function TPacketList.Get: TPacketItem;
begin
FCS.Enter;
try
if FList.Count = 0 then
begin
Result := nil;
Exit;
end;
Result := Pointer(FList.Items[0]);
FList.Delete(0);
finally
FCS.Leave;
end;
end;
//----------------- 가져온 데이터를 처리하는 Class입니다.
type
TPacketItem = class
private
function getWonbuDetail : Boolean;
procedure prInitRecord;
public
Thread : TIdPeerThread;
procedure Execute;
end;
procedure TPacketItem.Execute;
var
sndEDI : string;
begin
fmMain.moMsg.Lines.Add(Format('%s',['------------------------']));
fmMain.moMsg.Lines.Add(Format('%s',[strMsg]));
//데이터 처리부분
getWonbuDetail;
sndEDI := prRelayRecord;
//데이터 처리완료
//처리된 데이터 송신
Thread.Connection.Write(sndEDI);
end;
상황이 많이 절박합니다. 어디 마땅히 물어볼만한곳도, 아무리 찾아봐도, 딱히 무엇이 문제인지도
모르겠고, 정말 많이 답답합니다. 도와주세요.
델파이 7.0과 Indy9을 사용 했습니다.
송수신데이터에 헤더를 붙여서 보내세요.
헤더에는 보내는 데이터의 크기가 반드시 들어가야 겠죠... 헤더를 보고 데이터를 분리하시면 됩니다.