diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar
index 874ccc4..d0b8490 100644
Binary files a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar and b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar differ
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.md5 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.md5
index b673270..9be8141 100644
--- a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.md5
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.md5
@@ -1 +1 @@
-72f35014c22dcbfefb5ead739964975c
\ No newline at end of file
+4cec5fa9bfdf46b27bf0f92d5fc1e0c0
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha1 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha1
index 991c0d6..b9cb412 100644
--- a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha1
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha1
@@ -1 +1 @@
-eb25fc6ecec221cfb5f46d6804366ed0a49417f0
\ No newline at end of file
+8871f573ae5c19bbc5aa201471550587db204a50
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha256 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha256
index 2eb3de3..17c9b43 100644
--- a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha256
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha256
@@ -1 +1 @@
-21dabdaa369dad1fe075c88136c9520f1009b7d7867b4abdc5471ccf9571059d
\ No newline at end of file
+b91dd2bb576fa13822fcfb913eb376a75a4c44fb3532bcc32f6ef55dacf1df7d
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha512 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha512
index 5087261..fb14159 100644
--- a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha512
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.1/WKIMLib_loca-1.0.1.aar.sha512
@@ -1 +1 @@
-5dcb35c9ef5e3380f55956f83da6bf5c92a3da3edaf69be371466510578a77f29e0efe377fe11c3c5472188b067b2e83683747a3b4408a9fc953eaa1b7cee2be
\ No newline at end of file
+cdfb6e0fe8c3d76a5da917346f2cf502b6958238fb136dc3badc9b26d9612b249477a2cabac267265dc07cd425b80103c8acf57baaebfd03aa80215c9a67e049
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar
new file mode 100644
index 0000000..2ed920c
Binary files /dev/null and b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar differ
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.md5 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.md5
new file mode 100644
index 0000000..9b53df2
--- /dev/null
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.md5
@@ -0,0 +1 @@
+a811ccc79ea28ce25f32df13d58450d0
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.sha1 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.sha1
new file mode 100644
index 0000000..4580447
--- /dev/null
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.sha1
@@ -0,0 +1 @@
+84a98cd67120c6bf427fe06bf1122bf9ad9eb343
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.sha256 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.sha256
new file mode 100644
index 0000000..cfb8bf1
--- /dev/null
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.sha256
@@ -0,0 +1 @@
+a02b43e21138332b7eb0213a91a1411ee6235ff29ae89cc4d33978a7ef08d4be
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.sha512 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.sha512
new file mode 100644
index 0000000..635ef55
--- /dev/null
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.aar.sha512
@@ -0,0 +1 @@
+0e160dd8c66ec6f486f66151ae954b2fbdf5b198a9ed969cc4dd48c575db03b23ff8e65ff3fd2c950042fe749d5c68aef27348f70884fcf485cbb5a33bc392ba
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom
new file mode 100644
index 0000000..a26b83c
--- /dev/null
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom
@@ -0,0 +1,9 @@
+
+
+ 4.0.0
+ com.xinbida.wukongim
+ WKIMLib_loca
+ 1.0.7
+ aar
+
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.md5 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.md5
new file mode 100644
index 0000000..6982b92
--- /dev/null
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.md5
@@ -0,0 +1 @@
+6498b4614db03e1905bf001469cf95fa
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.sha1 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.sha1
new file mode 100644
index 0000000..7044705
--- /dev/null
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.sha1
@@ -0,0 +1 @@
+ce43a2b1beb2ca1154356fa7a58990513fbfcaf5
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.sha256 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.sha256
new file mode 100644
index 0000000..2b56730
--- /dev/null
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.sha256
@@ -0,0 +1 @@
+2256a0f7a1909d270406d96d1bbee652f83f215d3594de4de1e4fc3153f1ba43
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.sha512 b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.sha512
new file mode 100644
index 0000000..d37f879
--- /dev/null
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/1.0.7/WKIMLib_loca-1.0.7.pom.sha512
@@ -0,0 +1 @@
+e0ba06d4ca0412ea3db840f193369a48db5fbc60eb0745042a35e96e3ccb8dad3acc3f09bec4dbcef7cee13806ea68d431ac28aceaa316f5168177039accf7b3
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml b/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml
index a815428..aa2bf7e 100644
--- a/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml
@@ -3,11 +3,12 @@
com.xinbida.wukongim
WKIMLib_loca
- 1.0.1
- 1.0.1
+ 1.0.7
+ 1.0.7
1.0.1
+ 1.0.7
- 20230823022239
+ 20230829073008
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.md5 b/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.md5
index 69308be..266da2f 100644
--- a/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.md5
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.md5
@@ -1 +1 @@
-78bcfc18b1a294860edba2e4b488ed1e
\ No newline at end of file
+b49f24f693949485c42489310069855c
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha1 b/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha1
index 1b36c5e..545a54f 100644
--- a/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha1
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha1
@@ -1 +1 @@
-e066d8085f791ea404c493fe8683c96f788643bf
\ No newline at end of file
+afdc20fb84ea50e9266c2fc71e828a54e4986b03
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha256 b/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha256
index 016358a..681d256 100644
--- a/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha256
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha256
@@ -1 +1 @@
-c35b0d1ac9132a9bca006c5263fa4bb120d0f36487e1a97c8bed3f57770c19af
\ No newline at end of file
+4154fb5d8b1d9905f6b41ee3f017fbf8546309ee40eedb31b159609390163e61
\ No newline at end of file
diff --git a/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha512 b/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha512
index 428bedc..6a90656 100644
--- a/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha512
+++ b/repository/com/xinbida/wukongim/WKIMLib_loca/maven-metadata.xml.sha512
@@ -1 +1 @@
-d798765fbd3a123f0cb55e233624263f43abe5f8a3dce892e6dd0a26d15967c2a2533d597fa407b72e4f1dc553b58af5bd0785de63f4d56c297b200ced63f5c5
\ No newline at end of file
+4c8e8bbaa6e68ee2a84da4bf15f5d4aa76419028283f37890c1fa98690d53365746d86c7aa54c76cb6a8c30e60707e6c2a236628bfe7cc887af8262e18da2fa8
\ No newline at end of file
diff --git a/wkim/build.gradle b/wkim/build.gradle
index aa3d534..3e23197 100644
--- a/wkim/build.gradle
+++ b/wkim/build.gradle
@@ -11,7 +11,7 @@ afterEvaluate {
afterEvaluate { artifact(tasks.getByName("bundleReleaseAar")) }
groupId = 'com.xinbida.wukongim'
artifactId = 'WKIMLib_loca'
- version = '1.0.1'
+ version = '1.0.7'
}
}
repositories {
diff --git a/wkim/proguard-rules.pro b/wkim/proguard-rules.pro
index cd5c5e5..8721b88 100644
--- a/wkim/proguard-rules.pro
+++ b/wkim/proguard-rules.pro
@@ -25,10 +25,7 @@
-keep class org.xsocket.** { *; }
-keep class javax.ws.rs.** { *; }
-keep class com.xinbida.wukongim.WKIM {*;}
--keep class com.xinbida.wukongim.protocol.WKMessageContent {*;}
--keep class com.xinbida.wukongim.protocol.WKMsgEntity {*;}
-keep class com.xinbida.wukongim.message.type.WKMsgContentType { *; }
--keep class com.xinbida.wukongim.entity.WKChannelType { *; }
-keep class com.xinbida.wukongim.message.type.WKSendMsgResult { *; }
-keep class com.xinbida.wukongim.message.type.WKConnectStatus { *; }
-keep class com.xinbida.wukongim.message.type.WKConnectReason { *; }
diff --git a/wkim/src/main/java/com/xinbida/wukongim/WKIM.java b/wkim/src/main/java/com/xinbida/wukongim/WKIM.java
index b0512bc..3a9a5a4 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/WKIM.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/WKIM.java
@@ -19,7 +19,7 @@ import com.xinbida.wukongim.utils.WKLoggerUtils;
* 5/20/21 5:25 PM
*/
public class WKIM {
- private final String Version = "V1.0.0";
+ private final String Version = "V1.0.7";
private WKIM() {
diff --git a/wkim/src/main/java/com/xinbida/wukongim/db/MsgDbManager.java b/wkim/src/main/java/com/xinbida/wukongim/db/MsgDbManager.java
index 1a8a3a8..ff60477 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/db/MsgDbManager.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/db/MsgDbManager.java
@@ -22,7 +22,7 @@ import com.xinbida.wukongim.entity.WKMsgSetting;
import com.xinbida.wukongim.interfaces.IGetOrSyncHistoryMsgBack;
import com.xinbida.wukongim.manager.MsgManager;
import com.xinbida.wukongim.message.type.WKSendMsgResult;
-import com.xinbida.wukongim.protocol.WKMessageContent;
+import com.xinbida.wukongim.msgmodel.WKMessageContent;
import com.xinbida.wukongim.utils.WKTypeUtils;
import org.json.JSONException;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsg.java b/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsg.java
index 28aa1ff..6a21cd5 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsg.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsg.java
@@ -7,7 +7,7 @@ import com.xinbida.wukongim.WKIM;
import com.xinbida.wukongim.manager.ChannelManager;
import com.xinbida.wukongim.manager.ChannelMembersManager;
import com.xinbida.wukongim.message.type.WKSendMsgResult;
-import com.xinbida.wukongim.protocol.WKMessageContent;
+import com.xinbida.wukongim.msgmodel.WKMessageContent;
import com.xinbida.wukongim.utils.DateUtils;
import org.json.JSONObject;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsgExtra.java b/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsgExtra.java
index b38edea..7f41ebd 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsgExtra.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsgExtra.java
@@ -3,7 +3,7 @@ package com.xinbida.wukongim.entity;
import android.os.Parcel;
import android.os.Parcelable;
-import com.xinbida.wukongim.protocol.WKMessageContent;
+import com.xinbida.wukongim.msgmodel.WKMessageContent;
public class WKMsgExtra implements Parcelable {
public String messageID;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsgSetting.java b/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsgSetting.java
index d562385..733a18a 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsgSetting.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/entity/WKMsgSetting.java
@@ -8,6 +8,8 @@ public class WKMsgSetting implements Parcelable {
public int receipt;
// 是否开启top
public int topic;
+ // 是否未流消息
+ public int stream;
public WKMsgSetting() {
}
@@ -15,6 +17,7 @@ public class WKMsgSetting implements Parcelable {
protected WKMsgSetting(Parcel in) {
receipt = in.readInt();
topic = in.readInt();
+ stream = in.readInt();
}
public static final Creator CREATOR = new Creator() {
@@ -38,5 +41,6 @@ public class WKMsgSetting implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(receipt);
dest.writeInt(topic);
+ dest.writeInt(stream);
}
}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/entity/WKSignalKey.java b/wkim/src/main/java/com/xinbida/wukongim/entity/WKSignalKey.java
deleted file mode 100644
index 83a6a08..0000000
--- a/wkim/src/main/java/com/xinbida/wukongim/entity/WKSignalKey.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.xinbida.wukongim.entity;
-
-public class WKSignalKey {
- public String UID;
- public int registrationID;
- public String identityKey;
- public int signedPreKeyID;
- public String signedPubKey;
- public String signedSignature;
- public WKOneTimePreKey oneTimePreKey;
-}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/entity/WKSignalProtocolData.java b/wkim/src/main/java/com/xinbida/wukongim/entity/WKSignalProtocolData.java
deleted file mode 100644
index bca74e7..0000000
--- a/wkim/src/main/java/com/xinbida/wukongim/entity/WKSignalProtocolData.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.xinbida.wukongim.entity;
-
-import java.util.List;
-
-public class WKSignalProtocolData {
- public byte channelType;
- public String channelID;
- public String identityKey;
- public int signedPreKeyID;
- public String signedPubKey;
- public String signedSignature;
- public int registrationID;
- public List oneTimePreKeyList;
-}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/entity/WKSyncRecentHeader.java b/wkim/src/main/java/com/xinbida/wukongim/entity/WKSyncRecentHeader.java
deleted file mode 100644
index 0eac904..0000000
--- a/wkim/src/main/java/com/xinbida/wukongim/entity/WKSyncRecentHeader.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.xinbida.wukongim.entity;
-
-/**
- * 2020-10-09 15:12
- * 最近消息
- */
-public class WKSyncRecentHeader {
- public int no_persist;
- public int red_dot;
- public int sync_once;
-}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/interfaces/ICryptoSignalData.java b/wkim/src/main/java/com/xinbida/wukongim/interfaces/ICryptoSignalData.java
deleted file mode 100644
index ec317b9..0000000
--- a/wkim/src/main/java/com/xinbida/wukongim/interfaces/ICryptoSignalData.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.xinbida.wukongim.interfaces;
-
-public interface ICryptoSignalData {
- void getChannelSignalData(String channelID, byte channelTyp, ICryptoSignalDataResult iCryptoSignalDataResult);
-}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/interfaces/ICryptoSignalDataResult.java b/wkim/src/main/java/com/xinbida/wukongim/interfaces/ICryptoSignalDataResult.java
deleted file mode 100644
index e237714..0000000
--- a/wkim/src/main/java/com/xinbida/wukongim/interfaces/ICryptoSignalDataResult.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.xinbida.wukongim.interfaces;
-
-import com.xinbida.wukongim.entity.WKSignalKey;
-
-public interface ICryptoSignalDataResult {
- void onResult(WKSignalKey signalKey);
-}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/interfaces/IReceivedMsgListener.java b/wkim/src/main/java/com/xinbida/wukongim/interfaces/IReceivedMsgListener.java
index 677a618..c6d8247 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/interfaces/IReceivedMsgListener.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/interfaces/IReceivedMsgListener.java
@@ -21,7 +21,7 @@ public interface IReceivedMsgListener {
/**
* 心跳消息
*/
- void heartbeatMsg(WKPongMsg msgHeartbeat);
+ void pongMsg(WKPongMsg pongMsg);
/**
* 被踢消息
@@ -35,13 +35,6 @@ public interface IReceivedMsgListener {
*/
void sendAckMsg(WKSendAckMsg sendAckMsg);
- /**
- * 聊天消息
- *
- * @param msg 消息对象
- */
- void receiveMsg(WKMsg msg);
-
/**
* 重连
*/
diff --git a/wkim/src/main/java/com/xinbida/wukongim/interfaces/IUploadAttacResultListener.java b/wkim/src/main/java/com/xinbida/wukongim/interfaces/IUploadAttacResultListener.java
index 362f486..4d7344f 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/interfaces/IUploadAttacResultListener.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/interfaces/IUploadAttacResultListener.java
@@ -1,7 +1,7 @@
package com.xinbida.wukongim.interfaces;
-import com.xinbida.wukongim.protocol.WKMessageContent;
+import com.xinbida.wukongim.msgmodel.WKMessageContent;
/**
* 2019-11-10 16:12
diff --git a/wkim/src/main/java/com/xinbida/wukongim/manager/ConnectionManager.java b/wkim/src/main/java/com/xinbida/wukongim/manager/ConnectionManager.java
index 7fcad80..1a29666 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/manager/ConnectionManager.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/manager/ConnectionManager.java
@@ -6,7 +6,7 @@ import com.xinbida.wukongim.WKIM;
import com.xinbida.wukongim.WKIMApplication;
import com.xinbida.wukongim.interfaces.IConnectionStatus;
import com.xinbida.wukongim.interfaces.IGetIpAndPort;
-import com.xinbida.wukongim.message.ConnectionHandler;
+import com.xinbida.wukongim.message.WKConnection;
import com.xinbida.wukongim.message.MessageHandler;
import com.xinbida.wukongim.utils.WKLoggerUtils;
@@ -37,11 +37,12 @@ public class ConnectionManager extends BaseManager {
// 连接
public void connection() {
if (TextUtils.isEmpty(WKIMApplication.getInstance().getToken()) || TextUtils.isEmpty(WKIMApplication.getInstance().getUid())) {
- throw new NullPointerException("连接UID和Token不能为空");
+ WKLoggerUtils.getInstance().d("未初始化uid和token");
+ return;
}
WKIMApplication.getInstance().isCanConnect = true;
- if (ConnectionHandler.getInstance().connectionIsNull()) {
- ConnectionHandler.getInstance().reconnection();
+ if (WKConnection.getInstance().connectionIsNull()) {
+ WKConnection.getInstance().reconnection();
}
}
@@ -61,7 +62,7 @@ public class ConnectionManager extends BaseManager {
*/
private void stopConnect() {
WKIMApplication.getInstance().isCanConnect = false;
- ConnectionHandler.getInstance().stopAll();
+ WKConnection.getInstance().stopAll();
}
/**
@@ -74,7 +75,7 @@ public class ConnectionManager extends BaseManager {
WKIMApplication.getInstance().setToken("");
MessageHandler.getInstance().updateLastSendingMsgFail();
- ConnectionHandler.getInstance().stopAll();
+ WKConnection.getInstance().stopAll();
WKIM.getInstance().getChannelManager().clearARMCache();
WKIMApplication.getInstance().closeDbHelper();
}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/manager/MsgManager.java b/wkim/src/main/java/com/xinbida/wukongim/manager/MsgManager.java
index 155027d..bde6ed2 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/manager/MsgManager.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/manager/MsgManager.java
@@ -38,7 +38,7 @@ import com.xinbida.wukongim.interfaces.ISyncOfflineMsgListener;
import com.xinbida.wukongim.interfaces.IUploadAttacResultListener;
import com.xinbida.wukongim.interfaces.IUploadAttachmentListener;
import com.xinbida.wukongim.interfaces.IUploadMsgExtraListener;
-import com.xinbida.wukongim.message.ConnectionHandler;
+import com.xinbida.wukongim.message.WKConnection;
import com.xinbida.wukongim.message.MessageHandler;
import com.xinbida.wukongim.message.type.WKMsgContentType;
import com.xinbida.wukongim.message.type.WKSendMsgResult;
@@ -47,8 +47,8 @@ import com.xinbida.wukongim.msgmodel.WKReply;
import com.xinbida.wukongim.msgmodel.WKTextContent;
import com.xinbida.wukongim.msgmodel.WKVideoContent;
import com.xinbida.wukongim.msgmodel.WKVoiceContent;
-import com.xinbida.wukongim.protocol.WKMessageContent;
-import com.xinbida.wukongim.protocol.WKMsgEntity;
+import com.xinbida.wukongim.msgmodel.WKMessageContent;
+import com.xinbida.wukongim.msgmodel.WKMsgEntity;
import com.xinbida.wukongim.utils.DateUtils;
import com.xinbida.wukongim.utils.WKTypeUtils;
@@ -1193,11 +1193,11 @@ public class MsgManager extends BaseManager {
public void sendMessage(WKMessageContent messageContent, String channelID, byte channelType) {
- ConnectionHandler.getInstance().sendMessage(messageContent, channelID, channelType);
+ WKConnection.getInstance().sendMessage(messageContent, channelID, channelType);
}
public void sendMessage(WKMessageContent messageContent, WKMsgSetting setting, String channelID, byte channelType) {
- ConnectionHandler.getInstance().sendMessage(messageContent, setting, channelID, channelType);
+ WKConnection.getInstance().sendMessage(messageContent, setting, channelID, channelType);
}
/**
@@ -1206,7 +1206,7 @@ public class MsgManager extends BaseManager {
* @param msg 消息对象
*/
public void sendMessage(WKMsg msg) {
- ConnectionHandler.getInstance().sendMessage(msg);
+ WKConnection.getInstance().sendMessage(msg);
}
public String createClientMsgNO() {
diff --git a/wkim/src/main/java/com/xinbida/wukongim/message/ClientHandler.java b/wkim/src/main/java/com/xinbida/wukongim/message/ConnectionClient.java
similarity index 77%
rename from wkim/src/main/java/com/xinbida/wukongim/message/ClientHandler.java
rename to wkim/src/main/java/com/xinbida/wukongim/message/ConnectionClient.java
index 7e0b034..87f41ca 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/message/ClientHandler.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/message/ConnectionClient.java
@@ -21,43 +21,43 @@ import java.nio.BufferUnderflowException;
* 2020-12-18 10:28
* 连接客户端
*/
-class ClientHandler implements IDataHandler, IConnectHandler,
+class ConnectionClient implements IDataHandler, IConnectHandler,
IDisconnectHandler, IConnectExceptionHandler,
IConnectionTimeoutHandler, IIdleTimeoutHandler {
private boolean isConnectSuccess;
- ClientHandler() {
+ ConnectionClient() {
isConnectSuccess = false;
}
@Override
public boolean onConnectException(INonBlockingConnection iNonBlockingConnection, IOException e) {
WKLoggerUtils.getInstance().e("连接异常");
- ConnectionHandler.getInstance().forcedReconnection();
+ WKConnection.getInstance().forcedReconnection();
close(iNonBlockingConnection);
return true;
}
@Override
public boolean onConnect(INonBlockingConnection iNonBlockingConnection) throws BufferUnderflowException {
- if (ConnectionHandler.getInstance().connection == null) {
+ if (WKConnection.getInstance().connection == null) {
Log.e("连接信息为空", "--->");
}
- if (ConnectionHandler.getInstance().connection != null && iNonBlockingConnection != null) {
- if (!ConnectionHandler.getInstance().connection.getId().equals(iNonBlockingConnection.getId())) {
+ if (WKConnection.getInstance().connection != null && iNonBlockingConnection != null) {
+ if (!WKConnection.getInstance().connection.getId().equals(iNonBlockingConnection.getId())) {
close(iNonBlockingConnection);
- ConnectionHandler.getInstance().forcedReconnection();
+ WKConnection.getInstance().forcedReconnection();
} else {
//连接成功
isConnectSuccess = true;
WKLoggerUtils.getInstance().e("连接成功");
- ConnectionHandler.getInstance().sendConnectMsg();
+ WKConnection.getInstance().sendConnectMsg();
}
} else {
close(iNonBlockingConnection);
WKLoggerUtils.getInstance().e("连接成功连接对象为空");
- ConnectionHandler.getInstance().forcedReconnection();
+ WKConnection.getInstance().forcedReconnection();
}
return false;
}
@@ -66,7 +66,7 @@ class ClientHandler implements IDataHandler, IConnectHandler,
public boolean onConnectionTimeout(INonBlockingConnection iNonBlockingConnection) {
if (!isConnectSuccess) {
WKLoggerUtils.getInstance().e("连接超时");
- ConnectionHandler.getInstance().forcedReconnection();
+ WKConnection.getInstance().forcedReconnection();
}
return true;
}
@@ -74,25 +74,29 @@ class ClientHandler implements IDataHandler, IConnectHandler,
@Override
public boolean onData(INonBlockingConnection iNonBlockingConnection) throws BufferUnderflowException {
Object id = iNonBlockingConnection.getAttachment();
- if (id != null) {
- if (!TextUtils.isEmpty(ConnectionHandler.getInstance().socketSingleID) && !ConnectionHandler.getInstance().socketSingleID.equals(id)) {
+ if (id instanceof String) {
+ if (id.toString().startsWith("close")){
+ return true;
+ }
+ if (!TextUtils.isEmpty(WKConnection.getInstance().socketSingleID) && !WKConnection.getInstance().socketSingleID.equals(id)) {
WKLoggerUtils.getInstance().e("收到的消息ID和连接的ID对应不上---");
try {
iNonBlockingConnection.close();
- ConnectionHandler.getInstance().connection.close();
+ if (WKConnection.getInstance().connection != null) {
+ WKConnection.getInstance().connection.close();
+ }
} catch (IOException e) {
e.printStackTrace();
}
-
- ConnectionHandler.getInstance().forcedReconnection();
+ if (WKIMApplication.getInstance().isCanConnect) {
+ WKConnection.getInstance().forcedReconnection();
+ }
return true;
}
}
int available_len;
-// byte[] available_bytes = null;
int bufLen = 102400;
try {
-
available_len = iNonBlockingConnection.available();
if (available_len == -1) {
return true;
@@ -111,7 +115,7 @@ class ClientHandler implements IDataHandler, IConnectHandler,
}
byte[] buffBytes = iNonBlockingConnection.readBytesByLength(readLen);
if (buffBytes.length > 0) {
- ConnectionHandler.getInstance().receivedData(buffBytes);
+ WKConnection.getInstance().receivedData(buffBytes);
}
}
@@ -137,7 +141,7 @@ class ClientHandler implements IDataHandler, IConnectHandler,
}
}
if (WKIMApplication.getInstance().isCanConnect) {
- ConnectionHandler.getInstance().forcedReconnection();
+ WKConnection.getInstance().forcedReconnection();
} else {
WKLoggerUtils.getInstance().e("不能重连-->");
}
@@ -149,7 +153,7 @@ class ClientHandler implements IDataHandler, IConnectHandler,
public boolean onIdleTimeout(INonBlockingConnection iNonBlockingConnection) {
if (!isConnectSuccess) {
WKLoggerUtils.getInstance().e("Idle连接超时");
- ConnectionHandler.getInstance().forcedReconnection();
+ WKConnection.getInstance().forcedReconnection();
close(iNonBlockingConnection);
}
return true;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/message/MessageConvertHandler.java b/wkim/src/main/java/com/xinbida/wukongim/message/MessageConvertHandler.java
deleted file mode 100644
index 8f7e496..0000000
--- a/wkim/src/main/java/com/xinbida/wukongim/message/MessageConvertHandler.java
+++ /dev/null
@@ -1,609 +0,0 @@
-package com.xinbida.wukongim.message;
-
-import android.text.TextUtils;
-
-import com.xinbida.wukongim.WKIM;
-import com.xinbida.wukongim.WKIMApplication;
-import com.xinbida.wukongim.db.MsgDbManager;
-import com.xinbida.wukongim.db.WKDBColumns;
-import com.xinbida.wukongim.entity.WKConversationMsgExtra;
-import com.xinbida.wukongim.entity.WKMsg;
-import com.xinbida.wukongim.entity.WKMsgSetting;
-import com.xinbida.wukongim.entity.WKUIConversationMsg;
-import com.xinbida.wukongim.message.type.WKMsgType;
-import com.xinbida.wukongim.message.type.WKSendMsgResult;
-import com.xinbida.wukongim.msgmodel.WKMediaMessageContent;
-import com.xinbida.wukongim.protocol.WKBaseMsg;
-import com.xinbida.wukongim.protocol.WKConnectAckMsg;
-import com.xinbida.wukongim.protocol.WKConnectMsg;
-import com.xinbida.wukongim.protocol.WKDisconnectMsg;
-import com.xinbida.wukongim.protocol.WKMessageContent;
-import com.xinbida.wukongim.protocol.WKMsgEntity;
-import com.xinbida.wukongim.protocol.WKPingMsg;
-import com.xinbida.wukongim.protocol.WKPongMsg;
-import com.xinbida.wukongim.protocol.WKReceivedAckMsg;
-import com.xinbida.wukongim.protocol.WKReceivedMsg;
-import com.xinbida.wukongim.protocol.WKSendAckMsg;
-import com.xinbida.wukongim.protocol.WKSendMsg;
-import com.xinbida.wukongim.utils.BigTypeUtils;
-import com.xinbida.wukongim.utils.CryptoUtils;
-import com.xinbida.wukongim.utils.WKLoggerUtils;
-import com.xinbida.wukongim.utils.WKTypeUtils;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * 5/21/21 11:28 AM
- * 收发消息转换
- */
-class MessageConvertHandler {
-
- private MessageConvertHandler() {
- }
-
- private static class MessageConvertHandlerBinder {
- static final MessageConvertHandler msgConvert = new MessageConvertHandler();
- }
-
- public static MessageConvertHandler getInstance() {
- return MessageConvertHandlerBinder.msgConvert;
- }
-
- byte[] enConnectMsg(WKConnectMsg connectMsg) {
- int remainingLength = connectMsg.getFixedHeaderLength()
- + connectMsg.deviceIDLength
- + connectMsg.deviceID.length()
- + connectMsg.uidLength
- + WKIMApplication.getInstance().getUid().length()
- + connectMsg.tokenLength
- + WKIMApplication.getInstance().getToken().length()
- + connectMsg.clientTimeStampLength
- + connectMsg.clientKeyLength
- + CryptoUtils.getInstance().getPublicKey().length();
-
- byte[] remainingBytes = WKTypeUtils.getInstance().getRemainingLengthByte(remainingLength);
- int totalLen = 1 + remainingBytes.length
- + connectMsg.protocolVersionLength
- + connectMsg.deviceFlagLength
- + connectMsg.deviceIDLength
- + connectMsg.deviceID.length()
- + connectMsg.uidLength
- + WKIMApplication.getInstance().getUid().length()
- + connectMsg.tokenLength
- + WKIMApplication.getInstance().getToken().length()
- + connectMsg.clientTimeStampLength
- + connectMsg.clientKeyLength
- + CryptoUtils.getInstance().getPublicKey().length();
-
- byte[] bytes = new byte[totalLen];
- ByteBuffer buffer = ByteBuffer.allocate(totalLen).order(
- ByteOrder.BIG_ENDIAN);
- try {
- //固定头
- buffer.put(WKTypeUtils.getInstance().getHeader(connectMsg.packetType, connectMsg.flag, 0, 0));
- buffer.put(remainingBytes);
- buffer.put(connectMsg.protocolVersion);
- buffer.put(connectMsg.deviceFlag);
- buffer.putShort((short) connectMsg.deviceID.length());
- buffer.put(WKTypeUtils.getInstance().stringToByte(connectMsg.deviceID));
- buffer.putShort((short) WKIMApplication.getInstance().getUid().length());
- buffer.put(WKTypeUtils.getInstance().stringToByte(WKIMApplication.getInstance().getUid()));
- buffer.putShort((short) WKIMApplication.getInstance().getToken().length());
- buffer.put(WKTypeUtils.getInstance().stringToByte(WKIMApplication.getInstance().getToken()));
- buffer.putLong(connectMsg.clientTimestamp);
- buffer.putShort((short) CryptoUtils.getInstance().getPublicKey().length());
- buffer.put(WKTypeUtils.getInstance().stringToByte(CryptoUtils.getInstance().getPublicKey()));
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- buffer.position(0);
- buffer.get(bytes);
- return bytes;
- }
-
- synchronized byte[] enReceivedAckMsg(WKReceivedAckMsg receivedAckMsg) {
- byte[] remainingBytes = WKTypeUtils.getInstance().getRemainingLengthByte(8 + 4);
-
- int totalLen = 1 + remainingBytes.length + 8 + 4;
- byte[] bytes = new byte[totalLen];
- ByteBuffer buffer = ByteBuffer.allocate(totalLen).order(
- ByteOrder.BIG_ENDIAN);
- //固定头
- buffer.put(WKTypeUtils.getInstance().getHeader(receivedAckMsg.packetType, receivedAckMsg.no_persist ? 1 : 0, receivedAckMsg.red_dot ? 1 : 0, receivedAckMsg.sync_once ? 1 : 0));
- buffer.put(remainingBytes);
- BigInteger bigInteger = new BigInteger(receivedAckMsg.messageID);
- buffer.putLong(bigInteger.longValue());
- buffer.putInt(receivedAckMsg.messageSeq);
- buffer.position(0);
- buffer.get(bytes);
- return bytes;
- }
-
- byte[] enPingMsg(WKPingMsg pingMsg) {
- int totalLen = 1;
- byte[] bytes = new byte[totalLen];
- ByteBuffer buffer = ByteBuffer.allocate(totalLen).order(
- ByteOrder.BIG_ENDIAN);
- //固定头
- buffer.put(WKTypeUtils.getInstance().getHeader(pingMsg.packetType, pingMsg.flag, 0, 0));
- buffer.position(0);
- buffer.get(bytes);
- return bytes;
- }
-
- byte[] enSendMsg(WKSendMsg sendMsg) {
- // 先加密内容
- byte[] contentByte = CryptoUtils.getInstance().aesEncrypt(sendMsg.payload);
- String sendContent = CryptoUtils.getInstance().base64Encode(contentByte);
- String msgKey = sendMsg.clientSeq
- + sendMsg.clientMsgNo
- + sendMsg.channelId
- + sendMsg.channelType
- + sendContent;
- byte[] msgKeyByte = CryptoUtils.getInstance().aesEncrypt(msgKey);
- String msgKeyContent = CryptoUtils.getInstance().base64Encode(msgKeyByte);
- msgKeyContent = CryptoUtils.getInstance().digestMD5(msgKeyContent);
-
- int topicLen = 0;
- if (sendMsg.setting.topic == 1) {
- topicLen = sendMsg.topicID.length();
- topicLen += sendMsg.topicIDLength;
- }
- int remainingLength = sendMsg.settingLength
- + sendMsg.clientSeqLength
- + sendMsg.clientMsgNoLength + sendMsg.clientMsgNo.length()
- + sendMsg.channelIdLength + sendMsg.channelId.length()
- + sendMsg.channelTypeLength
- + sendMsg.msgKeyLength + msgKeyContent.length()
- + topicLen
- + sendContent.getBytes().length;
-
- byte[] remainingBytes = WKTypeUtils.getInstance().getRemainingLengthByte(remainingLength);
-
- int totalLen = 1 + remainingBytes.length
- + sendMsg.settingLength
- + sendMsg.clientSeqLength
- + sendMsg.clientMsgNoLength
- + sendMsg.clientMsgNo.length()
- + sendMsg.channelIdLength
- + sendMsg.channelId.length()
- + sendMsg.channelTypeLength
- + sendMsg.msgKeyLength
- + msgKeyContent.length()
- + topicLen
- + sendContent.getBytes().length;
-
- byte[] bytes = new byte[totalLen];
- ByteBuffer buffer = ByteBuffer.allocate(totalLen).order(
- ByteOrder.BIG_ENDIAN);
- try {
- //固定头
- buffer.put(WKTypeUtils.getInstance().getHeader(sendMsg.packetType, sendMsg.no_persist ? 1 : 0, sendMsg.red_dot ? 1 : 0, sendMsg.sync_once ? 1 : 0));
- buffer.put(remainingBytes);
- //消息设置
- buffer.put(WKTypeUtils.getInstance().getMsgSetting(sendMsg.setting));
-
- buffer.putInt(sendMsg.clientSeq);
- buffer.putShort((short) sendMsg.clientMsgNo.length());
- buffer.put(WKTypeUtils.getInstance().stringToByte(sendMsg.clientMsgNo));
- buffer.putShort((short) sendMsg.channelId.length());
- buffer.put(WKTypeUtils.getInstance().stringToByte(sendMsg.channelId));
- buffer.put(sendMsg.channelType);
- buffer.putShort((short) msgKeyContent.length());
- buffer.put(WKTypeUtils.getInstance().stringToByte(msgKeyContent));
- // 添加话题
- if (sendMsg.setting.topic == 1) {
- buffer.putShort((short) sendMsg.topicID.length());
- buffer.put(WKTypeUtils.getInstance().stringToByte(sendMsg.topicID));
- }
- byte[] contentBytes = WKTypeUtils.getInstance().stringToByte(sendContent);
- buffer.put(contentBytes);
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- buffer.position(0);
- buffer.get(bytes);
- return bytes;
- }
-
- WKBaseMsg decodeMessage(byte[] bytes) {
- //包类型
- InputStream inputStream = new ByteArrayInputStream(bytes);
- byte[] fixedHeader = new byte[1];
- try {
- int headerRead = inputStream.read(fixedHeader);
- if (headerRead == -1) return null;
- int packetType = WKTypeUtils.getInstance().getHeight4(fixedHeader[0]);
- int remainingLength = WKTypeUtils.getInstance().bytes2Length(inputStream);
- if (packetType == WKMsgType.CONNACK) {
- // 连接ack
- WKConnectAckMsg connectAckMsg = new WKConnectAckMsg();
- int read;
-
- // 客户端时间与服务器的差值,单位毫秒
- byte[] length_byte = new byte[8];
- read = inputStream.read(length_byte);
- if (read == -1) {
- return connectAckMsg;
- }
- long time = BigTypeUtils.getInstance().bytesToLong(length_byte);
-
- // 连接原因码
- byte[] reasonByte = new byte[1];
- read = inputStream.read(reasonByte);
- if (read == -1) {
- return connectAckMsg;
- }
-
- // 获取公钥长度
- byte[] serverKeyLengthByte = new byte[2];
- read = inputStream.read(serverKeyLengthByte);
- if (read == -1) return connectAckMsg;
- short serverKeyLength = BigTypeUtils.getInstance().byteToShort(serverKeyLengthByte);
- // 服务端公钥
- byte[] serverKeyByte = new byte[serverKeyLength];
- read = inputStream.read(serverKeyByte);
- if (read == -1) return connectAckMsg;
- String serverKey = WKTypeUtils.getInstance().bytesToString(serverKeyByte);
- // 获取安全码AES加密需要
- byte[] saltLengthByte = new byte[2];
- read = inputStream.read(saltLengthByte);
- if (read == -1) return connectAckMsg;
- short saltLength = BigTypeUtils.getInstance().byteToShort(saltLengthByte);
- // 安全码
- byte[] saltByte = new byte[saltLength];
- read = inputStream.read(saltByte);
- if (read == -1) return connectAckMsg;
- String salt = WKTypeUtils.getInstance().bytesToString(saltByte);
- connectAckMsg.serverKey = serverKey;
- connectAckMsg.salt = salt;
- //保存公钥和安全码
- CryptoUtils.getInstance().setServerKeyAndSalt(connectAckMsg.serverKey, connectAckMsg.salt);
-
- connectAckMsg.timeDiff = time;
- connectAckMsg.remainingLength = remainingLength;
- connectAckMsg.reasonCode = reasonByte[0];
- return connectAckMsg;
- } else if (packetType == WKMsgType.SENDACK) {
- WKSendAckMsg sendAckMsg = new WKSendAckMsg();
- // 发送消息ack
- byte[] messageId = new byte[8];
- int read = inputStream.read(messageId);
- if (read == -1) return sendAckMsg;
- BigInteger bigInteger = new BigInteger(messageId);
- if (bigInteger.toString().startsWith("-")) {
- BigInteger temp = new BigInteger("18446744073709551616");
- sendAckMsg.messageID = temp.add(bigInteger).toString();
- } else
- sendAckMsg.messageID = bigInteger.toString();
- //sendAckMsg.messageID = BigTypeUtils.getInstance().bytesToLong(messageId) + "";
- WKLoggerUtils.getInstance().e("发送ack msgid:" + sendAckMsg.messageID);
- // 客户端序列号
- byte[] clientSeq = new byte[4];
- read = inputStream.read(clientSeq);
- if (read == -1) return sendAckMsg;
- sendAckMsg.clientSeq = BigTypeUtils.getInstance().bytesToInt(clientSeq);
-
- // 服务器序号
- byte[] messageSqe = new byte[4];
- read = inputStream.read(messageSqe);
- if (read == -1) return sendAckMsg;
- sendAckMsg.messageSeq = BigTypeUtils.getInstance().bytesToInt(messageSqe);
-
- // 失败原因
- byte[] reasonCode = new byte[1];
- read = inputStream.read(reasonCode);
- if (read == -1) return sendAckMsg;
- sendAckMsg.reasonCode = reasonCode[0];
- WKLoggerUtils.getInstance().e("发送返回原因:"+sendAckMsg.reasonCode);
- return sendAckMsg;
- } else if (packetType == WKMsgType.DISCONNECT) {
- WKDisconnectMsg disconnectMsg = new WKDisconnectMsg();
- byte[] reasonCode = new byte[1];
- int read = inputStream.read(reasonCode);
- if (read == -1) return disconnectMsg;
- disconnectMsg.reasonCode = reasonCode[0];
- byte[] reasonByte = new byte[remainingLength - 1];
- if (reasonByte.length != 0) {
- read = inputStream.read(reasonByte);
- if (read == -1) return disconnectMsg;
- disconnectMsg.reason = WKTypeUtils.getInstance().bytesToString(reasonByte);
- }
- WKLoggerUtils.getInstance().e("sdk收到被踢的消息--->");
- WKLoggerUtils.getInstance().e("被踢的原因:" + disconnectMsg.reason);
- return disconnectMsg;
- } else if (packetType == WKMsgType.RECVEIVED) {
- //接受消息
- WKReceivedMsg receivedMsg = new WKReceivedMsg();
- int read;
- //消息设置
- byte[] setting = new byte[1];
- read = inputStream.read(setting);
- if (read == -1) return receivedMsg;
- receivedMsg.setting = WKTypeUtils.getInstance().getMsgSetting(setting[0]);
-
- // 消息Key
- byte[] msgKeyLengthByte = new byte[2];
- read = inputStream.read(msgKeyLengthByte);
- if (read == -1) return receivedMsg;
- short msgKeyLength = BigTypeUtils.getInstance().byteToShort(msgKeyLengthByte);
- byte[] msgKeyByte = new byte[msgKeyLength];
- read = inputStream.read(msgKeyByte);
- if (read == -1) return receivedMsg;
- receivedMsg.msgKey = WKTypeUtils.getInstance().bytesToString(msgKeyByte);
-
- // 发送者ID
- byte[] fromUIDLengthByte = new byte[2];
- read = inputStream.read(fromUIDLengthByte);
- if (read == -1) return receivedMsg;
- short fromUIDLength = BigTypeUtils.getInstance().byteToShort(fromUIDLengthByte);
- byte[] fromUIDByte = new byte[fromUIDLength];
- read = inputStream.read(fromUIDByte);
- if (read == -1) return receivedMsg;
- receivedMsg.fromUID = WKTypeUtils.getInstance().bytesToString(fromUIDByte);
-
- // 频道id长度
- byte[] channelIdLengthByte = new byte[2];
- read = inputStream.read(channelIdLengthByte);
- if (read == -1) return receivedMsg;
- // 频道id
- short channelIdLength = BigTypeUtils.getInstance().byteToShort(channelIdLengthByte);
- byte[] channelIDByte = new byte[channelIdLength];
- read = inputStream.read(channelIDByte);
- if (read == -1) return receivedMsg;
- receivedMsg.channelID = WKTypeUtils.getInstance().bytesToString(channelIDByte);
-
- // 频道类型
- byte[] channelType = new byte[1];
- read = inputStream.read(channelType);
- if (read == -1) return receivedMsg;
- receivedMsg.channelType = channelType[0];
-
- //解析客户端ID
- byte[] clientMsgNoLengthByte = new byte[2];
- read = inputStream.read(clientMsgNoLengthByte);
- if (read == -1) return receivedMsg;
- short clientMsgNoLength = BigTypeUtils.getInstance().byteToShort(clientMsgNoLengthByte);
- // 客户端编号
- byte[] clientMsgNoByte = new byte[clientMsgNoLength];
- read = inputStream.read(clientMsgNoByte);
- if (read == -1) return receivedMsg;
- receivedMsg.clientMsgNo = WKTypeUtils.getInstance().bytesToString(clientMsgNoByte);
-
- // 消息ID
- byte[] messageId = new byte[8];
- read = inputStream.read(messageId);
- if (read == -1) return receivedMsg;
- BigInteger bigInteger = new BigInteger(messageId);
- if (bigInteger.toString().startsWith("-")) {
- BigInteger temp = new BigInteger("18446744073709551616");
- receivedMsg.messageID = temp.add(bigInteger).toString();
- } else
- receivedMsg.messageID = bigInteger.toString();
- //receivedMsg.messageID = BigTypeUtils.getInstance().bytesToLong(messageId)+ "";
-
- //消息序列号
- byte[] messageSqe = new byte[4];
- read = inputStream.read(messageSqe);
- if (read == -1) return receivedMsg;
- receivedMsg.messageSeq = BigTypeUtils.getInstance().bytesToInt(messageSqe);
-
- //消息时间
- byte[] messageTime = new byte[4];
- read = inputStream.read(messageTime);
- if (read == -1) return receivedMsg;
- receivedMsg.messageTimestamp = BigTypeUtils.getInstance().bytesToInt(messageTime);
-
-
- // 话题ID
- short topicLength = 0;
- if (receivedMsg.setting.topic == 1) {
- byte[] topicLengthByte = new byte[2];
- read = inputStream.read(topicLengthByte);
- if (read == -1) return receivedMsg;
- topicLength = BigTypeUtils.getInstance().byteToShort(topicLengthByte);
- byte[] topicByte = new byte[topicLength];
- read = inputStream.read(topicByte);
- if (read == -1) return receivedMsg;
- receivedMsg.topicID = WKTypeUtils.getInstance().bytesToString(topicByte);
- // 默认加上字符串标示长度2
- topicLength += 2;
- }
-
- // 消息内容
- // 消息ID长度8 + 消息序列号长度4 + 消息时间长度4 + setting1 + (客户端ID长度+字符串标示长度2) (频道ID长度+字符串标示长度2) + 频道类型长度1 +(话题长度+字符串标示长度2) +(发送者uid长度+字符串标示长度2)
- byte[] payload = new byte[remainingLength - (8 + 4 + 2 + 1 + msgKeyLength + 4 + (clientMsgNoLength + 2) + (channelIdLength + 2) + 1 + topicLength + (2 + fromUIDLength))];
- read = inputStream.read(payload);
- if (read == -1) return receivedMsg;
-
- String content = WKTypeUtils.getInstance().bytesToString(payload);
- receivedMsg.payload = CryptoUtils.getInstance().aesDecrypt(CryptoUtils.getInstance().base64Decode(content));
- String msgKey = receivedMsg.messageID
- + receivedMsg.messageSeq
- + receivedMsg.clientMsgNo
- + receivedMsg.messageTimestamp
- + receivedMsg.fromUID
- + receivedMsg.channelID
- + receivedMsg.channelType
- + content;
- byte[] result = CryptoUtils.getInstance().aesEncrypt(msgKey);
- String base64Result = CryptoUtils.getInstance().base64Encode(result);
- String localMsgKey = CryptoUtils.getInstance().digestMD5(base64Result);
- if (!localMsgKey.equals(receivedMsg.msgKey)) {
- return null;
- }
-
- WKLoggerUtils.getInstance().e("接受到消息:" + receivedMsg.payload);
- return receivedMsg;
- } else if (packetType == WKMsgType.PONG) {
- WKLoggerUtils.getInstance().e("Pong消息--->");
- return new WKPongMsg();
- } else {
- WKLoggerUtils.getInstance().e("解析协议类型失败--->:" + packetType);
- return null;
- }
- } catch (IOException e) {
- e.printStackTrace();
- WKLoggerUtils.getInstance().e("解析数据异常------>:" + e.getMessage());
- return null;
- }
- }
-
- /**
- * 获取发送的消息
- *
- * @param msg 本地消息
- * @return 网络消息
- */
- WKBaseMsg getSendBaseMsg(WKMsg msg) {
- //发送消息
- JSONObject jsonObject = null;
- if (msg.baseContentMsgModel != null) {
- jsonObject = msg.baseContentMsgModel.encodeMsg();
- } else {
- msg.baseContentMsgModel = new WKMessageContent();
- }
- try {
- if (jsonObject == null) jsonObject = new JSONObject();
- if (!jsonObject.has(WKDBColumns.WKMessageColumns.from_uid)) {
- jsonObject.put(WKDBColumns.WKMessageColumns.from_uid, WKIMApplication.getInstance().getUid());
- }
- jsonObject.put(WKDBColumns.WKMessageColumns.type, msg.type);
- //判断@情况
- if (msg.baseContentMsgModel.mentionInfo != null
- && msg.baseContentMsgModel.mentionInfo.uids != null
- && msg.baseContentMsgModel.mentionInfo.uids.size() > 0) {
- JSONArray jsonArray = new JSONArray();
- for (int i = 0, size = msg.baseContentMsgModel.mentionInfo.uids.size(); i < size; i++) {
- jsonArray.put(msg.baseContentMsgModel.mentionInfo.uids.get(i));
- }
- if (!jsonObject.has("mention")) {
- JSONObject mentionJson = new JSONObject();
- mentionJson.put("all", msg.baseContentMsgModel.mentionAll);
- mentionJson.put("uids", jsonArray);
- jsonObject.put("mention", mentionJson);
- }
-
- } else {
- if (msg.baseContentMsgModel.mentionAll == 1) {
- JSONObject mentionJson = new JSONObject();
- mentionJson.put("all", msg.baseContentMsgModel.mentionAll);
- jsonObject.put("mention", mentionJson);
- }
- }
- // 被回复消息
- if (msg.baseContentMsgModel.reply != null) {
- jsonObject.put("reply", msg.baseContentMsgModel.reply.encodeMsg());
- }
- // 机器人ID
- if (!TextUtils.isEmpty(msg.baseContentMsgModel.robotID)) {
- jsonObject.put("robot_id", msg.baseContentMsgModel.robotID);
- }
- if (msg.baseContentMsgModel.entities != null && msg.baseContentMsgModel.entities.size() > 0) {
- JSONArray jsonArray = new JSONArray();
- for (WKMsgEntity entity : msg.baseContentMsgModel.entities) {
- JSONObject jo = new JSONObject();
- jo.put("offset", entity.offset);
- jo.put("length", entity.length);
- jo.put("type", entity.type);
- jo.put("value", entity.value);
- jsonArray.put(jo);
- }
- jsonObject.put("entities", jsonArray);
- }
- if (msg.baseContentMsgModel.flame != 0) {
- jsonObject.put("flame_second", msg.baseContentMsgModel.flameSecond);
- jsonObject.put("flame", msg.baseContentMsgModel.flame);
- }
- } catch (JSONException e) {
- e.printStackTrace();
- }
- WKSendMsg sendMsg = new WKSendMsg();
- // 默认先设置clientSeq,因为有可能本条消息并不需要入库,UI上自己设置了clientSeq
- sendMsg.clientSeq = (int) msg.clientSeq;
- sendMsg.sync_once = msg.header.syncOnce;
- sendMsg.no_persist = msg.header.noPersist;
- sendMsg.red_dot = msg.header.redDot;
- sendMsg.clientMsgNo = msg.clientMsgNO;
- sendMsg.channelId = msg.channelID;
- sendMsg.channelType = msg.channelType;
- sendMsg.topicID = msg.topicID;
- if (msg.setting == null) msg.setting = new WKMsgSetting();
- sendMsg.setting = msg.setting;
- msg.content = jsonObject.toString();
- long tempOrderSeq = MsgDbManager.getInstance().queryMaxOrderSeqWithChannel(msg.channelID, msg.channelType);
- msg.orderSeq = tempOrderSeq + 1;
- // 需要存储的消息入库后更改消息的clientSeq
- if (!sendMsg.no_persist) {
- sendMsg.clientSeq = (int) (msg.clientSeq = (int) MsgDbManager.getInstance().insert(msg));
- if (msg.clientSeq > 0) {
- // TODO: 2022/4/27
- WKUIConversationMsg uiMsg = WKIM.getInstance().getConversationManager().updateWithWKMsg(msg);
- if (uiMsg != null) {
- long browseTo = WKIM.getInstance().getMsgManager().getMaxMessageSeqWithChannel(uiMsg.channelID, uiMsg.channelType);
- if (uiMsg.getRemoteMsgExtra() == null) {
- uiMsg.setRemoteMsgExtra(new WKConversationMsgExtra());
- }
- uiMsg.getRemoteMsgExtra().browseTo = browseTo;
- WKIM.getInstance().getConversationManager().setOnRefreshMsg(uiMsg, true, "getSendBaseMsg");
- }
- }
- }
- if (WKMediaMessageContent.class.isAssignableFrom(msg.baseContentMsgModel.getClass())) {
- //多媒体数据
- if (jsonObject.has("localPath")) {
- jsonObject.remove("localPath");
- }
- //视频地址
- if (jsonObject.has("videoLocalPath")) {
- jsonObject.remove("videoLocalPath");
- }
- }
- sendMsg.payload = jsonObject.toString();
- WKLoggerUtils.getInstance().e(jsonObject.toString());
- return sendMsg;
- }
-
- WKMsg baseMsg2WKMsg(WKBaseMsg baseMsg) {
- WKReceivedMsg receivedMsg = (WKReceivedMsg) baseMsg;
- WKMsg msg = new WKMsg();
- msg.channelType = receivedMsg.channelType;
- msg.channelID = receivedMsg.channelID;
- msg.content = receivedMsg.payload;
- msg.messageID = receivedMsg.messageID;
- msg.messageSeq = receivedMsg.messageSeq;
- msg.timestamp = receivedMsg.messageTimestamp;
- msg.fromUID = receivedMsg.fromUID;
- msg.setting = receivedMsg.setting;
- msg.clientMsgNO = receivedMsg.clientMsgNo;
- msg.status = WKSendMsgResult.send_success;
- msg.topicID = receivedMsg.topicID;
-
- msg.orderSeq = WKIM.getInstance().getMsgManager().getMessageOrderSeq(msg.messageSeq, msg.channelID, msg.channelType);
- msg.isDeleted = isDelete(msg.content);
- return msg;
- }
-
- private static int isDelete(String contentJson) {
- int isDelete = 0;
- if (!TextUtils.isEmpty(contentJson)) {
- try {
- JSONObject jsonObject = new JSONObject(contentJson);
- isDelete = WKIM.getInstance().getMsgManager().isDeletedMsg(jsonObject);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- return isDelete;
- }
-}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/message/MessageHandler.java b/wkim/src/main/java/com/xinbida/wukongim/message/MessageHandler.java
index fc84518..a019660 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/message/MessageHandler.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/message/MessageHandler.java
@@ -5,26 +5,23 @@ import android.text.TextUtils;
import com.xinbida.wukongim.WKIM;
import com.xinbida.wukongim.WKIMApplication;
import com.xinbida.wukongim.db.ConversationDbManager;
-import com.xinbida.wukongim.db.WKDBColumns;
import com.xinbida.wukongim.db.MsgDbManager;
+import com.xinbida.wukongim.db.WKDBColumns;
+import com.xinbida.wukongim.entity.WKChannelType;
import com.xinbida.wukongim.entity.WKMsg;
import com.xinbida.wukongim.entity.WKSyncMsg;
import com.xinbida.wukongim.entity.WKUIConversationMsg;
import com.xinbida.wukongim.interfaces.IReceivedMsgListener;
import com.xinbida.wukongim.manager.CMDManager;
import com.xinbida.wukongim.manager.ConversationManager;
-import com.xinbida.wukongim.entity.WKChannelType;
import com.xinbida.wukongim.message.type.WKMsgContentType;
import com.xinbida.wukongim.message.type.WKMsgType;
import com.xinbida.wukongim.protocol.WKBaseMsg;
import com.xinbida.wukongim.protocol.WKConnectAckMsg;
-import com.xinbida.wukongim.protocol.WKConnectMsg;
import com.xinbida.wukongim.protocol.WKDisconnectMsg;
-import com.xinbida.wukongim.protocol.WKPingMsg;
import com.xinbida.wukongim.protocol.WKPongMsg;
import com.xinbida.wukongim.protocol.WKReceivedAckMsg;
import com.xinbida.wukongim.protocol.WKSendAckMsg;
-import com.xinbida.wukongim.protocol.WKSendMsg;
import com.xinbida.wukongim.utils.WKLoggerUtils;
import com.xinbida.wukongim.utils.WKTypeUtils;
@@ -64,23 +61,9 @@ public class MessageHandler {
if (msg == null) {
return 1;
}
- byte[] bytes;
- if (msg.packetType == WKMsgType.CONNECT) {
- // 连接
- bytes = MessageConvertHandler.getInstance().enConnectMsg((WKConnectMsg) msg);
- } else if (msg.packetType == WKMsgType.REVACK) {
- // 收到消息回执
- bytes = MessageConvertHandler.getInstance().enReceivedAckMsg((WKReceivedAckMsg) msg);
- } else if (msg.packetType == WKMsgType.SEND) {
- // 发送聊天消息
- bytes = MessageConvertHandler.getInstance().enSendMsg((WKSendMsg) msg);
- } else if (msg.packetType == WKMsgType.PING) {
- // 发送心跳
- bytes = MessageConvertHandler.getInstance().enPingMsg((WKPingMsg) msg);
- WKLoggerUtils.getInstance().e("ping...");
- } else {
- // 其他消息
- WKLoggerUtils.getInstance().e("发送未知消息类型");
+ byte[] bytes = WKProto.getInstance().encodeMsg(msg);
+ if (bytes == null || bytes.length == 0) {
+ WKLoggerUtils.getInstance().e("发送未知消息包:" + msg.packetType);
return 1;
}
@@ -154,13 +137,13 @@ public class MessageHandler {
WKLoggerUtils.getInstance().e("消息包类型" + packetType);
if (packetType == WKMsgType.PONG) {
//心跳ack
- mIReceivedMsgListener.heartbeatMsg(new WKPongMsg());
+ mIReceivedMsgListener.pongMsg(new WKPongMsg());
WKLoggerUtils.getInstance().e("pong...");
byte[] bytes = Arrays.copyOfRange(lastMsgBytes, 1, lastMsgBytes.length);
cacheData = lastMsgBytes = bytes;
} else {
if (packetType < 10) {
- // TODO: 2019-12-21 计算剩余长度
+ // 2019-12-21 计算剩余长度
if (lastMsgBytes.length < 5) {
cacheData = lastMsgBytes;
break;
@@ -202,7 +185,7 @@ public class MessageHandler {
if (bytes != null && bytes.length > 0) {
WKBaseMsg g_msg;
- g_msg = MessageConvertHandler.getInstance().decodeMessage(bytes);
+ g_msg = WKProto.getInstance().decodeMessage(bytes);
if (g_msg != null) {
//连接ack
if (g_msg.packetType == WKMsgType.CONNACK) {
@@ -228,7 +211,7 @@ public class MessageHandler {
.sendAckMsg(talkSendStatus);
} else if (g_msg.packetType == WKMsgType.RECVEIVED) {
//收到消息
- WKMsg message = MessageConvertHandler.getInstance().baseMsg2WKMsg(g_msg);
+ WKMsg message = WKProto.getInstance().baseMsg2WKMsg(g_msg);
message.header.noPersist = no_persist == 1;
message.header.redDot = red_dot == 1;
message.header.syncOnce = sync_once == 1;
@@ -239,7 +222,7 @@ public class MessageHandler {
WKDisconnectMsg disconnectMsg = (WKDisconnectMsg) g_msg;
mIReceivedMsgListener.kickMsg(disconnectMsg);
} else if (g_msg.packetType == WKMsgType.PONG) {
- mIReceivedMsgListener.heartbeatMsg((WKPongMsg) g_msg);
+ mIReceivedMsgListener.pongMsg((WKPongMsg) g_msg);
}
}
}
@@ -284,7 +267,7 @@ public class MessageHandler {
//回复消息ack
private void sendAck(List list) {
if (list.size() == 1) {
- ConnectionHandler.getInstance().sendMessage(list.get(0));
+ WKConnection.getInstance().sendMessage(list.get(0));
return;
}
final Timer sendAckTimer = new Timer();
@@ -292,7 +275,7 @@ public class MessageHandler {
@Override
public void run() {
if (list.size() > 0) {
- ConnectionHandler.getInstance().sendMessage(list.get(0));
+ WKConnection.getInstance().sendMessage(list.get(0));
list.remove(0);
} else {
sendAckTimer.cancel();
@@ -463,6 +446,4 @@ public class MessageHandler {
public void updateLastSendingMsgFail() {
MsgDbManager.getInstance().updateAllMsgSendFail();
}
-
-
}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/message/ConnectionHandler.java b/wkim/src/main/java/com/xinbida/wukongim/message/WKConnection.java
similarity index 93%
rename from wkim/src/main/java/com/xinbida/wukongim/message/ConnectionHandler.java
rename to wkim/src/main/java/com/xinbida/wukongim/message/WKConnection.java
index d205d66..0c3e6f1 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/message/ConnectionHandler.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/message/WKConnection.java
@@ -27,13 +27,12 @@ import com.xinbida.wukongim.msgmodel.WKVideoContent;
import com.xinbida.wukongim.protocol.WKBaseMsg;
import com.xinbida.wukongim.protocol.WKConnectMsg;
import com.xinbida.wukongim.protocol.WKDisconnectMsg;
-import com.xinbida.wukongim.protocol.WKMessageContent;
+import com.xinbida.wukongim.msgmodel.WKMessageContent;
import com.xinbida.wukongim.protocol.WKPingMsg;
import com.xinbida.wukongim.protocol.WKPongMsg;
import com.xinbida.wukongim.protocol.WKSendAckMsg;
import com.xinbida.wukongim.protocol.WKSendMsg;
import com.xinbida.wukongim.utils.DateUtils;
-import com.xinbida.wukongim.utils.FileUtils;
import com.xinbida.wukongim.utils.WKLoggerUtils;
import org.xsocket.connection.IConnection;
@@ -54,15 +53,15 @@ import java.util.concurrent.ConcurrentHashMap;
* 5/21/21 10:51 AM
* IM connect
*/
-public class ConnectionHandler {
- private ConnectionHandler() {
+public class WKConnection {
+ private WKConnection() {
}
private static class ConnectHandleBinder {
- private static final ConnectionHandler CONNECT = new ConnectionHandler();
+ private static final WKConnection CONNECT = new WKConnection();
}
- public static ConnectionHandler getInstance() {
+ public static WKConnection getInstance() {
return ConnectHandleBinder.CONNECT;
}
@@ -76,12 +75,13 @@ public class ConnectionHandler {
private String ip;
private int port;
volatile INonBlockingConnection connection;
- volatile ClientHandler clientHandler;
+ volatile ConnectionClient connectionClient;
private long requestIPTime;
private final long requestIPTimeoutTime = 6;
public String socketSingleID;
private String lastRequestId;
private final long reconnectDelay = 1500;
+ private int unReceivePongCount = 0;
public volatile Handler reconnectionHandler = new Handler(Objects.requireNonNull(Looper.myLooper()));
Runnable reconnectionRunnable = this::reconnection;
@@ -111,7 +111,7 @@ public class ConnectionHandler {
requestIPTime = DateUtils.getInstance().getCurrentSeconds();
getIPAndPort();
} else {
- if (!ConnectionTimerHandler.getInstance().checkNetWorkTimerIsRunning) {
+ if (!WKTimers.getInstance().checkNetWorkTimerIsRunning) {
WKIM.getInstance().getConnectionManager().setConnectionStatus(WKConnectStatus.noNetwork, WKConnectReason.NoNetwork);
isReConnecting = false;
reconnectionHandler.postDelayed(reconnectionRunnable, reconnectDelay);
@@ -141,11 +141,11 @@ public class ConnectionHandler {
reconnectionHandler.postDelayed(reconnectionRunnable, reconnectDelay);
} else {
if (lastRequestId.equals(requestId)) {
- ConnectionHandler.this.ip = ip;
- ConnectionHandler.this.port = port;
+ WKConnection.this.ip = ip;
+ WKConnection.this.port = port;
WKLoggerUtils.getInstance().e("连接的IP和Port" + ip + ":" + port);
if (connectionIsNull()) {
- new Thread(ConnectionHandler.this::connSocket).start();
+ new Thread(WKConnection.this::connSocket).start();
}
} else {
if (connectionIsNull()) {
@@ -161,9 +161,9 @@ public class ConnectionHandler {
closeConnect();
try {
socketSingleID = UUID.randomUUID().toString().replace("-", "");
- clientHandler = new ClientHandler();
+ connectionClient = new ConnectionClient();
// InetAddress inetAddress = InetAddress.getByName(ip);
- connection = new NonBlockingConnection(ip, port, clientHandler);
+ connection = new NonBlockingConnection(ip, port, connectionClient);
connection.setAttachment(socketSingleID);
connection.setIdleTimeoutMillis(1000 * 3);
connection.setConnectionTimeoutMillis(1000 * 3);
@@ -185,7 +185,7 @@ public class ConnectionHandler {
}
void receivedData(byte[] data) {
- MessageHandler.getInstance().cutBytes( data,
+ MessageHandler.getInstance().cutBytes(data,
new IReceivedMsgListener() {
public void sendAckMsg(
@@ -198,10 +198,6 @@ public class ConnectionHandler {
}
}
- @Override
- public void receiveMsg(WKMsg message) {
- // 收到在线消息,回服务器ack
- }
@Override
public void reconnect() {
@@ -215,9 +211,10 @@ public class ConnectionHandler {
}
@Override
- public void heartbeatMsg(WKPongMsg msgHeartbeat) {
+ public void pongMsg(WKPongMsg msgHeartbeat) {
// 心跳消息
lastMsgTime = DateUtils.getInstance().getCurrentSeconds();
+ unReceivePongCount = 0;
}
@Override
@@ -265,7 +262,7 @@ public class ConnectionHandler {
if (status == WKConnectStatus.success) {
//等待中
connectStatus = WKConnectStatus.success;
- ConnectionTimerHandler.getInstance().startAll();
+ WKTimers.getInstance().startAll();
resendMsg();
WKIM.getInstance().getConnectionManager().setConnectionStatus(WKConnectStatus.syncMsg, WKConnectReason.SyncMsg);
// 判断同步模式
@@ -304,6 +301,9 @@ public class ConnectionHandler {
return;
}
}
+ if (mBaseMsg.packetType == WKMsgType.PING) {
+ unReceivePongCount++;
+ }
if (connection == null || !connection.isOpen()) {
reconnection();
return;
@@ -317,6 +317,10 @@ public class ConnectionHandler {
// 查看心跳是否超时
void checkHeartIsTimeOut() {
+ if (unReceivePongCount >= 5) {
+ reconnectionHandler.postDelayed(reconnectionRunnable, reconnectDelay);
+ return;
+ }
long nowTime = DateUtils.getInstance().getCurrentSeconds();
if (nowTime - lastMsgTime >= 60) {
sendMessage(new WKPingMsg());
@@ -441,7 +445,7 @@ public class ConnectionHandler {
}
}
- WKBaseMsg base = MessageConvertHandler.getInstance().getSendBaseMsg(msg);
+ WKBaseMsg base = WKProto.getInstance().getSendBaseMsg(msg);
if (base != null && msg.clientSeq != 0) {
msg.clientSeq = ((WKSendMsg) base).clientSeq;
}
@@ -483,7 +487,7 @@ public class ConnectionHandler {
if (isSuccess) {
if (!sendingMsgHashMap.containsKey((int) msg.clientSeq)) {
msg.baseContentMsgModel = messageContent;
- WKBaseMsg base1 = MessageConvertHandler.getInstance().getSendBaseMsg(msg);
+ WKBaseMsg base1 = WKProto.getInstance().getSendBaseMsg(msg);
addSendingMsg((WKSendMsg) base1);
sendMessage(base1);
}
@@ -494,7 +498,7 @@ public class ConnectionHandler {
});
} else {
if (base != null) {
- if (msg.type != 9994) {
+ if (msg.header != null && !msg.header.noPersist) {
addSendingMsg((WKSendMsg) base);
}
sendMessage(base);
@@ -507,8 +511,8 @@ public class ConnectionHandler {
}
public void stopAll() {
- clientHandler = null;
- ConnectionTimerHandler.getInstance().stopAll();
+ connectionClient = null;
+ WKTimers.getInstance().stopAll();
closeConnect();
connectStatus = WKConnectStatus.fail;
isReConnecting = false;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/message/WKProto.java b/wkim/src/main/java/com/xinbida/wukongim/message/WKProto.java
new file mode 100644
index 0000000..c82e695
--- /dev/null
+++ b/wkim/src/main/java/com/xinbida/wukongim/message/WKProto.java
@@ -0,0 +1,408 @@
+package com.xinbida.wukongim.message;
+
+import android.text.TextUtils;
+
+import com.xinbida.wukongim.WKIM;
+import com.xinbida.wukongim.WKIMApplication;
+import com.xinbida.wukongim.db.MsgDbManager;
+import com.xinbida.wukongim.db.WKDBColumns;
+import com.xinbida.wukongim.entity.WKConversationMsgExtra;
+import com.xinbida.wukongim.entity.WKMsg;
+import com.xinbida.wukongim.entity.WKMsgSetting;
+import com.xinbida.wukongim.entity.WKUIConversationMsg;
+import com.xinbida.wukongim.message.type.WKMsgType;
+import com.xinbida.wukongim.message.type.WKSendMsgResult;
+import com.xinbida.wukongim.msgmodel.WKMediaMessageContent;
+import com.xinbida.wukongim.msgmodel.WKMessageContent;
+import com.xinbida.wukongim.msgmodel.WKMsgEntity;
+import com.xinbida.wukongim.protocol.WKBaseMsg;
+import com.xinbida.wukongim.protocol.WKConnectAckMsg;
+import com.xinbida.wukongim.protocol.WKConnectMsg;
+import com.xinbida.wukongim.protocol.WKDisconnectMsg;
+import com.xinbida.wukongim.protocol.WKPingMsg;
+import com.xinbida.wukongim.protocol.WKPongMsg;
+import com.xinbida.wukongim.protocol.WKReceivedAckMsg;
+import com.xinbida.wukongim.protocol.WKReceivedMsg;
+import com.xinbida.wukongim.protocol.WKSendAckMsg;
+import com.xinbida.wukongim.protocol.WKSendMsg;
+import com.xinbida.wukongim.utils.CryptoUtils;
+import com.xinbida.wukongim.utils.WKLoggerUtils;
+import com.xinbida.wukongim.utils.WKTypeUtils;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+
+/**
+ * 5/21/21 11:28 AM
+ * 收发消息转换
+ */
+class WKProto {
+
+ private WKProto() {
+ }
+
+ private static class MessageConvertHandlerBinder {
+ static final WKProto msgConvert = new WKProto();
+ }
+
+ public static WKProto getInstance() {
+ return MessageConvertHandlerBinder.msgConvert;
+ }
+
+ byte[] encodeMsg(WKBaseMsg msg) {
+ byte[] bytes = null;
+ if (msg.packetType == WKMsgType.CONNECT) {
+ // 连接
+ bytes = WKProto.getInstance().enConnectMsg((WKConnectMsg) msg);
+ } else if (msg.packetType == WKMsgType.REVACK) {
+ // 收到消息回执
+ bytes = WKProto.getInstance().enReceivedAckMsg((WKReceivedAckMsg) msg);
+ } else if (msg.packetType == WKMsgType.SEND) {
+ // 发送聊天消息
+ bytes = WKProto.getInstance().enSendMsg((WKSendMsg) msg);
+ } else if (msg.packetType == WKMsgType.PING) {
+ // 发送心跳
+ bytes = WKProto.getInstance().enPingMsg((WKPingMsg) msg);
+ WKLoggerUtils.getInstance().e("ping...");
+ }
+ return bytes;
+ }
+
+ byte[] enConnectMsg(WKConnectMsg connectMsg) {
+ byte[] remainingBytes = WKTypeUtils.getInstance().getRemainingLengthByte(connectMsg.getRemainingLength());
+ int totalLen = connectMsg.getTotalLen();
+ WKWrite wkWrite = new WKWrite(totalLen);
+ try {
+ wkWrite.writeByte(WKTypeUtils.getInstance().getHeader(connectMsg.packetType, connectMsg.flag, 0, 0));
+ wkWrite.writeBytes(remainingBytes);
+ wkWrite.writeByte(connectMsg.protocolVersion);
+ wkWrite.writeByte(connectMsg.deviceFlag);
+ wkWrite.writeString(connectMsg.deviceID);
+ wkWrite.writeString(WKIMApplication.getInstance().getUid());
+ wkWrite.writeString(WKIMApplication.getInstance().getToken());
+ wkWrite.writeLong(connectMsg.clientTimestamp);
+ wkWrite.writeString(CryptoUtils.getInstance().getPublicKey());
+
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return wkWrite.getWriteBytes();
+ }
+
+ synchronized byte[] enReceivedAckMsg(WKReceivedAckMsg receivedAckMsg) {
+ byte[] remainingBytes = WKTypeUtils.getInstance().getRemainingLengthByte(8 + 4);
+
+ int totalLen = 1 + remainingBytes.length + 8 + 4;
+ WKWrite wkWrite = new WKWrite(totalLen);
+ wkWrite.writeByte(WKTypeUtils.getInstance().getHeader(receivedAckMsg.packetType, receivedAckMsg.no_persist ? 1 : 0, receivedAckMsg.red_dot ? 1 : 0, receivedAckMsg.sync_once ? 1 : 0));
+ wkWrite.writeBytes(remainingBytes);
+ BigInteger bigInteger = new BigInteger(receivedAckMsg.messageID);
+ wkWrite.writeLong(bigInteger.longValue());
+ wkWrite.writeInt(receivedAckMsg.messageSeq);
+ return wkWrite.getWriteBytes();
+ }
+
+ byte[] enPingMsg(WKPingMsg pingMsg) {
+ WKWrite wkWrite = new WKWrite(1);
+ wkWrite.writeByte(WKTypeUtils.getInstance().getHeader(pingMsg.packetType, pingMsg.flag, 0, 0));
+ return wkWrite.getWriteBytes();
+ }
+
+ byte[] enSendMsg(WKSendMsg sendMsg) {
+ // 先加密内容
+ String sendContent = sendMsg.getSendContent();
+ String msgKeyContent = sendMsg.getMsgKey();
+ byte[] remainingBytes = WKTypeUtils.getInstance().getRemainingLengthByte(sendMsg.getRemainingLength());
+ int totalLen = sendMsg.getTotalLength();
+ WKWrite wkWrite = new WKWrite(totalLen);
+ try {
+ wkWrite.writeByte(WKTypeUtils.getInstance().getHeader(sendMsg.packetType, sendMsg.no_persist ? 1 : 0, sendMsg.red_dot ? 1 : 0, sendMsg.sync_once ? 1 : 0));
+ wkWrite.writeBytes(remainingBytes);
+ wkWrite.writeByte(WKTypeUtils.getInstance().getMsgSetting(sendMsg.setting));
+ wkWrite.writeInt(sendMsg.clientSeq);
+ wkWrite.writeString(sendMsg.clientMsgNo);
+ wkWrite.writeString(sendMsg.channelId);
+ wkWrite.writeByte(sendMsg.channelType);
+ wkWrite.writeString(msgKeyContent);
+ if (sendMsg.setting.topic == 1) {
+ wkWrite.writeString(sendMsg.topicID);
+ }
+ wkWrite.writePayload(sendContent);
+
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return wkWrite.getWriteBytes();
+ }
+
+ private WKConnectAckMsg deConnectAckMsg(WKRead wkRead) {
+ WKConnectAckMsg connectAckMsg = new WKConnectAckMsg();
+ try {
+ long time = wkRead.readLong();
+ short reasonCode = wkRead.readByte();
+ String serverKey = wkRead.readString();
+ String salt = wkRead.readString();
+ connectAckMsg.serverKey = serverKey;
+ connectAckMsg.salt = salt;
+ //保存公钥和安全码
+ CryptoUtils.getInstance().setServerKeyAndSalt(connectAckMsg.serverKey, connectAckMsg.salt);
+ connectAckMsg.timeDiff = time;
+ connectAckMsg.reasonCode = reasonCode;
+ } catch (IOException e) {
+ WKLoggerUtils.getInstance().d("解码连接ack错误");
+ }
+
+ return connectAckMsg;
+ }
+
+ private WKSendAckMsg deSendAckMsg(WKRead wkRead) {
+ WKSendAckMsg sendAckMsg = new WKSendAckMsg();
+ try {
+ sendAckMsg.messageID = wkRead.readMsgID();
+ sendAckMsg.clientSeq = wkRead.readInt();
+ sendAckMsg.messageSeq = wkRead.readInt();
+ sendAckMsg.reasonCode = wkRead.readByte();
+ WKLoggerUtils.getInstance().e("发送返回状态:" + sendAckMsg.reasonCode);
+ } catch (IOException e) {
+ WKLoggerUtils.getInstance().e("解码发送消息ack错误");
+ }
+ return sendAckMsg;
+ }
+
+ private WKDisconnectMsg deDisconnectMsg(WKRead wkRead) {
+ WKDisconnectMsg disconnectMsg = new WKDisconnectMsg();
+ try {
+ disconnectMsg.reasonCode = wkRead.readByte();
+ disconnectMsg.reason = wkRead.readString();
+ WKLoggerUtils.getInstance().e("sdk收到被踢的消息code:" + disconnectMsg.reasonCode + ",reason:" + disconnectMsg.reason);
+ return disconnectMsg;
+
+ } catch (IOException e) {
+ WKLoggerUtils.getInstance().e("解码断开连接错误");
+ }
+ return disconnectMsg;
+ }
+
+ private WKReceivedMsg deReceivedMsg(WKRead wkRead) {
+ WKReceivedMsg receivedMsg = new WKReceivedMsg();
+ try {
+ byte settingByte = wkRead.readByte();
+ receivedMsg.setting = WKTypeUtils.getInstance().getMsgSetting(settingByte);
+ receivedMsg.msgKey = wkRead.readString();
+ receivedMsg.fromUID = wkRead.readString();
+ receivedMsg.channelID = wkRead.readString();
+ receivedMsg.channelType = wkRead.readByte();
+ receivedMsg.clientMsgNo = wkRead.readString();
+ if (receivedMsg.setting.stream == 1) {
+ receivedMsg.streamNO = wkRead.readString();
+ receivedMsg.streamSeq = wkRead.readInt();
+ receivedMsg.streamFlag = wkRead.readByte();
+ }
+ receivedMsg.messageID = wkRead.readMsgID();
+ receivedMsg.messageSeq = wkRead.readInt();
+ receivedMsg.messageTimestamp = wkRead.readInt();
+ if (receivedMsg.setting.topic == 1) {
+ receivedMsg.topicID = wkRead.readString();
+ }
+ String content = wkRead.readPayload();
+ receivedMsg.payload = CryptoUtils.getInstance().aesDecrypt(CryptoUtils.getInstance().base64Decode(content));
+ String msgKey = receivedMsg.messageID
+ + receivedMsg.messageSeq
+ + receivedMsg.clientMsgNo
+ + receivedMsg.messageTimestamp
+ + receivedMsg.fromUID
+ + receivedMsg.channelID
+ + receivedMsg.channelType
+ + content;
+ byte[] result = CryptoUtils.getInstance().aesEncrypt(msgKey);
+ String base64Result = CryptoUtils.getInstance().base64Encode(result);
+ String localMsgKey = CryptoUtils.getInstance().digestMD5(base64Result);
+ if (!localMsgKey.equals(receivedMsg.msgKey)) {
+ return null;
+ }
+ WKLoggerUtils.getInstance().e("接受到消息:" + receivedMsg.payload);
+ } catch (IOException e) {
+ WKLoggerUtils.getInstance().e("解码收到消息错误");
+ }
+ return receivedMsg;
+ }
+
+ WKBaseMsg decodeMessage(byte[] bytes) {
+ try {
+ WKRead wkRead = new WKRead(bytes);
+ int packetType = wkRead.readPacketType();
+ wkRead.readRemainingLength();
+ if (packetType == WKMsgType.CONNACK) {
+ return deConnectAckMsg(wkRead);
+ } else if (packetType == WKMsgType.SENDACK) {
+ return deSendAckMsg(wkRead);
+ } else if (packetType == WKMsgType.DISCONNECT) {
+ return deDisconnectMsg(wkRead);
+ } else if (packetType == WKMsgType.RECVEIVED) {
+ return deReceivedMsg(wkRead);
+ } else if (packetType == WKMsgType.PONG) {
+ return new WKPongMsg();
+ } else {
+ WKLoggerUtils.getInstance().e("解析协议类型失败--->:" + packetType);
+ return null;
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ WKLoggerUtils.getInstance().e("解析数据异常------>:" + e.getMessage());
+ return null;
+ }
+ }
+
+ /**
+ * 获取发送的消息
+ *
+ * @param msg 本地消息
+ * @return 网络消息
+ */
+ WKBaseMsg getSendBaseMsg(WKMsg msg) {
+ //发送消息
+ JSONObject jsonObject = null;
+ if (msg.baseContentMsgModel != null) {
+ jsonObject = msg.baseContentMsgModel.encodeMsg();
+ } else {
+ msg.baseContentMsgModel = new WKMessageContent();
+ }
+ try {
+ if (jsonObject == null) jsonObject = new JSONObject();
+ if (!jsonObject.has(WKDBColumns.WKMessageColumns.from_uid)) {
+ jsonObject.put(WKDBColumns.WKMessageColumns.from_uid, WKIMApplication.getInstance().getUid());
+ }
+ jsonObject.put(WKDBColumns.WKMessageColumns.type, msg.type);
+ //判断@情况
+ if (msg.baseContentMsgModel.mentionInfo != null
+ && msg.baseContentMsgModel.mentionInfo.uids != null
+ && msg.baseContentMsgModel.mentionInfo.uids.size() > 0) {
+ JSONArray jsonArray = new JSONArray();
+ for (int i = 0, size = msg.baseContentMsgModel.mentionInfo.uids.size(); i < size; i++) {
+ jsonArray.put(msg.baseContentMsgModel.mentionInfo.uids.get(i));
+ }
+ if (!jsonObject.has("mention")) {
+ JSONObject mentionJson = new JSONObject();
+ mentionJson.put("all", msg.baseContentMsgModel.mentionAll);
+ mentionJson.put("uids", jsonArray);
+ jsonObject.put("mention", mentionJson);
+ }
+
+ } else {
+ if (msg.baseContentMsgModel.mentionAll == 1) {
+ JSONObject mentionJson = new JSONObject();
+ mentionJson.put("all", msg.baseContentMsgModel.mentionAll);
+ jsonObject.put("mention", mentionJson);
+ }
+ }
+ // 被回复消息
+ if (msg.baseContentMsgModel.reply != null) {
+ jsonObject.put("reply", msg.baseContentMsgModel.reply.encodeMsg());
+ }
+ // 机器人ID
+ if (!TextUtils.isEmpty(msg.baseContentMsgModel.robotID)) {
+ jsonObject.put("robot_id", msg.baseContentMsgModel.robotID);
+ }
+ if (msg.baseContentMsgModel.entities != null && msg.baseContentMsgModel.entities.size() > 0) {
+ JSONArray jsonArray = new JSONArray();
+ for (WKMsgEntity entity : msg.baseContentMsgModel.entities) {
+ JSONObject jo = new JSONObject();
+ jo.put("offset", entity.offset);
+ jo.put("length", entity.length);
+ jo.put("type", entity.type);
+ jo.put("value", entity.value);
+ jsonArray.put(jo);
+ }
+ jsonObject.put("entities", jsonArray);
+ }
+ if (msg.baseContentMsgModel.flame != 0) {
+ jsonObject.put("flame_second", msg.baseContentMsgModel.flameSecond);
+ jsonObject.put("flame", msg.baseContentMsgModel.flame);
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ WKSendMsg sendMsg = new WKSendMsg();
+ // 默认先设置clientSeq,因为有可能本条消息并不需要入库,UI上自己设置了clientSeq
+ sendMsg.clientSeq = (int) msg.clientSeq;
+ sendMsg.sync_once = msg.header.syncOnce;
+ sendMsg.no_persist = msg.header.noPersist;
+ sendMsg.red_dot = msg.header.redDot;
+ sendMsg.clientMsgNo = msg.clientMsgNO;
+ sendMsg.channelId = msg.channelID;
+ sendMsg.channelType = msg.channelType;
+ sendMsg.topicID = msg.topicID;
+ if (msg.setting == null) msg.setting = new WKMsgSetting();
+ sendMsg.setting = msg.setting;
+ msg.content = jsonObject.toString();
+ long tempOrderSeq = MsgDbManager.getInstance().queryMaxOrderSeqWithChannel(msg.channelID, msg.channelType);
+ msg.orderSeq = tempOrderSeq + 1;
+ // 需要存储的消息入库后更改消息的clientSeq
+ if (!sendMsg.no_persist) {
+ sendMsg.clientSeq = (int) (msg.clientSeq = (int) MsgDbManager.getInstance().insert(msg));
+ if (msg.clientSeq > 0) {
+ // 2022/4/27
+ WKUIConversationMsg uiMsg = WKIM.getInstance().getConversationManager().updateWithWKMsg(msg);
+ if (uiMsg != null) {
+ long browseTo = WKIM.getInstance().getMsgManager().getMaxMessageSeqWithChannel(uiMsg.channelID, uiMsg.channelType);
+ if (uiMsg.getRemoteMsgExtra() == null) {
+ uiMsg.setRemoteMsgExtra(new WKConversationMsgExtra());
+ }
+ uiMsg.getRemoteMsgExtra().browseTo = browseTo;
+ WKIM.getInstance().getConversationManager().setOnRefreshMsg(uiMsg, true, "getSendBaseMsg");
+ }
+ }
+ }
+ if (WKMediaMessageContent.class.isAssignableFrom(msg.baseContentMsgModel.getClass())) {
+ //多媒体数据
+ if (jsonObject.has("localPath")) {
+ jsonObject.remove("localPath");
+ }
+ //视频地址
+ if (jsonObject.has("videoLocalPath")) {
+ jsonObject.remove("videoLocalPath");
+ }
+ }
+ sendMsg.payload = jsonObject.toString();
+ WKLoggerUtils.getInstance().e(jsonObject.toString());
+ return sendMsg;
+ }
+
+ WKMsg baseMsg2WKMsg(WKBaseMsg baseMsg) {
+ WKReceivedMsg receivedMsg = (WKReceivedMsg) baseMsg;
+ WKMsg msg = new WKMsg();
+ msg.channelType = receivedMsg.channelType;
+ msg.channelID = receivedMsg.channelID;
+ msg.content = receivedMsg.payload;
+ msg.messageID = receivedMsg.messageID;
+ msg.messageSeq = receivedMsg.messageSeq;
+ msg.timestamp = receivedMsg.messageTimestamp;
+ msg.fromUID = receivedMsg.fromUID;
+ msg.setting = receivedMsg.setting;
+ msg.clientMsgNO = receivedMsg.clientMsgNo;
+ msg.status = WKSendMsgResult.send_success;
+ msg.topicID = receivedMsg.topicID;
+
+ msg.orderSeq = WKIM.getInstance().getMsgManager().getMessageOrderSeq(msg.messageSeq, msg.channelID, msg.channelType);
+ msg.isDeleted = isDelete(msg.content);
+ return msg;
+ }
+
+ private int isDelete(String contentJson) {
+ int isDelete = 0;
+ if (!TextUtils.isEmpty(contentJson)) {
+ try {
+ JSONObject jsonObject = new JSONObject(contentJson);
+ isDelete = WKIM.getInstance().getMsgManager().isDeletedMsg(jsonObject);
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ return isDelete;
+ }
+}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/message/WKRead.java b/wkim/src/main/java/com/xinbida/wukongim/message/WKRead.java
new file mode 100644
index 0000000..a19166e
--- /dev/null
+++ b/wkim/src/main/java/com/xinbida/wukongim/message/WKRead.java
@@ -0,0 +1,82 @@
+package com.xinbida.wukongim.message;
+
+import com.xinbida.wukongim.utils.BigTypeUtils;
+import com.xinbida.wukongim.utils.WKTypeUtils;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+
+public class WKRead {
+ InputStream inputStream;
+
+ WKRead(byte[] bytes) {
+ this.inputStream = new ByteArrayInputStream(bytes);
+ }
+
+ public int readPacketType() throws IOException {
+ byte[] header = new byte[1];
+ int headerRead = inputStream.read(header);
+ if (headerRead == -1) return 0;
+ return WKTypeUtils.getInstance().getHeight4(header[0]);
+ }
+
+ public int readRemainingLength() {
+ return WKTypeUtils.getInstance().bytes2Length(inputStream);
+ }
+
+ public long readLong() throws IOException {
+ byte[] longByte = new byte[8];
+ int read = inputStream.read(longByte);
+ if (read == -1) return 0;
+ return BigTypeUtils.getInstance().bytesToLong(longByte);
+ }
+
+ public int readInt() throws IOException {
+ byte[] intByte = new byte[4];
+ int read = inputStream.read(intByte);
+ if (read == -1) return 0;
+ return BigTypeUtils.getInstance().bytesToInt(intByte);
+ }
+
+ public byte readByte() throws IOException {
+ byte[] b = new byte[1];
+ int read = inputStream.read(b);
+ if (read == -1) return 0;
+ return b[0];
+ }
+
+ public String readString() throws IOException {
+ byte[] strLengthByte = new byte[2];
+ int read = inputStream.read(strLengthByte);
+ if (read == -1) return "";
+ int strLength = BigTypeUtils.getInstance().byteToShort(strLengthByte);
+ byte[] strByte = new byte[strLength];
+ read = inputStream.read(strByte);
+ if (read == -1) return "";
+ return WKTypeUtils.getInstance().bytesToString(strByte);
+ }
+
+ public String readMsgID() throws IOException {
+ String messageID;
+ byte[] messageIdByte = new byte[8];
+ int read = inputStream.read(messageIdByte);
+ if (read == -1) return "";
+ BigInteger bigInteger = new BigInteger(messageIdByte);
+ if (bigInteger.toString().startsWith("-")) {
+ BigInteger temp = new BigInteger("18446744073709551616");
+ messageID = temp.add(bigInteger).toString();
+ } else
+ messageID = bigInteger.toString();
+ return messageID;
+ }
+
+ public String readPayload() throws IOException {
+ int payloadLength = inputStream.available();
+ byte[] payload = new byte[payloadLength];
+ int read = inputStream.read(payload);
+ if (read == -1) return "";
+ return WKTypeUtils.getInstance().bytesToString(payload);
+ }
+}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/message/ConnectionTimerHandler.java b/wkim/src/main/java/com/xinbida/wukongim/message/WKTimers.java
similarity index 77%
rename from wkim/src/main/java/com/xinbida/wukongim/message/ConnectionTimerHandler.java
rename to wkim/src/main/java/com/xinbida/wukongim/message/WKTimers.java
index 388b40d..49a5c55 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/message/ConnectionTimerHandler.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/message/WKTimers.java
@@ -13,15 +13,15 @@ import java.util.TimerTask;
/**
* 5/21/21 11:19 AM
*/
-class ConnectionTimerHandler {
- private ConnectionTimerHandler() {
+class WKTimers {
+ private WKTimers() {
}
private static class ConnectionTimerHandlerBinder {
- static final ConnectionTimerHandler timeHandle = new ConnectionTimerHandler();
+ static final WKTimers timeHandle = new WKTimers();
}
- public static ConnectionTimerHandler getInstance() {
+ public static WKTimers getInstance() {
return ConnectionTimerHandlerBinder.timeHandle;
}
@@ -86,7 +86,7 @@ class ConnectionTimerHandler {
@Override
public void run() {
//发送心跳
- ConnectionHandler.getInstance().sendMessage(new WKPingMsg());
+ WKConnection.getInstance().sendMessage(new WKPingMsg());
}
}, 0, heart_time * 1000);
}
@@ -99,10 +99,10 @@ class ConnectionTimerHandler {
@Override
public void run() {
- if (ConnectionHandler.getInstance().connection == null || heartBeatTimer == null) {
- ConnectionHandler.getInstance().reconnection();
+ if (WKConnection.getInstance().connection == null || heartBeatTimer == null) {
+ WKConnection.getInstance().reconnection();
}
- ConnectionHandler.getInstance().checkHeartIsTimeOut();
+ WKConnection.getInstance().checkHeartIsTimeOut();
}
}, 1000 * 7, 1000 * 7);
}
@@ -119,14 +119,14 @@ class ConnectionTimerHandler {
if (!is_have_network) {
WKIM.getInstance().getConnectionManager().setConnectionStatus(WKConnectStatus.noNetwork, WKConnectReason.NoNetwork);
WKLoggerUtils.getInstance().e("无网络连接...");
- ConnectionHandler.getInstance().checkSendingMsg();
+ WKConnection.getInstance().checkSendingMsg();
} else {
//有网络
- if (ConnectionHandler.getInstance().connectionIsNull())
- ConnectionHandler.getInstance().reconnection();
+ if (WKConnection.getInstance().connectionIsNull())
+ WKConnection.getInstance().reconnection();
}
- if (ConnectionHandler.getInstance().connection == null || !ConnectionHandler.getInstance().connection.isOpen()) {
- ConnectionHandler.getInstance().reconnection();
+ if (WKConnection.getInstance().connection == null || !WKConnection.getInstance().connection.isOpen()) {
+ WKConnection.getInstance().reconnection();
}
checkNetWorkTimerIsRunning = true;
}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/message/WKWrite.java b/wkim/src/main/java/com/xinbida/wukongim/message/WKWrite.java
new file mode 100644
index 0000000..7814f15
--- /dev/null
+++ b/wkim/src/main/java/com/xinbida/wukongim/message/WKWrite.java
@@ -0,0 +1,54 @@
+package com.xinbida.wukongim.message;
+
+import com.xinbida.wukongim.utils.WKTypeUtils;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+public class WKWrite {
+ private final ByteBuffer buffer;
+ private final byte[] bytes;
+
+ public WKWrite(int totalLength) {
+ buffer = ByteBuffer.allocate(totalLength).order(
+ ByteOrder.BIG_ENDIAN);
+ bytes = new byte[totalLength];
+ }
+
+ public void writeByte(byte b) {
+ buffer.put(b);
+ }
+
+ public void writeBytes(byte[] bytes) {
+ buffer.put(bytes);
+ }
+
+ public void writeInt(int v) {
+ buffer.putInt(v);
+ }
+
+ public void writeShort(int v) {
+ buffer.putShort((short) v);
+ }
+
+ public void writeLong(long v) {
+ buffer.putLong(v);
+ }
+
+ public void writeString(String v) throws UnsupportedEncodingException {
+ buffer.putShort((short) v.length());
+ buffer.put(WKTypeUtils.getInstance().stringToByte(v));
+ }
+
+ public void writePayload(String v) throws UnsupportedEncodingException {
+ byte[] contentBytes = WKTypeUtils.getInstance().stringToByte(v);
+ buffer.put(contentBytes);
+ }
+
+ public byte[] getWriteBytes() {
+ buffer.position(0);
+ buffer.get(bytes);
+ return bytes;
+ }
+}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKImageContent.java b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKImageContent.java
index 601ad0b..b498c28 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKImageContent.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKImageContent.java
@@ -4,7 +4,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import com.xinbida.wukongim.message.type.WKMsgContentType;
-import com.xinbida.wukongim.protocol.WKMessageContent;
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKMediaMessageContent.java b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKMediaMessageContent.java
index 3dc454d..c79675b 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKMediaMessageContent.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKMediaMessageContent.java
@@ -2,8 +2,6 @@ package com.xinbida.wukongim.msgmodel;
import android.os.Parcel;
-import com.xinbida.wukongim.protocol.WKMessageContent;
-
/**
* 2020-04-04 10:39
* 多媒体消息。如果自定义消息带附件需继承该类
diff --git a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKMessageContent.java b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKMessageContent.java
similarity index 97%
rename from wkim/src/main/java/com/xinbida/wukongim/protocol/WKMessageContent.java
rename to wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKMessageContent.java
index 0e3efa1..71c5649 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKMessageContent.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKMessageContent.java
@@ -1,10 +1,9 @@
-package com.xinbida.wukongim.protocol;
+package com.xinbida.wukongim.msgmodel;
import android.os.Parcel;
import android.os.Parcelable;
import com.xinbida.wukongim.entity.WKMentionInfo;
-import com.xinbida.wukongim.msgmodel.WKReply;
import org.json.JSONObject;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKMsgEntity.java b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKMsgEntity.java
similarity index 96%
rename from wkim/src/main/java/com/xinbida/wukongim/protocol/WKMsgEntity.java
rename to wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKMsgEntity.java
index 0f461ee..d3053e9 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKMsgEntity.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKMsgEntity.java
@@ -1,4 +1,4 @@
-package com.xinbida.wukongim.protocol;
+package com.xinbida.wukongim.msgmodel;
import android.os.Parcel;
import android.os.Parcelable;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKReply.java b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKReply.java
index 5dedb37..7fb576a 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKReply.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKReply.java
@@ -4,7 +4,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import com.xinbida.wukongim.manager.MsgManager;
-import com.xinbida.wukongim.protocol.WKMessageContent;
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKTextContent.java b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKTextContent.java
index 713dfcb..7c8b878 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKTextContent.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKTextContent.java
@@ -5,7 +5,6 @@ import android.os.Parcelable;
import android.text.TextUtils;
import com.xinbida.wukongim.message.type.WKMsgContentType;
-import com.xinbida.wukongim.protocol.WKMessageContent;
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKVideoContent.java b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKVideoContent.java
index 3343adc..aca8a32 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKVideoContent.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKVideoContent.java
@@ -4,7 +4,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import com.xinbida.wukongim.message.type.WKMsgContentType;
-import com.xinbida.wukongim.protocol.WKMessageContent;
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKVoiceContent.java b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKVoiceContent.java
index 0bf59ee..a332f65 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKVoiceContent.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/msgmodel/WKVoiceContent.java
@@ -4,7 +4,6 @@ import android.os.Parcel;
import android.os.Parcelable;
import com.xinbida.wukongim.message.type.WKMsgContentType;
-import com.xinbida.wukongim.protocol.WKMessageContent;
import org.json.JSONException;
import org.json.JSONObject;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKConnectAckMsg.java b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKConnectAckMsg.java
index 959d5b8..4a00a6c 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKConnectAckMsg.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKConnectAckMsg.java
@@ -11,8 +11,6 @@ public class WKConnectAckMsg extends WKBaseMsg {
public long timeDiff;
//连接原因码
public short reasonCode;
- //时间戳长度
- public long timeDiffLength = 8;
// 服务端公钥
public String serverKey;
// 安全码
diff --git a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKConnectMsg.java b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKConnectMsg.java
index ce1f065..6655938 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKConnectMsg.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKConnectMsg.java
@@ -3,7 +3,9 @@ package com.xinbida.wukongim.protocol;
import com.xinbida.wukongim.WKIMApplication;
import com.xinbida.wukongim.message.type.WKMsgType;
+import com.xinbida.wukongim.utils.CryptoUtils;
import com.xinbida.wukongim.utils.DateUtils;
+import com.xinbida.wukongim.utils.WKTypeUtils;
/**
* 2019-11-11 10:22
@@ -42,4 +44,34 @@ public class WKConnectMsg extends WKBaseMsg {
deviceID = WKIMApplication.getInstance().getDeviceId();
remainingLength = 1 + 1 + 8;//(协议版本号+设备标示(同标示同账号互踢)+客户端当前时间戳(13位时间戳,到毫秒))
}
+
+ public int getRemainingLength() {
+ remainingLength = getFixedHeaderLength()
+ + deviceIDLength
+ + deviceID.length()
+ + uidLength
+ + WKIMApplication.getInstance().getUid().length()
+ + tokenLength
+ + WKIMApplication.getInstance().getToken().length()
+ + clientTimeStampLength
+ + clientKeyLength
+ + CryptoUtils.getInstance().getPublicKey().length();
+ return remainingLength;
+ }
+
+ public int getTotalLen() {
+ byte[] remainingBytes = WKTypeUtils.getInstance().getRemainingLengthByte(getRemainingLength());
+ return 1 + remainingBytes.length
+ + protocolVersionLength
+ + deviceFlagLength
+ + deviceIDLength
+ + deviceID.length()
+ + uidLength
+ + WKIMApplication.getInstance().getUid().length()
+ + tokenLength
+ + WKIMApplication.getInstance().getToken().length()
+ + clientTimeStampLength
+ + clientKeyLength
+ + CryptoUtils.getInstance().getPublicKey().length();
+ }
}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKReceivedAckMsg.java b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKReceivedAckMsg.java
index 478f45e..dbbc5f0 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKReceivedAckMsg.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKReceivedAckMsg.java
@@ -12,9 +12,6 @@ public class WKReceivedAckMsg extends WKBaseMsg {
public String messageID;
//序列号
public int messageSeq;
- //消息id长度
- public char messageIDLength = 2;
-
public WKReceivedAckMsg() {
packetType = WKMsgType.REVACK;
remainingLength = 8;//序列号
diff --git a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKReceivedMsg.java b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKReceivedMsg.java
index 9085c73..47506d0 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKReceivedMsg.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKReceivedMsg.java
@@ -30,8 +30,53 @@ public class WKReceivedMsg extends WKBaseMsg {
public String msgKey;
// 消息设置
public WKMsgSetting setting;
+ public String streamNO;
+ public int streamSeq;
+ public int streamFlag;
+
+ private final int settingLength = 1;
+ private final int msgKeyLength = 2;
+ public int msgKeyContentLength = 0;
+ private final int fromUIDLength = 2;
+ public int fromUIDContentLength = 0;
+ private final int channelTDLength = 2;
+ public int channelTDContentLength = 0;
+ private final int channelTypeLength = 1;
+ private final int clientMsgNoLength = 2;
+ public int clientMsgNoContentLength = 0;
+ private final int streamNOLength = 2;
+ public int streamNOContentLength = 0;
+ public int streamSeqLength = 4;
+ public int streamFlagLength = 1;
+ private final int messageIDLength = 8;
+ private final int messageSeqLength = 4;
+ private final int messageTimeLength = 4;
+ private final int topicIDLength = 2;
+ public int topicIDContentLength = 0;
public WKReceivedMsg() {
packetType = WKMsgType.RECVEIVED;
}
+
+ public int getPayloadLength(int remainingLength) {
+ int length = 0;
+ length += settingLength;
+ length += (msgKeyLength + msgKeyContentLength);
+ length += (fromUIDLength + fromUIDContentLength);
+ length += (channelTDLength + channelTDContentLength);
+ length += channelTypeLength;
+ length += (clientMsgNoLength + clientMsgNoContentLength);
+ if (setting.stream == 1) {
+ length += (streamNOLength + streamNOContentLength);
+ length += streamSeqLength;
+ length += streamFlagLength;
+ }
+ length += messageIDLength;
+ length += messageSeqLength;
+ length += messageTimeLength;
+ if (setting.topic == 1) {
+ length += (topicIDLength + topicIDContentLength);
+ }
+ return remainingLength - length;
+ }
}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKSendAckMsg.java b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKSendAckMsg.java
index 6136c08..6eebd0a 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKSendAckMsg.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKSendAckMsg.java
@@ -16,8 +16,6 @@ public class WKSendAckMsg extends WKBaseMsg {
public long messageSeq;
//发送原因代码 1表示成功
public byte reasonCode;
- //客户端序号长度
- public int clientSeqLength = 4;
public WKSendAckMsg() {
packetType = WKMsgType.SENDACK;
diff --git a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKSendMsg.java b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKSendMsg.java
index 11ad643..b52220d 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/protocol/WKSendMsg.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/protocol/WKSendMsg.java
@@ -1,12 +1,16 @@
package com.xinbida.wukongim.protocol;
+import android.text.TextUtils;
+
import com.xinbida.wukongim.entity.WKMsgSetting;
import com.xinbida.wukongim.message.type.WKMsgType;
+import com.xinbida.wukongim.utils.CryptoUtils;
+import com.xinbida.wukongim.utils.WKTypeUtils;
/**
* 2019-11-11 10:30
- * 发送消息到talkservice
+ * send 包
*/
public class WKSendMsg extends WKBaseMsg {
//客户端消息序列号(由客户端生成,每个客户端唯一)
@@ -25,27 +29,84 @@ public class WKSendMsg extends WKBaseMsg {
public int clientSeqLength = 4;
//频道所占长度
public short channelIdLength = 2;
- //消息体所占长度
- public short payloadLength = 2;
//渠道类型长度
public char channelTypeLength = 1;
//消息Key用于验证此消息是否合法
public short msgKeyLength = 2;
- //消息key
- public String msgKey;
// 话题ID
public String topicID;
public short topicIDLength = 2;
- // //消息是否回执
-// public int receipt;
-// //消息加密
-// public int signal;
public WKMsgSetting setting;
//消息是否回执长度
public short settingLength = 1;
+ private String cryptoPayload;
+ private String msgKey;
public WKSendMsg() {
packetType = WKMsgType.SEND;
remainingLength = 8 + 1;
+ cryptoPayload = "";
+ msgKey = "";
+ }
+
+ public String getSendContent() {
+ if (TextUtils.isEmpty(cryptoPayload)) {
+ cryptoPayload = CryptoUtils.getInstance().base64Encode(CryptoUtils.getInstance().aesEncrypt(payload));
+ }
+ return cryptoPayload;
+ }
+
+ public String getMsgKey() {
+ if (TextUtils.isEmpty(msgKey)) {
+ String sendContent = getSendContent();
+ String key = clientSeq + clientMsgNo + channelId + channelType + sendContent;
+ byte[] msgKeyByte = CryptoUtils.getInstance().aesEncrypt(key);
+ msgKey = CryptoUtils.getInstance().digestMD5(CryptoUtils.getInstance().base64Encode(msgKeyByte));
+ }
+ return msgKey;
+ }
+
+ private int getTopicLength() {
+ int topicLen = 0;
+ if (setting.topic == 1) {
+ topicLen = topicID.length();
+ topicLen += topicIDLength;
+ }
+ return topicLen;
+ }
+
+ public int getTotalLength() {
+ int topicLen = getTopicLength();
+ String msgKeyContent = getMsgKey();
+ String sendContent = getSendContent();
+ byte[] remainingBytes = WKTypeUtils.getInstance().getRemainingLengthByte(getRemainingLength());
+ return 1 + remainingBytes.length
+ + settingLength
+ + clientSeqLength
+ + clientMsgNoLength
+ + clientMsgNo.length()
+ + channelIdLength
+ + channelId.length()
+ + channelTypeLength
+ + msgKeyLength
+ + msgKeyContent.length()
+ + topicLen
+ + sendContent.getBytes().length;
+ }
+
+
+ public int getRemainingLength() {
+ String sendContent = getSendContent();
+ String msgKeyContent = getMsgKey();
+ int topicLen = getTopicLength();
+ remainingLength = settingLength
+ + clientSeqLength
+ + clientMsgNoLength + clientMsgNo.length()
+ + channelIdLength + channelId.length()
+ + channelTypeLength
+ + msgKeyLength + msgKeyContent.length()
+ + topicLen
+ + sendContent.getBytes().length;
+ return remainingLength;
}
}
diff --git a/wkim/src/main/java/com/xinbida/wukongim/utils/WKTypeUtils.java b/wkim/src/main/java/com/xinbida/wukongim/utils/WKTypeUtils.java
index 6d0f714..9ec8f05 100644
--- a/wkim/src/main/java/com/xinbida/wukongim/utils/WKTypeUtils.java
+++ b/wkim/src/main/java/com/xinbida/wukongim/utils/WKTypeUtils.java
@@ -162,6 +162,7 @@ public class WKTypeUtils {
WKMsgSetting msgSetting = new WKMsgSetting();
msgSetting.receipt = getBit(setting, 7);
msgSetting.topic = getBit(setting, 3);
+ msgSetting.stream = getBit(setting, 2);
return msgSetting;
}