Q&A

  • 파일전송에서 전송파고픈 파일 쪼개서 보내는 방법 좀 가르쳐주세요.
안녕하세요.
비가 주루룩 오는데 왠지 소주만 생각나는 날이네요..
일도 잘 풀리지 않구요.
제가 지금 클라이언트에서 서버로 파일에 관한 정보가 오면 그것에 해당하는 파일을 클라이언트쪽으로 전송하는 것을 만들었어요.
근데.. 너무 엉망인거 같아서 다시 수정하려 합니다. 전송 중에 갑작스럽게 통신이 끊겨버리면 프로그램이 둘다 죽어버리는 큰 버그가 있더라구요.
또는 서버에서 클라이언트로 전송중에 파일을 받고 있는 하나의 클라이언트가 갑자기 죽어버리는 경우가 발생하면(컴퓨터 전원이 꺼지던가 하면... 아직까지 한번도 발생하지 않은 경우지만) 서버 프로그램이 죽어버리더라구요. 그래서 다른 클라이언트들도 파일을 전송받지 못하는 엄청난 일이 발생하더라구요.
그래서 우선 생각해 낸 것이 파일 전송중에 계속 클라이언트의 상황을 살피고 그 상황에서 위와 같은 상황이 나타나면 강제로 그 클라이언트와 통신을 끊어버리는 경우를 생각하고 있습니다. 에고... 제 머리에서 나오는 그림이 이정도밖에는 ㅠ.ㅠ
근데 지금 제가 만든 파일전송하는 부분이 서버쪽에서 일단 파일의 사이즈 만큼 버퍼에 쌓아놓고 그게 다 쌓이면 보내더라구요. ㅠ.ㅠ
그래서 그것을 버퍼에 쌓지 않고 바로 보내는 방법이 없을까요?

서버쪽 소스를 보시면 다음과 같습니다.
AThread.Connection.WriteLn('그래픽 카드에 관련된 파일의 전송을 시작합니다');
ListBox1.Items.Append('Serving UP : C:\Driver\Graphic1.zip');
fStream := TFileStream.Create('C:\Driver\Graphic1.zip',fmOpenReadWrite + fmShareDenyNone);
ListBox1.Items.Append(inttostr(fStream.Size));
AThread.Connection.OpenWriteBuffer(fStream.Size);
AThread.Connection.WriteStream(fStream, True, True);
AThread.Connection.CloseWriteBuffer;
ListBox1.items.Append('Graphic1.zip transfer completed');
FreeAndNil(fStream);

그리고 클라이언트 받는 부분의 소스는 다음과 같습니다.
ftmpStream := TFileStream.Create('C:\Driver2\Graphic1.zip',fmCreate);
IdTCPClient1.ReadStream(ftmpStream, -1, False);
FreeAndNil(fTmpStream);
ListBox1.Items.Append('그래픽 카드 드라이버의 전송이 완료 되었습니다.');

지금 의심가는 부분이 fStream := TFileStream.Create('C:\Driver\Graphic1.zip',fmOpenReadWrite + fmShareDenyNone); 이곳인데....

이것을 바꿔서 될까요?
아님 전체적으로 틀린건가요?
거침없는 질타 부탁드리겠습니다.
0  COMMENTS