From 9e9cc962d5fcd961def76d3ab45cd5dfd366d94c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=9C=E6=96=B9=E5=A4=95=E9=98=B3?= Date: Tue, 11 Jun 2019 11:37:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96android=E5=92=8Cjava=20sdk?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cim/sdk/android/CIMConnectorManager.java | 185 ++++++-------- .../cim/sdk/android/CIMPushManager.java | 6 +- .../cim/sdk/android/CIMPushService.java | 96 +++---- .../cim/sdk/client/CIMConnectorManager.java | 239 ++++++++---------- .../sdk/client/CIMEventBroadcastReceiver.java | 23 +- .../cim/sdk/client/coder/CIMLogger.java | 17 +- .../cim/sdk/client/constant/CIMConstant.java | 3 - .../app/libs/cim-android-sdk-3.7.0.jar | Bin 94405 -> 94864 bytes .../lib/cim-java-sdk-3.7.0.jar | Bin 88073 -> 88368 bytes 9 files changed, 243 insertions(+), 326 deletions(-) diff --git a/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java b/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java index d2711bf..8301349 100644 --- a/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java +++ b/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMConnectorManager.java @@ -24,17 +24,15 @@ package com.farsunset.cim.sdk.android; import java.io.IOException; import java.net.ConnectException; import java.net.InetSocketAddress; +import java.net.SocketTimeoutException; import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.Semaphore; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.locks.ReentrantLock; import com.farsunset.cim.sdk.android.coder.CIMLogger; import com.farsunset.cim.sdk.android.coder.ClientMessageDecoder; @@ -68,29 +66,38 @@ class CIMConnectorManager{ private final int READ_IDLE_TIME = 120 * 1000; + private final int CONNECT_TIME_OUT = 10 * 1000; + + private final int CONNECT_ALIVE_TIME_OUT = 150 * 1000; private final AtomicLong LAST_READ_TIME = new AtomicLong(0); - - private final AtomicBoolean CONNECTING_FLAG = new AtomicBoolean(false) ; private final CIMLogger LOGGER = CIMLogger.getLogger(); private static final HandlerThread IDLE_HANDLER_THREAD = new HandlerThread("READ-IDLE", Process.THREAD_PRIORITY_BACKGROUND); - private LinkedBlockingQueue sendFailBodyQueue = new LinkedBlockingQueue(); - private final ReentrantLock IOLOCK = new ReentrantLock(); - - private Selector selector; + private Semaphore semaphore = new Semaphore(1, true); + private SocketChannel socketChannel ; private Context context; private ByteBuffer readBuffer = ByteBuffer.allocate(READ_BUFFER_SIZE); - private ExecutorService workerExecutor = Executors.newFixedThreadPool(1); - private ExecutorService bossExecutor = Executors.newFixedThreadPool(1); - + private ExecutorService workerExecutor = Executors.newFixedThreadPool(1,new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r,"worker-"); + } + }); + + private ExecutorService bossExecutor = Executors.newFixedThreadPool(1,new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r,"boss-"); + } + }); private ClientMessageEncoder messageEncoder = new ClientMessageEncoder(); private ClientMessageDecoder messageDecoder = new ClientMessageDecoder(); @@ -107,19 +114,11 @@ class CIMConnectorManager{ try { if(socketChannel == null || !socketChannel.isOpen()) { socketChannel = SocketChannel.open(); - socketChannel.configureBlocking(false); socketChannel.socket().setTcpNoDelay(true); socketChannel.socket().setKeepAlive(true); socketChannel.socket().setReceiveBufferSize(READ_BUFFER_SIZE); socketChannel.socket().setSendBufferSize(WRITE_BUFFER_SIZE); } - - if(selector == null || !selector.isOpen()) { - selector = Selector.open(); - } - - selector.wakeup(); - socketChannel.register(selector, SelectionKey.OP_CONNECT); }catch(Exception ignore) {} @@ -148,22 +147,22 @@ class CIMConnectorManager{ return; } - - if (CONNECTING_FLAG.get() || isConnected()) { + + if (isConnected()) { return; } - CONNECTING_FLAG.set(true); - - if(!socketChannel.isOpen() ||!selector.isOpen()) { + if(!socketChannel.isOpen()) { makeNioConnector(); } - workerExecutor.execute(new Runnable() { + bossExecutor.execute(new Runnable() { @Override public void run() { - IOLOCK.lock(); + if (isConnected()) { + return; + } LOGGER.startConnect(host, port); @@ -171,38 +170,40 @@ class CIMConnectorManager{ try { - socketChannel.connect(new InetSocketAddress(host, port)); + semaphore.acquire(); - while (socketChannel.isOpen()) { - - selector.select(); - - if(!selector.isOpen()) { - break; - } - - for(SelectionKey key : selector.selectedKeys()){ - - if((key.interestOps() & SelectionKey.OP_CONNECT) == SelectionKey.OP_CONNECT && socketChannel.finishConnect()) { - IOLOCK.unlock(); - handelConnectedEvent(); - continue; - } - - if((key.interestOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) { - handelSocketReadEvent(); - } - } - } + socketChannel.socket().connect(new InetSocketAddress(host, port),CONNECT_TIME_OUT); + semaphore.release(); + + handelConnectedEvent(); + + + int result = -1; + + while((result = socketChannel.read(readBuffer)) > 0) { + + if(readBuffer.position() == readBuffer.capacity()) { + extendByteBuffer(); + } + + handelSocketReadEvent(result); + + } + + handelSocketReadEvent(result); + }catch(ConnectException ignore){ - IOLOCK.unlock(); + semaphore.release(); handleConnectAbortedEvent(); - }catch(IllegalArgumentException ignore){ - IOLOCK.unlock(); + }catch(SocketTimeoutException ignore){ + semaphore.release(); handleConnectAbortedEvent(); }catch(IOException ignore) { + semaphore.release(); handelDisconnectedEvent(); + }catch(InterruptedException ignore) { + semaphore.release(); } } }); @@ -212,12 +213,16 @@ class CIMConnectorManager{ public void destroy() { closeSession(); - closeSelector(); } public void closeSession() { + + if(!isConnected()) { + return; + } + try { socketChannel.close(); } catch (IOException ignore) { @@ -233,28 +238,31 @@ class CIMConnectorManager{ public void send(final Protobufable body) { - bossExecutor.execute(new Runnable() { + if(!isConnected()) { + return; + } + + workerExecutor.execute(new Runnable() { @Override public void run() { int result = 0; try { - IOLOCK.lock(); + semaphore.acquire(); ByteBuffer buffer = messageEncoder.encode(body); while(buffer.hasRemaining()){ result += socketChannel.write(buffer); } - } catch (IOException e) { + } catch (Exception e) { result = -1; }finally { - IOLOCK.unlock(); + semaphore.release(); if(result <= 0) { - sendFailBodyQueue.offer(body); closeSession(); }else { messageSent(body); @@ -264,18 +272,8 @@ class CIMConnectorManager{ }); } - - private void sendFaildQueueBody() { - Protobufable body = sendFailBodyQueue.poll(); - if(body == null) { - return; - } - - send(body); - - sendFaildQueueBody(); - - } + + private void sessionCreated() { LOGGER.sessionCreated(socketChannel); @@ -286,8 +284,6 @@ class CIMConnectorManager{ intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_SUCCESSED); context.sendBroadcast(intent); - sendFaildQueueBody(); - } private void sessionClosed() { @@ -304,8 +300,6 @@ class CIMConnectorManager{ readBuffer = ByteBuffer.allocate(READ_BUFFER_SIZE); } - closeSelector(); - Intent intent = new Intent(); intent.setPackage(context.getPackageName()); intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_CLOSED); @@ -369,13 +363,10 @@ class CIMConnectorManager{ }; private void handelDisconnectedEvent() { - CONNECTING_FLAG.set(false); closeSession(); } private void handleConnectAbortedEvent() { - - CONNECTING_FLAG.set(false); long interval = CIMConstant.RECONN_INTERVAL_TIME - (5 * 1000 - new Random().nextInt(15 * 1000)); @@ -389,33 +380,22 @@ class CIMConnectorManager{ } - private void handelConnectedEvent() throws IOException { + private void handelConnectedEvent() { - CONNECTING_FLAG.set(false); - socketChannel.register(selector, SelectionKey.OP_READ); sessionCreated(); idleHandler.sendEmptyMessageDelayed(0, READ_IDLE_TIME); } - private void handelSocketReadEvent() throws IOException { - - int result = 0; - - while((result = socketChannel.read(readBuffer)) > 0) { - if(readBuffer.position() == readBuffer.capacity()) { - extendByteBuffer(); - } - } - - if(result == -1 && !readBuffer.hasRemaining()) { + private void handelSocketReadEvent(int result) throws IOException { + + if(result == -1) { closeSession(); return; } markLastReadTime(); - readBuffer.position(0); Object message = messageDecoder.doDecode(readBuffer); @@ -424,8 +404,6 @@ class CIMConnectorManager{ return; } - - LOGGER.messageReceived(socketChannel,message); if(isHeartbeatRequest(message)) { @@ -436,11 +414,7 @@ class CIMConnectorManager{ } this.messageReceived(message); - - if(result == -1) { - closeSession(); - return; - } + } @@ -473,13 +447,6 @@ class CIMConnectorManager{ private boolean isHeartbeatRequest(Object data) { return data instanceof HeartbeatRequest; } - - - - private void closeSelector() { - try { - selector.close(); - } catch (IOException ignore) {} - } + } diff --git a/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java b/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java index a618b18..65ff4e2 100644 --- a/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java +++ b/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushManager.java @@ -49,8 +49,6 @@ public class CIMPushManager { static String ACTION_SET_LOGGER_EANABLE = "ACTION_SET_LOGGER_EANABLE"; - static String ACTION_DESTORY = "ACTION_DESTORY"; - static String KEY_SEND_BODY = "KEY_SEND_BODY"; static String KEY_CIM_CONNECTION_STATUS = "KEY_CIM_CONNECTION_STATUS"; @@ -221,9 +219,7 @@ public class CIMPushManager { CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_DESTROYED, true); CIMCacheManager.putString(context, CIMCacheManager.KEY_ACCOUNT, null); - Intent serviceIntent = new Intent(context, CIMPushService.class); - serviceIntent.setAction(ACTION_DESTORY); - startServiceCompat(context,serviceIntent); + context.stopService(new Intent(context, CIMPushService.class)); } diff --git a/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java b/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java index 21295b3..6267279 100644 --- a/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java +++ b/cim-client-sdk/cim-android-sdk/src/com/farsunset/cim/sdk/android/CIMPushService.java @@ -36,8 +36,6 @@ import android.os.Handler; import android.os.IBinder; import android.os.Message; -import java.util.concurrent.Semaphore; - import com.farsunset.cim.sdk.android.coder.CIMLogger; import com.farsunset.cim.sdk.android.constant.CIMConstant; import com.farsunset.cim.sdk.android.model.SentBody; @@ -48,14 +46,13 @@ import com.farsunset.cim.sdk.android.model.SentBody; * @author 3979434 * */ -public class CIMPushService extends Service { +public class CIMPushService extends Service { public final static String KEY_DELAYED_TIME = "KEY_DELAYED_TIME"; public final static String KEY_LOGGER_ENABLE = "KEY_LOGGER_ENABLE"; private CIMConnectorManager manager; private KeepAliveBroadcastReceiver keepAliveReceiver; - private Semaphore semaphore = new Semaphore(1, true); - + private ConnectivityManager connectivityManager; @Override public void onCreate() { manager = CIMConnectorManager.getManager(this.getApplicationContext()); @@ -68,35 +65,37 @@ public class CIMPushService extends Service { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() { - @Override - public void onAvailable(Network network) { - Intent intent = new Intent(); - intent.setPackage(getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_NETWORK_CHANGED); - sendBroadcast(intent); - } - @Override - public void onUnavailable() { - Intent intent = new Intent(); - intent.setPackage(getPackageName()); - intent.setAction(CIMConstant.IntentAction.ACTION_NETWORK_CHANGED); - sendBroadcast(intent); - } - - }); + connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + + connectivityManager.registerDefaultNetworkCallback(networkCallback); } } + + ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() { + @Override + public void onAvailable(Network network) { + Intent intent = new Intent(); + intent.setPackage(getPackageName()); + intent.setAction(CIMConstant.IntentAction.ACTION_NETWORK_CHANGED); + sendBroadcast(intent); + } + @Override + public void onUnavailable() { + Intent intent = new Intent(); + intent.setPackage(getPackageName()); + intent.setAction(CIMConstant.IntentAction.ACTION_NETWORK_CHANGED); + sendBroadcast(intent); + } + + }; Handler connectionHandler = new Handler() { @Override public void handleMessage(android.os.Message message) { String host = message.getData().getString(CIMCacheManager.KEY_CIM_SERVIER_HOST); int port = message.getData().getInt(CIMCacheManager.KEY_CIM_SERVIER_PORT, 0); - manager.connect(host, port); - semaphore.release(); + handleConnection(host, port); } }; @@ -118,7 +117,7 @@ public class CIMPushService extends Service { String action = intent.getAction(); if (CIMPushManager.ACTION_CREATE_CIM_CONNECTION.equals(action)) { - handleConnection(intent); + handleDelayConnection(intent); } if (CIMPushManager.ACTION_SEND_REQUEST_BODY.equals(action)) { @@ -129,11 +128,6 @@ public class CIMPushService extends Service { manager.closeSession(); } - if (CIMPushManager.ACTION_DESTORY.equals(action)) { - manager.destroy(); - this.stopSelf(); - } - if (CIMPushManager.ACTION_ACTIVATE_PUSH_SERVICE.equals(action)) { handleKeepAlive(); } @@ -150,41 +144,47 @@ public class CIMPushService extends Service { return super.onStartCommand(intent, flags, startId); } - private void handleConnection(Intent intent) { + private void handleDelayConnection(Intent intent) { long delayMillis = intent.getLongExtra(KEY_DELAYED_TIME, 0); if (delayMillis <= 0) { String host = intent.getStringExtra(CIMCacheManager.KEY_CIM_SERVIER_HOST); int port = intent.getIntExtra(CIMCacheManager.KEY_CIM_SERVIER_PORT, 0); - manager.connect(host, port); - return; - } - - if (!semaphore.tryAcquire()) { + handleConnection(host, port); return; } + Message msg = connectionHandler.obtainMessage(); msg.what = 0; msg.setData(intent.getExtras()); + connectionHandler.removeMessages(0); connectionHandler.sendMessageDelayed(msg, delayMillis); } + private void handleConnection(String host,int port) { + + boolean isManualStop = CIMCacheManager.getBoolean(getApplicationContext(), CIMCacheManager.KEY_MANUAL_STOP); + boolean isDestroyed = CIMCacheManager.getBoolean(getApplicationContext(), CIMCacheManager.KEY_CIM_DESTROYED); + if(isManualStop || isDestroyed) { + return; + } + manager.connect(host, port); + } + private void handleKeepAlive() { + if (manager.isConnected()) { CIMLogger.getLogger().connectState(true); return; } - - boolean isManualStop = CIMCacheManager.getBoolean(getApplicationContext(), CIMCacheManager.KEY_MANUAL_STOP); - boolean isDestroyed = CIMCacheManager.getBoolean(getApplicationContext(), CIMCacheManager.KEY_CIM_DESTROYED); - - CIMLogger.getLogger().connectState(false, isManualStop, isDestroyed); - - CIMPushManager.connect(this, 0); - + + String host = CIMCacheManager.getString(this, CIMCacheManager.KEY_CIM_SERVIER_HOST); + int port = CIMCacheManager.getInt(this, CIMCacheManager.KEY_CIM_SERVIER_PORT); + + handleConnection(host,port); } @Override @@ -195,9 +195,15 @@ public class CIMPushService extends Service { @Override public void onDestroy() { super.onDestroy(); + manager.destroy(); + connectionHandler.removeMessages(0); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { unregisterReceiver(keepAliveReceiver); } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + connectivityManager.unregisterNetworkCallback(networkCallback); + } } public class KeepAliveBroadcastReceiver extends BroadcastReceiver { diff --git a/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/CIMConnectorManager.java b/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/CIMConnectorManager.java index 1d141ed..0fb30ce 100644 --- a/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/CIMConnectorManager.java +++ b/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/CIMConnectorManager.java @@ -24,26 +24,24 @@ package com.farsunset.cim.sdk.client; import java.io.IOException; import java.net.ConnectException; import java.net.InetSocketAddress; -import java.net.StandardSocketOptions; +import java.net.SocketTimeoutException; import java.nio.ByteBuffer; -import java.nio.channels.ClosedSelectorException; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; import java.nio.channels.SocketChannel; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.Semaphore; +import java.util.concurrent.ThreadFactory; import com.farsunset.cim.sdk.client.coder.CIMLogger; import com.farsunset.cim.sdk.client.coder.ClientMessageDecoder; import com.farsunset.cim.sdk.client.coder.ClientMessageEncoder; import com.farsunset.cim.sdk.client.constant.CIMConstant; -import com.farsunset.cim.sdk.client.exception.SessionClosedException; import com.farsunset.cim.sdk.client.model.HeartbeatRequest; import com.farsunset.cim.sdk.client.model.HeartbeatResponse; import com.farsunset.cim.sdk.client.model.Intent; import com.farsunset.cim.sdk.client.model.Message; +import com.farsunset.cim.sdk.client.model.Protobufable; import com.farsunset.cim.sdk.client.model.ReplyBody; import com.farsunset.cim.sdk.client.model.SentBody; @@ -59,20 +57,34 @@ class CIMConnectorManager { private final int READ_BUFFER_SIZE = 2048; private final int WRITE_BUFFER_SIZE = 1024; + private final int CONNECT_TIME_OUT = 10 * 1000; - private final AtomicBoolean CONNECTING_FLAG = new AtomicBoolean(false) ; - private final CIMLogger LOGGER = CIMLogger.getLogger(); - - private Selector selector; + private SocketChannel socketChannel ; - private ByteBuffer readBuffer = ByteBuffer.allocate(READ_BUFFER_SIZE); - - private ExecutorService workerExecutor = Executors.newFixedThreadPool(1); - private ExecutorService bossExecutor = Executors.newFixedThreadPool(1); - private ExecutorService eventExecutor = Executors.newFixedThreadPool(1); + + private ExecutorService workerExecutor = Executors.newFixedThreadPool(1,new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r,"worker-"); + } + }); + private ExecutorService bossExecutor = Executors.newFixedThreadPool(1,new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r,"boss-"); + } + }); + private ExecutorService eventExecutor = Executors.newFixedThreadPool(1,new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r,"event-"); + } + }); + + private Semaphore semaphore = new Semaphore(1, true); private ClientMessageEncoder messageEncoder = new ClientMessageEncoder(); @@ -83,21 +95,14 @@ class CIMConnectorManager { } private void makeNioConnector() { try { + if(socketChannel == null || !socketChannel.isOpen()) { socketChannel = SocketChannel.open(); - socketChannel.configureBlocking(false); - socketChannel.setOption(StandardSocketOptions.SO_RCVBUF,READ_BUFFER_SIZE); - socketChannel.setOption(StandardSocketOptions.SO_SNDBUF, WRITE_BUFFER_SIZE); - socketChannel.setOption(StandardSocketOptions.SO_KEEPALIVE, true); - socketChannel.setOption(StandardSocketOptions.TCP_NODELAY,true); + socketChannel.socket().setTcpNoDelay(true); + socketChannel.socket().setKeepAlive(true); + socketChannel.socket().setReceiveBufferSize(READ_BUFFER_SIZE); + socketChannel.socket().setSendBufferSize(WRITE_BUFFER_SIZE); } - - if(selector == null || !selector.isOpen()) { - selector = Selector.open(); - } - - selector.wakeup(); - socketChannel.register(selector, SelectionKey.OP_CONNECT); }catch(Exception ignore) {} @@ -116,20 +121,21 @@ class CIMConnectorManager { public void connect(final String host, final int port) { - boolean isConnected = isConnected(); - if (CONNECTING_FLAG.get() || isConnected) { + if (isConnected()) { return; } - CONNECTING_FLAG.set(true); - - if(!socketChannel.isOpen() ||!selector.isOpen()) { + if(!socketChannel.isOpen()) { makeNioConnector(); } - workerExecutor.execute(new Runnable() { + bossExecutor.execute(new Runnable() { @Override public void run() { + + if (isConnected()) { + return; + } LOGGER.startConnect(host, port); @@ -137,36 +143,41 @@ class CIMConnectorManager { try { - socketChannel.connect(new InetSocketAddress(host, port)); + semaphore.acquire(); + + socketChannel.socket().connect(new InetSocketAddress(host, port),CONNECT_TIME_OUT); - while (socketChannel.isOpen()) { - - selector.select(); - - if(!selector.isOpen()) { - break; - } - - for(SelectionKey key : selector.selectedKeys()){ - - if((key.interestOps() & SelectionKey.OP_CONNECT) == SelectionKey.OP_CONNECT && socketChannel.finishConnect()) { - handelConnectedEvent(); - continue; - } - - if((key.interestOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) { - handelSocketReadEvent(); - } - } - } + semaphore.release(); + handelConnectedEvent(); + + + int result = -1; + + while((result = socketChannel.read(readBuffer)) > 0) { + + if(readBuffer.position() == readBuffer.capacity()) { + extendByteBuffer(); + } + + handelSocketReadEvent(result); + + } + + handelSocketReadEvent(result); + }catch(ConnectException ignore){ + semaphore.release(); handleConnectAbortedEvent(); - }catch(IllegalArgumentException ignore){ + }catch(SocketTimeoutException ignore){ + semaphore.release(); handleConnectAbortedEvent(); }catch(IOException ignore) { + semaphore.release(); handelDisconnectedEvent(); - }catch(ClosedSelectorException ignore) {} + }catch (InterruptedException ignore) { + semaphore.release(); + } } }); } @@ -174,13 +185,10 @@ class CIMConnectorManager { private void handelDisconnectedEvent() { - CONNECTING_FLAG.set(false); closeSession(); } private void handleConnectAbortedEvent() { - - CONNECTING_FLAG.set(false); long interval = CIMConstant.RECONN_INTERVAL_TIME - (5 * 1000 - new Random().nextInt(15 * 1000)); @@ -195,26 +203,16 @@ class CIMConnectorManager { private void handelConnectedEvent() throws IOException { - CONNECTING_FLAG.set(false); - socketChannel.register(selector, SelectionKey.OP_READ); sessionCreated(); - } - private void handelSocketReadEvent() throws IOException { + private void handelSocketReadEvent(int result) throws IOException { - int result = 0; - - while((result = socketChannel.read(readBuffer)) > 0) { - if(readBuffer.position() == readBuffer.capacity()) { - extendByteBuffer(); - } + if(result == -1) { + closeSession(); + return; } - - if(result == -1) { - closeSession(); - return; - } + readBuffer.position(0); @@ -246,63 +244,44 @@ class CIMConnectorManager { readBuffer.clear(); readBuffer = newBuffer; } - - public void send(final SentBody body) { + + public void send(final Protobufable body) { - bossExecutor.execute(new Runnable() { + if(!isConnected()) { + return; + } + + workerExecutor.execute(new Runnable() { @Override public void run() { - boolean isSuccessed = false; - String exceptionName = SessionClosedException.class.getSimpleName(); - if (isConnected()) { + int result = 0; + try { - try { - ByteBuffer buffer = messageEncoder.encode(body); - int result = 0; - while(buffer.hasRemaining()){ - result += socketChannel.write(buffer); - } - isSuccessed = result > 0; - } catch (IOException e) { - exceptionName = e.getClass().getSimpleName(); - closeSession(); + semaphore.acquire(); + + ByteBuffer buffer = messageEncoder.encode(body); + while(buffer.hasRemaining()){ + result += socketChannel.write(buffer); } - } - - if (!isSuccessed) { - Intent intent = new Intent(); - intent.setAction(CIMConstant.IntentAction.ACTION_SENT_FAILED); - intent.putExtra(Exception.class.getName(), exceptionName); - intent.putExtra(SentBody.class.getName(), body); - sendBroadcast(intent); - }else { - messageSent(body); - } + } catch (Exception e) { + result = -1; + }finally { + + semaphore.release(); + + if(result <= 0) { + closeSession(); + }else { + messageSent(body); + } + } } }); - } - - - public void send(final HeartbeatResponse body) { - - bossExecutor.execute(new Runnable() { - @Override - public void run() { - try { - socketChannel.write(messageEncoder.encode(body)); - messageSent(body); - } catch (IOException ignore) { - closeSession(); - } - } - }); - - } - + public void sessionCreated() { @@ -311,7 +290,7 @@ class CIMConnectorManager { Intent intent = new Intent(); intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_SUCCESSED); sendBroadcast(intent); - + } public void sessionClosed() { @@ -324,8 +303,6 @@ class CIMConnectorManager { readBuffer = ByteBuffer.allocate(READ_BUFFER_SIZE); } - closeSelector(); - Intent intent = new Intent(); intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_CLOSED); sendBroadcast(intent); @@ -373,10 +350,7 @@ class CIMConnectorManager { } public void destroy() { - closeSession(); - closeSelector(); - } public boolean isConnected() { @@ -384,6 +358,11 @@ class CIMConnectorManager { } public void closeSession() { + + if(!isConnected()) { + return; + } + try { socketChannel.close(); } catch (IOException ignore) { @@ -391,13 +370,7 @@ class CIMConnectorManager { this.sessionClosed(); } } - - public void closeSelector() { - try { - selector.close(); - } catch (IOException ignore) {} - } - + private void sendBroadcast(final Intent intent) { eventExecutor.execute(new Runnable() { diff --git a/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/CIMEventBroadcastReceiver.java b/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/CIMEventBroadcastReceiver.java index 9975310..ee0665b 100644 --- a/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/CIMEventBroadcastReceiver.java +++ b/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/CIMEventBroadcastReceiver.java @@ -26,7 +26,6 @@ import java.util.Timer; import java.util.TimerTask; import com.farsunset.cim.sdk.client.constant.CIMConstant; -import com.farsunset.cim.sdk.client.exception.SessionClosedException; import com.farsunset.cim.sdk.client.model.Intent; import com.farsunset.cim.sdk.client.model.Message; import com.farsunset.cim.sdk.client.model.ReplyBody; @@ -90,14 +89,6 @@ public class CIMEventBroadcastReceiver { listener.onReplyReceived((ReplyBody) intent.getExtra(ReplyBody.class.getName())); } - /* - * 获取sendbody发送失败事件 - */ - if (intent.getAction().equals(CIMConstant.IntentAction.ACTION_SENT_FAILED)) { - onSentFailed((Exception) intent.getExtra(Exception.class.getName()), - (SentBody) intent.getExtra(SentBody.class.getName())); - } - /* * 获取sendbody发送成功事件 */ @@ -158,19 +149,7 @@ public class CIMEventBroadcastReceiver { private boolean isForceOfflineMessage(String action) { return CIMConstant.MessageAction.ACTION_999.equals(action); } - - private void onSentFailed(Exception e, SentBody body) { - - e.printStackTrace(); - // 与服务端端开链接,重新连接 - if (e instanceof SessionClosedException) { - CIMPushManager.connect(); - } else { - // 发送失败 重新发送 - CIMPushManager.sendRequest(body); - } - - } + private void onSentSucceed(SentBody body) { } diff --git a/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/coder/CIMLogger.java b/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/coder/CIMLogger.java index 609c732..66baa18 100644 --- a/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/coder/CIMLogger.java +++ b/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/coder/CIMLogger.java @@ -21,7 +21,6 @@ */ package com.farsunset.cim.sdk.client.coder; -import java.io.IOException; import java.nio.channels.SocketChannel; import org.slf4j.Logger; @@ -83,6 +82,7 @@ public class CIMLogger { public void connectState(boolean isConnected,boolean isManualStop,boolean isDestroyed) { LOGGER.debug("CONNECTED:" + isConnected + " STOPED:"+isManualStop+ " DESTROYED:"+isDestroyed); } + private String getSessionInfo(SocketChannel session) { StringBuilder builder = new StringBuilder(); if (session == null) { @@ -92,24 +92,23 @@ public class CIMLogger { builder.append("id:").append(session.hashCode()); try { - if (session.getLocalAddress() != null) { - builder.append(" L:").append(session.getLocalAddress().toString()); + if (session.socket().getLocalAddress() != null) { + builder.append(" L:").append(session.socket().getLocalAddress()+":"+session.socket().getLocalPort()); } - } catch (IOException e) { - e.printStackTrace(); + } catch (Exception ignore) { } try { - if (session.getRemoteAddress() != null) { - builder.append(" R:").append(session.getRemoteAddress().toString()); + if (session.socket().getRemoteSocketAddress() != null) { + builder.append(" R:").append(session.socket().getRemoteSocketAddress().toString()); } - } catch (IOException e) { - e.printStackTrace(); + } catch (Exception ignore) { } builder.append("]"); return builder.toString(); } + } diff --git a/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/constant/CIMConstant.java b/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/constant/CIMConstant.java index 657ef97..a25b2df 100644 --- a/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/constant/CIMConstant.java +++ b/cim-client-sdk/cim-java-sdk/src/com/farsunset/cim/sdk/client/constant/CIMConstant.java @@ -87,9 +87,6 @@ public interface CIMConstant { // 消息广播action String ACTION_MESSAGE_RECEIVED = "com.farsunset.cim.MESSAGE_RECEIVED"; - // 发送sendbody失败广播 - String ACTION_SENT_FAILED = "com.farsunset.cim.SENT_FAILED"; - // 发送sendbody成功广播 String ACTION_SENT_SUCCESSED = "com.farsunset.cim.SENT_SUCCESSED"; diff --git a/cim-use-examples/cim-client-android/app/libs/cim-android-sdk-3.7.0.jar b/cim-use-examples/cim-client-android/app/libs/cim-android-sdk-3.7.0.jar index 60201759f866b0cd812470589f5453d8eca598eb..d3328ad6f39d55d92bfa794b6b7b7e905a72bfa3 100644 GIT binary patch delta 19655 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 B*lPd) delta 19340 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 TBKaYl5Y7iM@ug`nr=0%-Ef;_d diff --git a/cim-use-examples/cim-client-java/lib/cim-java-sdk-3.7.0.jar b/cim-use-examples/cim-client-java/lib/cim-java-sdk-3.7.0.jar index 2be9b1df32b3affeab883428ec4b1bae4b7f4b6f..e9d88de70952b9dd5965b2cfc012f7c8a8c18b09 100644 GIT binary patch delta 16816 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