MINA 프레임 워 크 응용 입문 범례

1.MINA 프레임 워 크 소개
     Apache MINA(Multipurpose Infrastructure for Network Applications)는 고성능 과 가용성 이 높 은 네트워크 애플 리 케 이 션 을 개발 하 는 데 사용 되 는 기본 프레임 워 크 로 자바 의 socket 과 NIO 를 효과 적 이 고 선명 하 게 패 키 징 하여 개발 자 들 이 TCP/UDP 프로그램 을 개발 하 는 데 편리 하 며 원시 적 인 socket 을 사용 할 때 고려 해 야 할 여러 가지 복잡 하고 번 거 로 운 문제(스 레 드,성능,세 션 등)응용 에서 의 업무 논리 개발 에 더 많은 정력 을 기울 입 니 다.
 
2.MINA 프레임 의 상용 클래스:
     IoAccepter      서버 쪽     IoConnector   클 라 이언 트     IoSession       현재 클 라 이언 트 가 서버 에 연결 하 는 실례     IoHandler       비 즈 니스 처리 논리     IoFilter            필 터 는 통신 계층 인터페이스 와 업무 계층 인터페이스 에 사용 된다.
 
3.범례 소스 코드
     다음은 Apache MINA 로. 1.1.7 의 경우 JDK 5.0 이상 버 전이 필요 하고 slf4j 의 jar 패키지 도 필요 하 다.
 
    1.서버 엔 드 메 인 소스 코드
public class Server {
	public static final int PORT = 8080;
	
	public static void main(String[] args) {
		try{
			IoAcceptor acceptor = new SocketAcceptor();    
			
			SocketAcceptorConfig config = new SocketAcceptorConfig();
	        config.setReuseAddress(true);
	        
	        //       
	        //config.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
	        config.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
	        //config.getFilterChain().addLast("logger", new LoggingFilter());
	        
	        //  HelloServer
	        acceptor.bind(new InetSocketAddress(PORT), new ServerSessionHandler(acceptor), config);
	        System.out.println("Server started on port " + PORT);
	        
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
}

 
    2.서버 업무 처리 논리 소스 코드
public class ServerSessionHandler extends IoHandlerAdapter {
	private IoAcceptor acceptor;
	
	public ServerSessionHandler(IoAcceptor acceptor){
		this.acceptor = acceptor;
	}
	
	/**
	 *        
	 */
	public void sessionOpened(IoSession session) throws Exception {
		session.setIdleTime(IdleStatus.BOTH_IDLE, 60); //session           
        //session.setAttribute("times", new Integer(0)); //  session   
		
		Set set = acceptor.getManagedSessions(new InetSocketAddress(Server.PORT));
		long count = 0;
		if(set!=null) count = set.size();
		System.out.println("       :" + count);
	}
	
	/**
	 *        
	 */
	public void messageReceived(IoSession session, Object message)throws Exception {
		Message msg = (Message)message;    
	    msg.setMsgBody("in server side: " + msg.getMsgBody());   
	    session.write(msg); 
	}

	/**
	 * session             
	 */
	public void sessionIdle(IoSession session, IdleStatus status)throws Exception {
		System.out.println("Disconnecting the idle");
        session.close();  
	}

	/**
	 *        
	 */
	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("session closed from " + session.getRemoteAddress());
		
		Set set = acceptor.getManagedSessions(new InetSocketAddress(Server.PORT));
		long count = 0;
		if(set!=null) count = set.size();
		System.out.println("       :" + count);
	}
	
	/**
	 *        
	 */
	public void exceptionCaught(IoSession session, Throwable cause)throws Exception {
		cause.printStackTrace();
		session.close();
	}
}

 
    3.클 라 이언 트 메 인 소스 코드
public class Client {
	private static final String HOSTNAME = "localhost";    
    private static final int PORT = 8080;   
    private static final int CONNECT_TIMEOUT = 30; //seconds
    
    public void sendMessage(String msg){
    	SocketConnector connector = new SocketConnector();
		
		SocketConnectorConfig config = new SocketConnectorConfig();
		config.setConnectTimeout(CONNECT_TIMEOUT);    
		
		config.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));  
		//config.getFilterChain().addLast("logger", new LoggingFilter());
		
		Message message = new Message(1, msg);
		connector.connect(new InetSocketAddress(HOSTNAME, PORT), new ClientSessionHandler(message), config);
    }
    
	public static void main(String[] args) {
		for(int i=1;i<=5;i++){
			Client client = new Client();
			client.sendMessage("cjm_" + i);
		}
	}
}

 
    4.클 라 이언 트 업무 논리 처리 소스 코드
public class ClientSessionHandler extends IoHandlerAdapter {
	private Object msg;
	
	public ClientSessionHandler(Object msg){
		this.msg = msg;
	}

	public void sessionOpened(IoSession session) throws Exception {
		session.write(this.msg);
	}

	public void messageReceived(IoSession session, Object message)throws Exception {
        Message rm = (Message) message;              
        System.out.println("message is: " + rm.getMsgBody());    
        //session.write(rm);   
        //session.close();
	}

	public void sessionClosed(IoSession session) throws Exception {
		System.out.println("session closed from Client");
	}

	public void exceptionCaught(IoSession session, Throwable cause)throws Exception {
		session.close();
	}
}

 
    5.메시지 류 소스 코드
public class Message implements Serializable{
	private static final long serialVersionUID = 1L;
	
	private int type;
	private String msgBody;
	
	public Message(int type, String msgBody){
		this.type = type;
		this.msgBody = msgBody;
	}
	
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
	public String getMsgBody() {
		return msgBody;
	}
	public void setMsgBody(String msgBody) {
		this.msgBody = msgBody;
	}
}

좋은 웹페이지 즐겨찾기