대용량 파일 전송에 관한 질문

1,331 views
Skip to first unread message

Jay Park

unread,
Jan 13, 2010, 5:10:14 AM1/13/10
to Netty Korean User Group
안녕하세요?
Netty 를 공부하고 있는 개발자입니다.

Netty를 이용하여 파일 전송 기능을 구현해보려고 하는데요.
Netty의 샘플 코드를 보니까, 웹 서버 측에서 대용량 파일을 스트리밍을 해주는 기능이 구현되어 있어서 살펴보니.
"ChunkedWriteHandler"를 이용하여 chunk로 나누어서 데이터를 클라이언트에게 뿌려주고 있습니다.

제 질문은:

만약, 서버에서 클라이언트로 스트리밍되고 있는 데이터를 클라이언트 측에서 파일로 저장 ( chunk단위로 읽어서 append하
는) 하려면 어떤식으로 구현해야 할까요? ChunkedWriterHandler를 확장해야 하는 건가요?
구현방식과 샘플 코드를 알려주시면 감사하겠습니다.

건강한 하루 되세요!


"Trustin Lee (이희승)"

unread,
Jan 13, 2010, 8:56:18 PM1/13/10
to nett...@googlegroups.com
안녕하세요,

클라이언트 측에서는 단순히 받은 ChannelBuffer 의 내용을 디스크에 써 주기
만 하면 됩니다. 다음 메소드 중 하나를 이용하면 버퍼의 내용을 손쉽게 디
스크에 쓸 수 있습니다:

ChannelBuffer.getBytes(int, OutputStream, int);
ChannelBuffer.getBytes(int, GatheringByteChannel, int);
ChannelBuffer.readBytes(OutputStream, int);
ChannelBuffer.readBytes(GatheringByteChannel, int);

이희승 드림

--
what we call human nature in actuality is human habit
http://gleamynode.net/


signature.asc
Message has been deleted
Message has been deleted

Jay Park

unread,
Jan 15, 2010, 5:06:50 AM1/15/10
to Netty Korean User Group
희승님. 답변 감사드립니다.:)
잘 이해가 안 되는 부분이 있는데요.


그럼, Client측에서는 PipelineFactory를 아래와 같이 구성한 후,
아래 FileWriteHandler(신규 클래스)에서 가이드해주신 API (ChannelBuffer.readByte
(OutputStrem, int))를 이용하여 파일 쓰기 기능을 구현하면 되는 건가요?


즉, HttpClientHandler(신규 클래스)는 서버가 보내주는 HttpResponse를 decode하여 Empty
File을 만들고,
이후 수신되는 파일 스트림은 FileWriteHandler가 받아서 생성된 File에 Append 처리하도록 설계하면 될까
요?


Netty 기반으로 이러한 Application을 만들 때, Best Practice가 어떤 것인지 정말 궁금합니다.


(제가, 간단하게 테스트 코드를 짜보니, 메시지가 도착할 때마다, 파일을 Overwrite하여, 종국에는 맨 마지막에 받은 데

터만 파일에 남는 현상이 생겼답니다.
이런 건 어떻게 해야할까요, FileOutputStream을 생성할 때, append 옵션을 줘야할까요?)


답변 기다리겠습니다.
그럼 행복한 주말 되시구요!! :)


public class HttpClientPipelineFactory implements
ChannelPipelineFactory {
public ChannelPipeline getPipeline() throws Exception {
// Create a default pipeline implementation.
ChannelPipeline pipeline = pipeline();


pipeline.addLast("decoder", new HttpRequestEncoder());
pipeline.addLast("encoder", new HttpResponseDecoder());
pipeline.addLast("handler", new HttpClientHandler());
pipeline.addLast("chunkedWriter", new FileWriteHandler());
==>
(?)


return pipeline;
}


}

On 1월14일, 오전10시56분, "Trustin Lee (이희승)" <trus...@gmail.com> wrote:
> 안녕하세요,
>
> signature.asc
> < 1K보기다운로드

> what we call human nature in actuality is human habithttp://gleamynode.net/- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -

"Trustin Lee (이희승)"

unread,
Jan 15, 2010, 5:25:04 AM1/15/10
to nett...@googlegroups.com
중복 포스팅하지 마십시오.
signature.asc

Jay Park

unread,
Jan 15, 2010, 5:43:42 AM1/15/10
to nett...@googlegroups.com
 
앗, 정말, 죄송합니다.
올릴 때 마다 메일이 발송될지는 몰랐네요.
 
의도적으로 중복 포스팅 하려고 했던 게 아니구요.
제가 최초로 작성을 할 때 코드를 잘못 올려서,  삭제한 후에 다시 등록하는 바람에 이런 일이 생겼네요.
(수정 기능이 없는 거 같아서요)
 
제가 구글 그룹을 처음 사용하다 보니, 시행착오가 생긴 거 같습니다..
귀찮게 해드려 죄송합니다.
 
 
 


 
2010년 1월 15일 오후 7:25, "Trustin Lee (이희승)" <tru...@gmail.com>님의 말:

"Trustin Lee (이희승)"

unread,
Jan 19, 2010, 12:31:56 AM1/19/10
to nett...@googlegroups.com
회신이 늦어 죄송합니다 --;

보통은 HttpClientHandler 에서 한꺼번에 처리를 합니다만, 두 단계로 나누어
서 하셔도 문제는 없을 것 같습니다. 다만 HttpClientHandler 에서 적절히
이벤트를 전달해 주어야 겠지요.

signature.asc
Reply all
Reply to author
Forward
0 new messages