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