2012. 6. 14. 11:17


[출처 ] http://shonm.tistory.com/entry/JAVA-netty-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B0%A9%EC%8B%9D-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EC%82%AC%EC%9A%A9%EB%B2%95-2-client



바로 이어서 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 끊어졌을 때 자원 회수
}

}

Posted by k1rha