제3편: 미나는 TCP 클라이언트로서 주의 요점

하나.간단한 데모
ClientMain.java
ClientMinaMain.java
public class ClientMinaMain {
	public static void main(String args[])
	{
		NioSocketConnector conn=new NioSocketConnector();
		conn.getFilterChain().addLast("code",new ProtocolCodecFilter(new MyProtocalCodecFactory("utf-8")));  //         

		conn.setHandler(new minaImageHander()); //        
		conn.connect(new InetSocketAddress("127.0.0.1",6001));
		
	}
}

사용자 정의 코딩 디코딩 처리 공장
만약에 한 서버만 연결하면 여기는 서로 다른 디코딩 공장을 만들지 않아도 된다. 만약에 여러 tcp 서버를 연결해야 한다면 서로 다른 클라이언트 인코딩 처리 클래스를 만들어야 한다. (클라이언트 인코딩 처리 클래스와 관리 클래스의 쓰기는 전편: 제2편:mina가 tcp 서버로서 클라이언트를 어떻게 관리하는지 간단한 수정만 하면 사용할 수 있다)
구체적인 코드는 여기에 쓰지 않고 인터넷에서 마음대로 검색하면 쓰기 방법을 찾을 수 있다. 디코딩 방법의 반환값은 지난 편에서 이미 말했고 더 이상 군말하지 않는다.
둘.클라이언트 재연결 메커니즘
모든 긴 연결을 가진 클라이언트는 이런 처리를 해야 한다. 그것이 바로 재연결 메커니즘이다.일반적으로 두 가지로 나뉘는데, 오프라인 재연결과 미연결 성공 재연결이다.
연결이 성공적으로 재연결되지 않았습니다.
ClientMain을 덮어씁니다.java:
public class ClientMinaMain {
    public static NioSocketConnector conn = null;
	/**
	 *       
	 * @param name
	 *               
	 * @return     
	 */
    public static synchronized NioSocketConnector getConInstance() {
          if (conn == null) {
		conn = new NioSocketConnector();
		conn.setConnectTimeoutMillis(5000);
		conn.getFilterChain().addLast("code", new ProtocolCodecFilter(new MyProtocalCodecFactory("utf-8")));
		conn.setHandler(new minaImageHander());
	}
	return conn;
     }
	public static void main(String args[]){
		while (true) {		
			try {		
				conn = getConInstance();
				ConnectFuture cf = conn	.connect(new InetSocketAddress(“127.0.0.1“,6001));
				cf.awaitUninterruptibly();
				IoSession session = cf.getSession();
				CamClientManage.getInstance().putValue("127.0.0.1", session);
				break;
			} catch (Exception e) {
				conn.dispose();
				try {
					Thread.sleep(30000);
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
			}
		}
	}
}

오프라인 재연결
sessionClose 메서드에 다음 코드를 추가합니다. (여기에 코드를 추가해야 함)
/**
	 *         
	 */
	@Override
	public void sessionClosed(IoSession session) throws Exception {
		String ip = CamClientManage.getInstance().getKeyByValue(session);
		CamClientManage.getInstance().removebyKey(ip);
		DecodeManage.getInstance().removebyKey(session);
		TcpListener.conn.dispose(); //     
		NioSocketConnector connector = null;
		while (true) {
			try {
				Thread.sleep(60000);
				connector = TcpListener.getConInstance();
				ConnectFuture cf = connector.connect(new InetSocketAddress("127.0.0.1",
						6001));
				cf.awaitUninterruptibly();
				IoSession zsSession = cf.getSession();
				CamClientManage.getInstance().putValue("127.0.0.1", zsSession);
				break;
			} catch (Exception e) {
				connector.dispose(); //     
			}

		}
	}

클라이언트로서 심장 박동 메커니즘을 해서 긴 연결을 유지해야 할 때도 있다. 아주 간단한 방법은 클라이언트가 빈 상태에 들어갈 때 심장 박동 정보를 보내는 것이다.이렇게 하면 심장 박동 메커니즘도 실현할 수 있다

좋은 웹페이지 즐겨찾기