package neal.minapush.push; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.core.future.WriteFuture; import org.apache.mina.core.service.IoService; import org.apache.mina.core.service.IoServiceListener; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; import org.apache.mina.filter.keepalive.KeepAliveFilter; import org.apache.mina.filter.keepalive.KeepAliveRequestTimeoutHandler; import org.apache.mina.transport.socket.nio.NioSocketConnector; import java.net.InetSocketAddress; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; import neal.minapush.util.NetworkUtil; /** * Created by neal on 2014/12/2. */ public class PushManager { private static PushManager pushManager; private NioSocketConnector connector; private ConnectFuture connectFuture; private IoSession session; private ExecutorService executorService=Executors.newSingleThreadExecutor(); public PushManager() { } public static PushManager getInstance() { if (pushManager == null) { pushManager = new PushManager(); } return pushManager; } public void setPushEventListener(PushEventListener pushEventListener){ if(connector!=null && connector.getHandler()!=null){ if(connector.getHandler() instanceof ClientSessionHandler) { ((ClientSessionHandler) connector.getHandler()).setPushEventListener(pushEventListener); } } } public void openPush(){ if(connector!=null){ return; } connector = new NioSocketConnector(); connector.setConnectTimeoutMillis(Config.SOCKET_CONNECT_TIMEOUT); connector.setHandler(new ClientSessionHandler()); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory())); connector.getFilterChain().addLast("keepalive", new KeepAliveFilter (new ClientKeepAliveMessageFactoryImp(), IdleStatus.READER_IDLE, KeepAliveRequestTimeoutHandler.DEAF_SPEAKER, Config.KEEP_ALIVE_TIME_INTERVAL, Config.KEEP_ALIVE_RESPONSE_TIMEOUT)); } /** * 开始连接 * @return */ public boolean Connect() { if(!NetworkUtil.isNetworkConnect()|| connector==null){ return false; } if(connector!=null&&connector.isActive()&&connectFuture!=null&&connectFuture.isConnected()&&session!=null&& session.isConnected() ) { return true; } FutureTask<Boolean> futureTask = new FutureTask<Boolean>(new Callable<Boolean>() { @Override public Boolean call() { try { connectFuture = connector.connect(new InetSocketAddress( Config.HOSTNAME, Config.PORT)); connectFuture.awaitUninterruptibly(); session = connectFuture.getSession(); System.out.println("manager connect"+android.os.Process.myPid()+'-'+android.os.Process.myTid()); } catch (Exception e) { return false; } return true; } }); executorService.submit(futureTask); try { return futureTask.get(); } catch (Exception e) { return false; } } public boolean sendMessage(ClientPushMessage clientPushMessage){ if(session==null|| !session.isConnected()){ return false; } WriteFuture writeFuture=session.write(clientPushMessage); if(writeFuture==null){ return false; } writeFuture.awaitUninterruptibly(); if(writeFuture.isWritten()){ return true; }else { return false; } } /** * 关闭连接 */ public void disConnect(){ if(session!=null && session.isConnected()){ session.close(false); } if(connectFuture!=null && connectFuture.isConnected()) { connectFuture.cancel(); } if(connector!=null && !connector.isDisposed()) { connector.dispose(); } } }