From 704a7434b0494e84a578d719daacb72f995b2ad2 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期一, 30 十二月 2019 17:43:17 +0800 Subject: [PATCH] Merge branch 'master' of https://gitee.com/endian11/DriveJudge --- im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java | 296 ++++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 220 insertions(+), 76 deletions(-) diff --git a/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java b/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java index 3cec3b8..73332d6 100644 --- a/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java +++ b/im_lib/src/main/java/com/anyun/im_lib/netty/NettyTcpClient.java @@ -12,9 +12,13 @@ import com.anyun.im_lib.listener.IMSConnectStatusCallback; import com.anyun.im_lib.listener.OnEventListener; +import java.nio.ByteBuffer; import java.util.Vector; +import java.util.function.ToDoubleBiFunction; import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; import io.netty.channel.Channel; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; @@ -149,72 +153,8 @@ } } - private class ResetConnectRunnable implements Runnable{ - private boolean isFirst; - public ResetConnectRunnable(boolean isFirst) { - this.isFirst = isFirst; - } - @Override - public void run() { - if (!isFirst){ - onConnectStatusCallback(IMSConfig.CONNECT_STATE_FAILURE); - } - try { - //閲嶈繛鏃讹紝閲婃斁宸ヤ綔缁勭嚎绋嬫睜锛屼篃灏辨槸鍋滄蹇冭烦 - loopGroup.destroyWorkLoopGroup(); - while (!isClosed){ - if (!isNetworkAvaliable()){ - try { - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - continue; - } - //缃戠粶鍙敤鎵嶈繘琛岃繛鎺� - int status; - if ((status=reConnect()) == IMSConfig.CONNECT_STATE_SUCCESSFUL){ - onConnectStatusCallback(status); - //杩炴帴鎴愬姛锛岃皟鍑哄惊鐜� - break; - } - if (status == IMSConfig.CONNECT_STATE_FAILURE){ - onConnectStatusCallback(status); - try { - Thread.sleep(IMSConfig.DEFAULT_RECONNECT_INTERVAL); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - } finally { - //鏍囪瘑閲嶈繛浠诲姟鍋滄 - isReconnecting = false; - } - } - } - - /** - * 閲嶈繛锛岄娆¤繛鎺ヤ篃璁や负鏄涓�娆¢噸杩� - * @return - */ - private int reConnect() { - if (!isClosed){ - try { - //鍏堥噴鏀綞ventLoop绾跨▼缁� - if (bootstrap != null){ - bootstrap.group().shutdownGracefully(); - } - } finally { - bootstrap = null; - } - initBootstrap(); - return connectServer(); - } - return IMSConfig.CONNECT_STATE_FAILURE; - } /*** * 鍒濆鍖朆ootstrap @@ -225,19 +165,29 @@ bootstrap.group(loopGroup).channel(NioSocketChannel.class); // 璁剧疆璇ラ」浠ュ悗锛屽鏋滃湪涓ゅ皬鏃跺唴娌℃湁鏁版嵁閫氫俊鏃讹紝TCP浼氳嚜鍔ㄥ彂閫佷竴涓椿鍔ㄦ帰娴嬫暟鎹姤鏂� bootstrap.option(ChannelOption.SO_KEEPALIVE,true); + //璁剧疆绂佺敤nagle绠楁硶 + bootstrap.option(ChannelOption.TCP_NODELAY,true); bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS,getConnectTimeout()); bootstrap.handler(new TCPChannelInitializerHandler(this)); } - private int connectServer(){ - if (serverUrlList == null || serverUrlList.size() == 0){ - return IMSConfig.CONNECT_STATE_FAILURE; - } - for (int i = 0; i < serverUrlList.size(); i++) { - String serverUrl = serverUrlList.get(i); - if (TextUtils.isEmpty(serverUrl)){ - return IMSConfig.CONNECT_STATE_FAILURE; + + /** + * 鐪熸杩炴帴鏈嶅姟鍣ㄧ殑鍦版柟 + */ + private void toServer() { + try { + channel = bootstrap.connect(currentHost,currentPort).sync().channel(); + } catch (Exception e) { + Log.i(TAG, String.format("杩炴帴Server(ip[%s],port[%d]澶辫触)",currentHost,currentPort)); + try { + Thread.sleep(500); + } catch (InterruptedException ex) { + ex.printStackTrace(); } + + + channel = null; } } @@ -248,9 +198,46 @@ return false; } + /** + * 鍥炶皟ims杩炴帴鐘舵�� + * @param connectStateConnecting + */ private void onConnectStatusCallback(int connectStateConnecting) { + this.connectStatus = connectStateConnecting; + switch (connectStatus){ + case IMSConfig.CONNECT_STATE_CONNECTING: + Log.i(TAG, "onConnectStatusCallback: ims杩炴帴涓�..."); + if (imsConnectStatusCallback != null){ + imsConnectStatusCallback.onConnecting(); + } + break; + case IMSConfig.CONNECT_STATE_SUCCESSFUL: + Log.i(TAG, String.format("onConnectStatusCallback: ims杩炴帴鎴愬姛锛宧ost[%s],port[%s]",currentHost,currentPort)); + if (imsConnectStatusCallback != null){ + imsConnectStatusCallback.onConnected(); + } + // TODO: 2019/12/12 杩炴帴鎴愬姛 锛屽彂閫佹彙鎵嬫秷鎭紙闇�瑕佺殑璇濃�斺�旓級 + try { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.ioBuffer(); + byteBuf.writeBytes(mOnEventListener.getRegisterMessage()); + channel.writeAndFlush(byteBuf); + } catch (Exception e) { + Log.i(TAG, "鍙戦�佹秷鎭け璐ワ紝reason="+e.getMessage()+"\t"); + } + break; + case IMSConfig.CONNECT_STATE_FAILURE: + default: + Log.i(TAG, "onConnectStatusCallback: ims杩炴帴澶辫触"); + if (imsConnectStatusCallback != null){ + imsConnectStatusCallback.onConnectFailed(); + } + break; + } } + /** + * 鍏抽棴杩炴帴锛屽悓鏃堕噴鏀捐祫婧� + */ @Override public void close() { if (isClosed){ @@ -323,22 +310,51 @@ @Override public void sendMsg(String msg) { - + this.sendMsg(msg,true); } + /** + * + * @param msg + * @param isJoinTimeoutManager 鏄惁鍔犲叆瓒呮椂绠$悊鍣� + */ @Override public void sendMsg(String msg, boolean isJoinTimeoutManager) { + if (msg==null ){ + return; + } + // TODO: 2019/12/12 鏍规嵁MSG_ID 鏉ュ姞鍏� 瓒呮椂锛� 鏆備笉鍐� + if (channel == null){ + Log.i(TAG, "sendMsg fail,channel涓虹┖"+msg); + } + try { + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.ioBuffer(); + byteBuf.writeBytes(msg.getBytes()); + channel.writeAndFlush(byteBuf); + } catch (Exception e) { + Log.i(TAG, "鍙戦�佹秷鎭け璐ワ紝reason="+e.getMessage()+"\t"+msg); + } } + /** + * 鑾峰彇瀹㈡埛璁剧疆鐨勯噸杩炴椂闀� + * @return + */ @Override public int getReconnectInterval() { - return 0; + if (mOnEventListener != null && mOnEventListener.getReConnectInterval()>0){ + return reconnectInterval = mOnEventListener.getReConnectInterval(); + } + return reconnectInterval; } @Override public int getConnectTimeout() { - return 0; + if(mOnEventListener != null && mOnEventListener.getConnectTimeout()>0){ + connectTimeOut = mOnEventListener.getConnectTimeout(); + } + return connectTimeOut; } @Override @@ -368,11 +384,139 @@ @Override public MsgDispatcher getMsgDispatcher() { - return null; + return msgDispatcher; } @Override public MsgTimeOutTimerManager getMsgTimeOutTimerManager() { + return msgTimeOutTimerManager; + } + + @Override + public byte[] getRegisterMessage() { + if (mOnEventListener != null){ + return mOnEventListener.getRegisterMessage(); + } return null; } + + + /** + * 閲嶈繛浠诲姟 + */ + private class ResetConnectRunnable implements Runnable{ + private boolean isFirst; + public ResetConnectRunnable(boolean isFirst) { + this.isFirst = isFirst; + } + + @Override + public void run() { + Log.i(TAG, "鎵ц閲嶈繛浠诲姟"); + if (!isFirst){ + onConnectStatusCallback(IMSConfig.CONNECT_STATE_FAILURE); + } + try { + //閲嶈繛鏃讹紝閲婃斁宸ヤ綔缁勭嚎绋嬫睜锛屼篃灏辨槸鍋滄蹇冭烦 + loopGroup.destroyWorkLoopGroup(); + while (!isClosed){ + if (!isNetworkAvaliable()){ + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + continue; + } + //缃戠粶鍙敤鎵嶈繘琛岃繛鎺� + int status; + if ((status=reConnect()) == IMSConfig.CONNECT_STATE_SUCCESSFUL){ + onConnectStatusCallback(status); + //杩炴帴鎴愬姛锛岃皟鍑哄惊鐜� + break; + } + + if (status == IMSConfig.CONNECT_STATE_FAILURE){ + onConnectStatusCallback(status); + try { + Thread.sleep(IMSConfig.DEFAULT_RECONNECT_INTERVAL); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } finally { + //鏍囪瘑閲嶈繛浠诲姟鍋滄 + isReconnecting = false; + } + } + + /** + * 閲嶈繛锛岄娆¤繛鎺ヤ篃璁や负鏄涓�娆¢噸杩� + * @return + */ + private int reConnect() { + if (!isClosed){ + try { + //鍏堥噴鏀綞ventLoop绾跨▼缁� + if (bootstrap != null){ + bootstrap.group().shutdownGracefully(); + } + } finally { + bootstrap = null; + } + initBootstrap(); + return connectServer(); + } + return IMSConfig.CONNECT_STATE_FAILURE; + } + + private int connectServer(){ + //鏈嶅姟鍣ㄥ湴鍧�鏃犳晥锛岀洿鎺ュ洖璋冭繛鎺ョ姸鎬侊紝涓嶅啀杩涜杩炴帴 + if (serverUrlList == null || serverUrlList.size() == 0){ + return IMSConfig.CONNECT_STATE_FAILURE; + } + for (int i = 0; i < serverUrlList.size(); i++) { + String serverUrl = serverUrlList.get(i); + //鏈嶅姟鍣ㄥ湴鍧�鏃犳晥锛岀洿鎺ュ洖璋冭繛鎺ョ姸鎬侊紝涓嶅啀杩涜杩炴帴 + if (TextUtils.isEmpty(serverUrl)){ + return IMSConfig.CONNECT_STATE_FAILURE; + } + String[] address = serverUrl.split(" "); + for (int j = 1; j <= IMSConfig.DEFAULT_RECONNECT_COUNT; j++) { + //濡傛灉ims宸茬粡鍏抽棴锛屾垨缃戠粶涓嶅彲鐢紝鐩存帴鍥炶皟杩炴帴鐘舵�侊紝涓嶅啀杩涜杩炴帴 + if (isClosed || !isNetworkAvaliable()){ + return IMSConfig.CONNECT_STATE_FAILURE; + } + //鍥炶皟杩炴帴鐘舵�� + if(connectStatus != IMSConfig.CONNECT_STATE_CONNECTING){ + onConnectStatusCallback(IMSConfig.CONNECT_STATE_CONNECTING); + } + Log.i(TAG, String.format("姝e湪杩涜connectServer銆�%s銆戠殑绗琜%d]杩炴帴锛屽綋鍓嶉噸杩炲欢鏃舵椂闀夸负[%dms]: ",serverUrl,j,j*getReconnectInterval())); + try { + currentPort = Integer.parseInt(address[1]); + currentHost = address[0]; + //杩炴帴鏈嶅姟鍣� + toServer(); + //channel涓嶄负绌猴紝鍒欒涓鸿繛鎺ュ凡缁忔垚鍔� + if(channel != null){ + return IMSConfig.CONNECT_STATE_SUCCESSFUL; + }else{ + Thread.sleep(j*getReconnectInterval()); + } + } catch (InterruptedException e) { + e.printStackTrace(); + close(); + break; + } + } + } + return IMSConfig.CONNECT_STATE_FAILURE; + } + + } + + + + } -- Gitblit v1.8.0