ReadString delays until the number of bytes in ABytes is available in the Indy read buffer.
If the number of bytes is not known, use ReadLn or ReadLnWait.
readln 혹은 ReadLnWait 함수를 쓰시며 정해준 바이트가 올때가지 기다리지 않으셔도 됩니다.
인디에서 버퍼에 미리 얼마만큼의 데이터가 와 있는지 알수 있는 기능은 잘 모르겠구요.
저도 예전에 인디를 이용해서 소켓 버퍼에 값이 들어와 있으면 읽고 없으면 말고 하는 기능을 했어야 할때가 있었거든요.
한 2년 전쯤이라서 기억이 없지만.
인디서버소켓에서
OnExecute 이벤트에서 보면 Client 에서 접속을 하게 되면 발생 하잖아요.
그 중에 CurrentReadBuffer 라는 String Function 이 있습니다.
이 함수는 현재 Read Buffer 에 값이 있으면 모두 읽어 옵니다.
만약에 없으면 '' 을 가져옵니다.
주의할 점은 확인 하는것이 아니고 현재 소켓 ReadBuffer 값을 몽땅 가져 온다는 것이죠.
서버 소켓에서 OnExecute 가 발생을 했을때 ReadBuffer 값을 읽어서 있으면 처리하고 만약에 읽은 값이 '' 이면 아직 데이터가 없는 겁니다.
또한 이 함수는 얼마만큼 읽어 들이는 것이 없기 때문에
이 함수를 이용해서 읽어 들인다면 '' 일때까지 계속 읽어 오도록 해야 합니다.
ReadLn, 같은 Ln 이 붙은 경우는 얼마만큼 크기를 기다렸다 읽어 오지는 않지만 이 경우는 'n'같은 엔터 문자가 있다면 그 부분까지만 읽어 오게 됩니다.
따라서 보낸 문자열에 엔터 같은것이 있다면 보낼때 약속한 코드로 변환해서 다시 받는쪽에서 역 변환 하는 부분이 추가 되던가 아니면. Readbuffer 에서 읽어 들이는 문자열이 없을때까지 읽어 오는 부분이 역시 추가 되어야 합니다.
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
sTmp : String;
begin
sTmp := AThread.Connection.CurrentReadBuffer;
if sTmp = '' then // 이 경우는 읽은 값이 없으니까 무시 하시구요.
begin
showmessage('수신된 데이터가 없습니다.');
end
else
begin
showmessage('현재 읽은 크기 : ' + IntToStr(Length(sTmp)));
end;
end;
If the number of bytes is not known, use ReadLn or ReadLnWait.
readln 혹은 ReadLnWait 함수를 쓰시며 정해준 바이트가 올때가지 기다리지 않으셔도 됩니다.