├── .gitignore ├── .idea ├── checkstyle-idea.xml ├── checkstyleidea-libs │ └── readme.txt ├── codeStyles │ └── Project.xml ├── compiler.xml ├── encodings.xml ├── gradle.xml ├── jarRepositories.xml ├── misc.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── easysocket │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── easysocket │ │ │ ├── CallbackIDFactoryImpl.java │ │ │ ├── MainActivity.java │ │ │ └── message │ │ │ ├── AbsMessage.java │ │ │ ├── CallbackSender.java │ │ │ ├── ClientHeartBeat.java │ │ │ ├── IMessage.java │ │ │ ├── SimpleMessage.java │ │ │ └── TestMessage.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── easysocket │ └── ExampleUnitTest.java ├── build.gradle ├── easysocket ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── easysocket │ ├── ConnectionHolder.java │ ├── EasySocket.java │ ├── callback │ ├── ProgressDialogCallBack.java │ ├── SimpleCallBack.java │ └── SuperCallBack.java │ ├── config │ ├── CallbackIDFactory.java │ ├── DefaultMessageProtocol.java │ ├── DefaultX509ProtocolTrustManager.java │ ├── EasySocketOptions.java │ ├── SocketFactory.java │ └── SocketSSLConfig.java │ ├── connection │ ├── action │ │ ├── IOAction.java │ │ ├── SocketAction.java │ │ └── SocketStatus.java │ ├── connect │ │ ├── SuperConnection.java │ │ └── TcpConnection.java │ ├── dispatcher │ │ ├── CallbackResponseDispatcher.java │ │ ├── MainThreadExecutor.java │ │ └── SocketActionDispatcher.java │ ├── heartbeat │ │ └── HeartManager.java │ ├── iowork │ │ ├── EasyReader.java │ │ ├── EasyWriter.java │ │ └── IOManager.java │ └── reconnect │ │ ├── AbsReconnection.java │ │ └── DefaultReConnection.java │ ├── entity │ ├── OriginReadData.java │ ├── SocketAddress.java │ └── basemsg │ │ ├── IResponse.java │ │ ├── ISender.java │ │ ├── SuperCallbackResponse.java │ │ ├── SuperCallbackSender.java │ │ └── SuperSender.java │ ├── exception │ ├── InitialExeption.java │ ├── NotNullException.java │ ├── ReadRecoverableExeption.java │ ├── ReadUnrecoverableException.java │ ├── RequestCancelException.java │ └── RequestTimeOutException.java │ ├── interfaces │ ├── callback │ │ ├── ICallBack.java │ │ ├── IProgressDialog.java │ │ ├── IType.java │ │ └── ProgressCancelListener.java │ ├── config │ │ ├── IConnectionSwitchListener.java │ │ ├── IMessageProtocol.java │ │ └── IOptions.java │ ├── conn │ │ ├── IConnectionManager.java │ │ ├── IHeartManager.java │ │ ├── IReconnListener.java │ │ ├── ISend.java │ │ ├── ISocketActionDispatch.java │ │ ├── ISocketActionListener.java │ │ ├── ISubscribeSocketAction.java │ │ └── SocketActionListener.java │ └── io │ │ ├── IIOManager.java │ │ ├── IReader.java │ │ └── IWriter.java │ └── utils │ ├── LogUtil.java │ └── Utils.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle └── socker_server ├── .gitignore ├── build.gradle └── src └── main └── java └── com └── socker_server ├── HandlerIO.java ├── MainClass.java ├── ServerConfig.java ├── entity ├── DefaultMessageProtocol.java ├── IMessageProtocol.java ├── MessageID.java ├── OriginReadData.java └── message │ ├── CallbackResponse.java │ ├── DelayResponse.java │ ├── ServerHeartBeat.java │ ├── TestResponse.java │ └── base │ ├── BaseResponse.java │ ├── IClient.java │ ├── IResponse.java │ ├── SuperClient.java │ └── SuperResponse.java └── iowork ├── IIOManager.java ├── IReader.java ├── IWriter.java ├── ServerIOManager.java ├── ServerReader.java └── ServerWriter.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | -------------------------------------------------------------------------------- /.idea/checkstyle-idea.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/checkstyleidea-libs/readme.txt: -------------------------------------------------------------------------------- 1 | This folder contains libraries copied from the "EasySocket" project. 2 | It is managed by the CheckStyle-IDEA IDE plugin. 3 | Do not modify this folder while the IDE is running. 4 | When the IDE is stopped, you may delete this folder at any time. It will be recreated as needed. 5 | In order to prevent the CheckStyle-IDEA IDE plugin from creating this folder, 6 | uncheck the "Copy libraries from project directory" option in the CheckStyle-IDEA settings dialog. 7 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | xmlns:android 14 | 15 | ^$ 16 | 17 | 18 | 19 |
20 |
21 | 22 | 23 | 24 | xmlns:.* 25 | 26 | ^$ 27 | 28 | 29 | BY_NAME 30 | 31 |
32 |
33 | 34 | 35 | 36 | .*:id 37 | 38 | http://schemas.android.com/apk/res/android 39 | 40 | 41 | 42 |
43 |
44 | 45 | 46 | 47 | .*:name 48 | 49 | http://schemas.android.com/apk/res/android 50 | 51 | 52 | 53 |
54 |
55 | 56 | 57 | 58 | name 59 | 60 | ^$ 61 | 62 | 63 | 64 |
65 |
66 | 67 | 68 | 69 | style 70 | 71 | ^$ 72 | 73 | 74 | 75 |
76 |
77 | 78 | 79 | 80 | .* 81 | 82 | ^$ 83 | 84 | 85 | BY_NAME 86 | 87 |
88 |
89 | 90 | 91 | 92 | .* 93 | 94 | http://schemas.android.com/apk/res/android 95 | 96 | 97 | ANDROID_ATTRIBUTE_ORDER 98 | 99 |
100 |
101 | 102 | 103 | 104 | .* 105 | 106 | .* 107 | 108 | 109 | BY_NAME 110 | 111 |
112 |
113 |
114 |
115 |
116 |
-------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 22 | 23 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 13 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | # 这里主要是为了隐藏作者的一些隐私信息,你运行的时候可删除 3 | /src/main/res/values/evil.xml 4 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | defaultConfig { 6 | applicationId "com.easysocket" 7 | minSdkVersion 19 8 | targetSdkVersion 28 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation 'com.android.support:appcompat-v7:28.0.0' 24 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 25 | testImplementation 'junit:junit:4.12' 26 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 27 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 28 | implementation 'com.google.code.gson:gson:2.2.4' 29 | debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.2' 30 | implementation project(':easysocket') 31 | } 32 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/easysocket/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.easysocket; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.easysocket", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/easysocket/CallbackIDFactoryImpl.java: -------------------------------------------------------------------------------- 1 | package com.easysocket; 2 | 3 | import com.easysocket.config.CallbackIDFactory; 4 | import com.easysocket.entity.OriginReadData; 5 | 6 | import org.json.JSONException; 7 | import org.json.JSONObject; 8 | 9 | /** 10 | * Author:枪花 11 | * Date:2020/3/20 12 | * note:根据自己的实际情况实现 13 | */ 14 | public class CallbackIDFactoryImpl extends CallbackIDFactory { 15 | 16 | /** 17 | * @param 18 | * @return 19 | */ 20 | @Override 21 | public String getCallbackID(OriginReadData data) { 22 | try { 23 | JSONObject body = new JSONObject(data.getBodyString()); 24 | String callbackId = body.getString("callbackId"); 25 | return callbackId; 26 | } catch (JSONException e) { 27 | e.printStackTrace(); 28 | return null; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/easysocket/message/AbsMessage.java: -------------------------------------------------------------------------------- 1 | package com.easysocket.message; 2 | 3 | import com.easysocket.EasySocket; 4 | import com.google.gson.Gson; 5 | 6 | import java.nio.ByteBuffer; 7 | 8 | /** 9 | * Author:Mapogo 10 | * Date:2021/1/13 11 | * Note: 12 | */ 13 | public class AbsMessage implements IMessage { 14 | 15 | public AbsMessage() { 16 | } 17 | 18 | @Override 19 | public byte[] pack() { 20 | 21 | byte[] body = new Gson().toJson(this).getBytes(); 22 | // 如果没有设置消息协议,则直接发送消息 23 | if (EasySocket.getInstance().getDefOptions().getMessageProtocol() == null) { 24 | return body; 25 | } 26 | ByteBuffer bb = ByteBuffer.allocate(body.length + 4); 27 | bb.putInt(body.length); 28 | bb.put(body); 29 | return bb.array(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/easysocket/message/CallbackSender.java: -------------------------------------------------------------------------------- 1 | package com.easysocket.message; 2 | 3 | import com.easysocket.EasySocket; 4 | import com.easysocket.entity.basemsg.SuperCallbackSender; 5 | import com.google.gson.Gson; 6 | 7 | import java.nio.ByteBuffer; 8 | 9 | /** 10 | * Author:Alex 11 | * Date:2019/6/11 12 | * Note:带有回调标识的发送消息 13 | */ 14 | public class CallbackSender extends SuperCallbackSender { 15 | 16 | private String msgId; 17 | private String from; 18 | 19 | public String getMsgId() { 20 | return msgId; 21 | } 22 | 23 | public void setMsgId(String msgId) { 24 | this.msgId = msgId; 25 | } 26 | 27 | public String getFrom() { 28 | return from; 29 | } 30 | 31 | public void setFrom(String from) { 32 | this.from = from; 33 | } 34 | 35 | 36 | @Override 37 | public byte[] pack() { 38 | byte[] body = new Gson().toJson(this).getBytes(); 39 | // 如果没有设置消息协议,则直接发送消息 40 | if (EasySocket.getInstance().getDefOptions().getMessageProtocol() == null) { 41 | return body; 42 | } 43 | ByteBuffer bb = ByteBuffer.allocate(body.length + 4); 44 | bb.putInt(body.length); 45 | bb.put(body); 46 | return bb.array(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/easysocket/message/ClientHeartBeat.java: -------------------------------------------------------------------------------- 1 | package com.easysocket.message; 2 | 3 | /** 4 | * Author:Alex 5 | * Date:2019/6/6 6 | * Note:客户端心跳 7 | */ 8 | public class ClientHeartBeat extends AbsMessage { 9 | private String msgId; 10 | private String from; 11 | 12 | public String getMsgId() { 13 | return msgId; 14 | } 15 | 16 | public void setMsgId(String msgId) { 17 | this.msgId = msgId; 18 | } 19 | 20 | public String getFrom() { 21 | return from; 22 | } 23 | 24 | public void setFrom(String from) { 25 | this.from = from; 26 | } 27 | 28 | @Override 29 | public String toString() { 30 | return "ClientHeartBeat{" + 31 | "msgId='" + msgId + '\'' + 32 | ", from='" + from + '\'' + 33 | '}'; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/easysocket/message/IMessage.java: -------------------------------------------------------------------------------- 1 | package com.easysocket.message; 2 | 3 | /** 4 | * Author:Mapogo 5 | * Date:2021/1/13 6 | * Note:所有消息的接口 7 | */ 8 | public interface IMessage { 9 | 10 | /** 11 | * 根据自己的协议打包消息 12 | * 13 | * @return 返回打包好的byte[] 14 | */ 15 | byte[] pack(); 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/easysocket/message/SimpleMessage.java: -------------------------------------------------------------------------------- 1 | package com.easysocket.message; 2 | 3 | /** 4 | * Author:Mapogo 5 | * Date:2021/1/14 6 | * Note: 7 | */ 8 | public class SimpleMessage { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/com/easysocket/message/TestMessage.java: -------------------------------------------------------------------------------- 1 | package com.easysocket.message; 2 | 3 | /** 4 | * Author:Alex 5 | * Date:2019/12/6 6 | * Note:不带回调标识的消息 7 | */ 8 | public class TestMessage extends AbsMessage { 9 | 10 | private String msgId; 11 | private String from; 12 | 13 | public String getMsgId() { 14 | return msgId; 15 | } 16 | 17 | public void setMsgId(String msgId) { 18 | this.msgId = msgId; 19 | } 20 | 21 | public String getFrom() { 22 | return from; 23 | } 24 | 25 | public void setFrom(String from) { 26 | this.from = from; 27 | } 28 | 29 | @Override 30 | public String toString() { 31 | return "TestMessage{" + 32 | "msgId='" + msgId + '\'' + 33 | ", from='" + from + '\'' + 34 | '}'; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 |