package cn.mobiledaily.module.android.module.mobilepush.service.helper; import android.util.Log; import cn.mobiledaily.module.android.common.config.AppConfig; import cn.mobiledaily.module.mobilepush.domain.android.MessageObject; import cn.mobiledaily.module.mobilepush.domain.android.MessageObjects; import cn.mobiledaily.module.mobilepush.domain.android.TextMessage; import org.jboss.netty.bootstrap.ClientBootstrap; import org.jboss.netty.channel.*; import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; import org.jboss.netty.handler.codec.serialization.ClassResolvers; import org.jboss.netty.handler.codec.serialization.ObjectDecoder; import org.jboss.netty.handler.codec.serialization.ObjectEncoder; import java.net.InetSocketAddress; import java.util.concurrent.Executors; public class AndroidMessageClient { String host; int port; ClientBootstrap clientBootstrap; String token; OnMessageListener onMessageListener; public void init(String token, OnMessageListener listener) { host = AppConfig.MESSAGE_SERVER; port = AppConfig.MESSAGE_SERVER_PORT; onMessageListener = listener; if ((token == null) || token.length() == 0) { throw new RuntimeException("require token"); } if (listener == null) { throw new RuntimeException("require OnMessageListener"); } this.token = token; clientBootstrap = new ClientBootstrap(new NioClientSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline result = new DefaultChannelPipeline(); result.addLast("encode", new ObjectEncoder()); result.addLast("decode", new ObjectDecoder( ClassResolvers.softCachingConcurrentResolver(MessageObject.class.getClassLoader()))); result.addLast("handler", new ChannelHandler()); return result; } }); clientBootstrap.connect(new InetSocketAddress(host, port)); } class ChannelHandler extends SimpleChannelHandler { @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { Object obj = e.getMessage(); if (obj instanceof MessageObject) { MessageObject resp = null; switch (((MessageObject) obj).getType()) { case REQ_PING: resp = MessageObjects.respPong(); break; case REQ_TOKEN: resp = MessageObjects.respToken(token); break; case TEXT: TextMessage message = (TextMessage) obj; onMessageListener.onMessageReceived(message.getText()); break; case REQ_MESSAGE: ctx.getChannel().write(MessageObjects.reqMessage()); break; } if (resp != null) { ctx.getChannel().write(resp); } } } @Override public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { super.exceptionCaught(ctx, e); ctx.getChannel().close(); } } }