netty 시작하기 (4)

18
Netty 시작하기 (4) 풍부한 코덱과 웹소켓 김대현 @hatemogi 0

Upload: daehyun-kim

Post on 18-Jul-2015

183 views

Category:

Software


10 download

TRANSCRIPT

Page 1: Netty 시작하기 (4)

Netty 시작하기 (4)풍부한 코덱과 웹소켓

김대현@hatemogi

0

Page 2: Netty 시작하기 (4)

Netty 시작하기: 마지막 시간

Netty의 풍부한 코덱웹소켓 서버 구현

실습과 예제

웹기반 채팅 서버 개발

Page 3: Netty 시작하기 (4)

Netty의 풍부한 코덱

텍스트 처리압축 처리다양한 프로토콜 지원코덱 개발시 이용하는 클래스들 코덱도 채널핸들러입니다

io.netty.handler.codec.*

Page 4: Netty 시작하기 (4)

지난 시간의 ChatServer.java

public final class ChatServer { public static void main(String[] args) throws Exception { NettyStartupUtil.runServer(8030, new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline() .addLast(new LineBasedFrameDecoder(1024, true, true)) .addLast(new StringDecoder(CharsetUtil.UTF_8), new StringEncoder(CharsetUtil.UTF_8)) .addLast(new ChatMessageCodec(), new LoggingHandler(LogLevel.INFO)) .addLast(new ChatServerHandler()); } }); }}

Page 5: Netty 시작하기 (4)

텍스트 처리

StringEncoder, StringDecoderBase64Encoder, Base64Decoder

Page 6: Netty 시작하기 (4)

압축 처리

ZlibSnappy

Page 7: Netty 시작하기 (4)

다양한 프로토콜 지원

ProtoBufHTTP, SPDY, WebSocketSocksHTTP/2 (개발버전)

Page 8: Netty 시작하기 (4)

코덱 개발용

LineBasedFrameDecoderByteToMessageCodecMessageToMessageCodecFixedLengthFrameDecoder

Page 9: Netty 시작하기 (4)

실습: 웹소켓 기반 채팅 서버

ChannelPipeline을 잘 조립해서 세번째 시간에 개발한 ChatServerHandler를그대로 다시 사용해서 웹소켓 기반 채팅 서버를 만들어봅시다. 웹브라우저용클라이언트는 잘 준비돼 있습니다.

Page 10: Netty 시작하기 (4)

웹소켓 (WebSocket)

모던 웹브라우저 대부분이 지원하는 양방향 프로토콜HTTP를 연결된 다음 WebSocket통신으로 업그레이드얼핏 HTTP인 것 같지만 사실상 다른 프로토콜

참고

SPDYHTTP/2

Page 11: Netty 시작하기 (4)
Page 12: Netty 시작하기 (4)

src/nettystartup/h4/WebChatServer.java

public class WebChatServer { static String index = System.getProperty("user.dir") + "/res/h4/index.html";

public static void main(String[] args) throws Exception { NettyStartupUtil.runServer(8040, new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) { ChannelPipeline p = ch.pipeline(); p.addLast(new HttpServerCodec()); p.addLast(new HttpObjectAggregator(65536)); p.addLast(new WebSocketHandshakeHandler("/chat", new WebChatHandler())); p.addLast(new HttpStaticFileHandler("/", index)); // TODO: [실습4-1] 실습3-2와 마찬가지로 404 응답을 처리하게 합니다. } }); }}

Page 13: Netty 시작하기 (4)

WebSocketHandshakeHandler.java

class WebSocketHandshakeHandler extends S..C..I.Handler<FullHttpRequest> { protected void channelRead0(C..H..Context ctx, FullHttpRequest req) throws Exception { ... handshakeWebSocket(ctx, req); ... }

private void handshakeWebSocket(C..H..Context ctx, FullHttpRequest req) { ... h.handshake(ctx.channel(), req).addListener((ChannelFuture f) -> { // replace the handler when done handshaking ChannelPipeline p = f.channel().pipeline(); p.replace(WebSocketHandshakeHandler.class, "wsHandler", wsHandler); } }}

Page 14: Netty 시작하기 (4)

src/nettystartup/h4/WebChatHandler.java

class WebChatHandler extends SimpleChannelInboundHandler<WebSocketFrame> { @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { // TODO: [실습4-2] 파이프라인에 코덱과 핸들러를 추가해서 WebSocket과 ChatServerHandler를 연결합니다. }

@Override protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception { ... TextWebSocketFrame만 걸러서 다음 핸들러에 넘기는 코드 ... ctx.fireChannelRead(frame.retain()); }}

Page 15: Netty 시작하기 (4)

src/nettystartup/h4/WebSocketChatCodec.java

class WebSocketChatCodec extends MessageToMessageCodec<TextWebSocketFrame, ChatMessage> { @Override protected void encode(C..H..Context ctx, ChatMessage msg, List<Object> out) throws E.. { out.add(new TextWebSocketFrame(msg.toString())); }

@Override protected void decode(C..H..Context ctx, TextWebSocketFrame msg, List<Object> out) throws E.. { out.add(ChatMessage.parse(msg.text())); }}

Page 16: Netty 시작하기 (4)

도전과제

브라우저 <­> 웹소켓 서버 프로세스 <­> 채팅 서버 프로세스

시간이 더 있다면, 세번째 시간에 개발한 채팅 서버에 TCP 연결로 프록시 처리를 하는 웹소켓 채팅서비스를 만들어봅시다.

Page 18: Netty 시작하기 (4)

감사합니다

김대현

hatemogi at gmail

http://github.com/hatemogi/netty­startup

http://hatemogi.comhttp://twitter.com/hatemogihttp://medium.com/@hatemogi