본문 바로가기
JAVA

[ JAVA ] netty (비동기 이벤트 방식 네트워크 프레임워크) 사용법 2 ( client )

by 정윤재 2012. 4. 4.

바로 이어서 client 로직을 올려 봅니다.

 

여기도 2개의 클래스 입니다.

 

첫 번째로 이벤트 핸들러 클래스 입니다.

 

package com.incross.netty;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;

public class SimpleClientHandler extends SimpleChannelHandler{
 

 
 @Override
 public void messageReceived(ChannelHandlerContext ctx,MessageEvent e){
  ChannelBuffer response  =   (ChannelBuffer)e.getMessage();
  
  byte[] message    =   response.array();
  
  System.out.println("message:"+new String(message));
  //response 메시지 찍어보기
  if(new String(message).equals("server write test")){
   //어떤 조건이 들어왔을 때 종료 되는 로직
   Channel ch     =   e.getChannel();
   
   ch.close();
   
   System.out.println("closed");
  }
  
  
 }
 
 //connection 연결 하면 바로 데이터 전송 하도록 하는 메소드
 @Override
 public void channelConnected(ChannelHandlerContext ctx,ChannelStateEvent e){
  
  Channel ch     =   e.getChannel();
  ChannelBuffer buf   =   ChannelBuffers.dynamicBuffer();

  buf.writeBytes("1234a".getBytes());
  
  ChannelFuture future  =   ch.write(buf);
  
  
  

  future.addListener(new ChannelFutureListener(){
        public void operationComplete(ChannelFuture future){
         Channel ch  =  future.getChannel();
         //ch.close();
         //보내고 응답 안받고 끝내려면 close 해주면 됨
        }
       });
 }
 
 
 
 public void exceptionCaught(ChannelHandlerContext ctx,ExceptionEvent e){
  
  e.getCause().printStackTrace();
  
  Channel ch     =   e.getChannel();
  
  ch.close();
 }  
}

두 번째로 클라이언트 쪽의 main 클래스 입니다.

 

package com.incross.netty;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;

public class SimpleClient {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  int port   =   8000;
  
  ChannelFactory factory   =   new NioClientSocketChannelFactory(
              Executors.newCachedThreadPool(),
              Executors.newCachedThreadPool()              
             );
  
  ClientBootstrap bootstrap  =   new ClientBootstrap(factory);
  
  bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
   
   @Override
   public ChannelPipeline getPipeline() throws Exception {
    // TODO Auto-generated method stub
    
    return Channels.pipeline(new SimpleClientHandler());
   }
  });
  
  
  bootstrap.setOption("tcpNoDelay", true);
  bootstrap.setOption("keepAlive", true);
  
  ChannelFuture future   =   bootstrap.connect(new InetSocketAddress("localhost",port));
  
  
  
  // 아래 부터는  connection 끊어 졌을 때를 위한 처리
  future.awaitUninterruptibly();
  
  if(!future.isSuccess()){
   future.getCause().printStackTrace();
  }
  
  future.getChannel().getCloseFuture().awaitUninterruptibly();
  
  factory.releaseExternalResources();
  //connection 끊어졌을 때 자원 회수
 }

}

제가 오픈 소스에 호감을 갖게 해줬던 프로젝트를 이제서야 다루게 되다니 너무 늦었다는

 

생각이 들지만 어찌됐든 이제 이걸 상용으로 사용 할 수 있게 되서 너무 너무 기쁩니다.


댓글