안녕하세요. 신승철이라고 합니다.
소켓을 이용하여 이미지 데이터를 전송하는 프로그램을 만들고 있는데
소용량 (음..예를 들어 1Mbyte 미만의 데이터)는 무리 없이 잘 전송이 됩니다.
그렇지만.. 그 이상의 (예를 들어 2MByte이상의 데이터)를 전송할 경우에는
전송 완료가 되었다는 메시지가 뜨면서 프로그램의 종료가 안되는군요.
또한, 위의 증상 외에 대용량의 데이터 전송이 완료되었다는 반가운 메시지가 팝업으로 뜨면서도 다음 명령을 수행하려하면(예를 들어 프로그램을 종료하려할 때)'out of memory' 에러 메시지가 뜨면서 델파이가 셧 다운됩니다.
대용량의 데이터도 안정적으로 전송할 수 있으려면 코드상에서 어떠한 명령어를 써야 안정된 전송이 이루어지는지 알고 싶습니다.
델파이를 잘 아시는 고수님들의 조언 부탁드립니다.
참고로 이미지 파일 데이터를 전송하는 코딩부분을 간단히 올리오니..부족하나마 참조하시길 바랍니다.
// 이미지 데이터 전송 루틴 //
procedure TChatForm.btnSendClick(Sender: TObject);
var
myFstream:TFilestream;
begin
If OpenPictureDialog1.Execute then
Begin
NMStrm1.Host := Edit1.Text;
MyFStream := TFileStream.Create(OpenPictureDialog1.FileName, fmOpenRead);
try
NMStrm1.PostIt(MyFStream);
finally
MyFStream.Free;
end;
end;
end;
...........
procedure TChatForm.NMStrm1PacketSent(Sender: TObject);
begin
statusbar2.SimpleText:=Inttostr(nmstrm1.BytesSent)+'Byte of '+inttostr(nmstrm1.BytesTotal)+' byte sent';
end;
....... //이상.. 끝.
델파이 왕~초보 송기원입니다....
저는 고수도 아니고 아직 초보지요..영원한 초보 (^__^)
저도 신승철님께서 사용하시 아래의 방법으로 이미 자료 전송을 테스트 했었습니다.
근데 다소의 문제점이 있더군요...
신승철님께서도 지적하신 바와 같이..
파일의 용량이 작을때에는 아래의 방법이 아무런 이상없이 동작을 합니다..
그렇지만 파일의 용량이 큰 경우에는 아무래도 PC가 조금 버벅 되거나
아니면 아예 나~ 몰러~~하고 누워서 일어나지도 않더군요..(^__^)
재 생각에는 큰 용량의 파일의 경우에 파일 스트림으로 한꺼번에 읽어서
보내는 부분과 받는 부분에서 메모리상의 자원과 동시다발적인
CPU Resource를 너무 많이 요구를 하는것 같습니다..
저도 TnmStream인가 이 컴포넌트의 소스를 보지는 못했지만..
제 생각에는 그런부분에 대한 고려가 거의 없는것 같네요..
아니면 제가 모르고 있던지..둘중에 한게 있건은 분명한데...
일단은 상식적으로 생각을 해보십시요..
8M정도의 파일을 stream으로 소켓을 통하여 데이타를 한방에 날렸다치고..
그걸 수신하는 쪽에서 그걸 저장을 할려면..
8M의 메모리를 필요로 하지 않겠습니까..???
그래서 저의 경우는 TserverSocket과 TclientSocket으로 위의
문제를 해결하고 있는 중입니다..
TclientSocket에서는 특정 Byte만큼 끊어 읽어서 TserverSocket으로
자료를 보내고 Tserversocket에서는 받은 만큼의 자료만..
저장을 하고..
이런 로직으로 구현을 하다보니..메모리의 양도 그리 많이 요구도하지
않고 프로그램이 훨씬 가벼워 진다는 거지요...
현재 TserverSocket과 TclientSocket을 각각 상속받아
TfileReceiver와 TfileSender라는 놈을 거의 다 맹글어 갑니다..
물론 소스 레벨은 완전히 0점이지만...
조만간에 자료실에 올려 놓겟습니다...
도움이 되었는지 모르겠네요....
이자리를 빌어 다시한번 구창민님과 하영재님께...감사드립니다...
저를 많이 도와주셔서...
신승철 wrote:
> 안녕하세요. 신승철이라고 합니다.
>
> 소켓을 이용하여 이미지 데이터를 전송하는 프로그램을 만들고 있는데
> 소용량 (음..예를 들어 1Mbyte 미만의 데이터)는 무리 없이 잘 전송이 됩니다.
> 그렇지만.. 그 이상의 (예를 들어 2MByte이상의 데이터)를 전송할 경우에는
> 전송 완료가 되었다는 메시지가 뜨면서 프로그램의 종료가 안되는군요.
> 또한, 위의 증상 외에 대용량의 데이터 전송이 완료되었다는 반가운 메시지가 팝업으로 뜨면서도 다음 명령을 수행하려하면(예를 들어 프로그램을 종료하려할 때)'out of memory' 에러 메시지가 뜨면서 델파이가 셧 다운됩니다.
>
>
> 대용량의 데이터도 안정적으로 전송할 수 있으려면 코드상에서 어떠한 명령어를 써야 안정된 전송이 이루어지는지 알고 싶습니다.
> 델파이를 잘 아시는 고수님들의 조언 부탁드립니다.
>
> 참고로 이미지 파일 데이터를 전송하는 코딩부분을 간단히 올리오니..부족하나마 참조하시길 바랍니다.
>
> // 이미지 데이터 전송 루틴 //
>
> procedure TChatForm.btnSendClick(Sender: TObject);
> var
> myFstream:TFilestream;
> begin
> If OpenPictureDialog1.Execute then
> Begin
> NMStrm1.Host := Edit1.Text;
> MyFStream := TFileStream.Create(OpenPictureDialog1.FileName, fmOpenRead);
> try
> NMStrm1.PostIt(MyFStream);
> finally
> MyFStream.Free;
> end;
> end;
> end;
>
> ...........
>
> procedure TChatForm.NMStrm1PacketSent(Sender: TObject);
> begin
>
>
> statusbar2.SimpleText:=Inttostr(nmstrm1.BytesSent)+'Byte of '+inttostr(nmstrm1.BytesTotal)+' byte sent';
> end;
>
> ....... //이상.. 끝.
>
>
>
>
>
>
>
>
>