서버측에서 클라이언트가 하나라도 연결되면 non-blocking 으로 무진장 보낸다는 가정.
 
 
서버
 
폼에는 TIdTCPServer 가 하나 올라가 있음.
 
procedure TfrmServer.IdTCPServer1Execute(AContext: TIdContext);
var
  mStream: TMemoryStream;
 
begin
  if AContext.Connection.Connected then begin
    mStream:=TMemoryStream.Create;
    try
      // 여기서 mStream 에 뭔가를 Write 했다고 가정
      ... ...
      try
        AContext.Connection.IOHandler.Write(mStream, 0, True);
      except on E:Exception do
        OutputDebugString(PChar('[Server Error] '+E.Message));
      end;
    finally
      FreeAndNil(mStream);
    end;
  end;
end;
 
 
 
 
클라이언트
폼에는 TIdTCPClient 가 하나 올라가 있고 연결하는 부분은 생략.
그리고 Recv 는 TTimer 를 이용해 0.1 초에 한 번씩 하고 있다고 가정.
 
procedure TfrmClient.tmrRecvTimer(Sender: TObject);
var
  mStream: TMemoryStream;
 
begin
  // 연결되어 있지 않다면 빠져나감. 재연결을 해도 좋고.
  if not IdTCPClient1.Connected then Exit;
 
  mStream:=TMemoryStream.Create;
  try
    if IdTCPClient1.IOHandler.Readable then begin
      try

        IdTCPClient1.IOHandler.ReadStream(mStream, -1, False);
      except on E:Exception do
        OutputDebugString(PChar('[ReadStreamError] - '+E.Message));
      end;
 
      OutputDebugString(PChar(Format('[Recv] : %d Bytes', [mStream.Size])));
      // 이제 받아온 Stream 으로 뭔가 하면 됨...
      mStream.Position:=0;
    end;
  finally
    FreeAndNil(mStream);
  end;
end;





Posted by bloodguy
,