Q&A

  • [질문] TCPServer 프로그램 구현중 문제발생

류종택님의 동영상 강좌중 대용량 트랜젝션처리 소켓작성을 를 참고해,
클라이언트와 서버가 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을 사용 했습니다.

1  COMMENTS
  • Profile
    zeliard 2011.12.02 08:06

    송수신데이터에 헤더를 붙여서 보내세요.

    헤더에는 보내는 데이터의 크기가 반드시 들어가야 겠죠... 헤더를 보고 데이터를 분리하시면 됩니다.