├── .gitignore ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── medlinker │ │ └── androidsocketchat │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── medlinker │ │ │ └── androidsocketchat │ │ │ ├── App.java │ │ │ ├── MainActivity.java │ │ │ └── MedImReceiver.java │ └── res │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── medlinker │ └── androidsocketchat │ └── ExampleUnitTest.java ├── art ├── log1.png └── tcp_socket_txmx.jpg ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── readme.md ├── settings.gradle ├── socketclient ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── readme.md └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── medlinker │ │ └── socketclient │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── aidl │ │ └── com │ │ │ └── medlinker │ │ │ └── socketclient │ │ │ └── aidl │ │ │ └── ImAIDLService.aidl │ ├── java │ │ └── com │ │ │ └── medlinker │ │ │ └── socketclient │ │ │ ├── ImManager.java │ │ │ └── core │ │ │ ├── Constants.java │ │ │ ├── IClient.java │ │ │ ├── IResponseCallback.java │ │ │ ├── ISendCallBack.java │ │ │ ├── ImBaseReceiver.java │ │ │ ├── ImMessageDispatcher.java │ │ │ ├── ImService.java │ │ │ ├── ImServiceHelper.java │ │ │ ├── SocketIOCallback.java │ │ │ ├── TcpClient.java │ │ │ └── util │ │ │ ├── AsyncTaskExecutor.java │ │ │ ├── Cacher.java │ │ │ ├── DefaultRetryPolicy.java │ │ │ ├── ICacher.java │ │ │ ├── ImExceptionHandler.java │ │ │ ├── RetryPolicy.java │ │ │ └── RunnablePool.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── medlinker │ └── socketclient │ └── ExampleUnitTest.java └── socketlib ├── .gitignore ├── build.gradle └── src └── main └── java └── com └── jiantao └── socketlib ├── MyClass.java ├── client └── SocketHelper.java └── server ├── ServerSocketHelper.java └── SocketHandler.java /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | /.idea 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "27.0.3" 6 | defaultConfig { 7 | applicationId "com.medlinker.androidsocketchat" 8 | minSdkVersion 15 9 | targetSdkVersion 25 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 25 | exclude group: 'com.android.support', module: 'support-annotations' 26 | }) 27 | compile 'com.android.support:appcompat-v7:25.1.1' 28 | testCompile 'junit:junit:4.12' 29 | compile project(':socketclient') 30 | compile project(':socketlib') 31 | } 32 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/admin/work/android-sdk-macosx/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/medlinker/androidsocketchat/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.medlinker.androidsocketchat; 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 | * Instrumentation 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() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.medlinker.androidsocketchat", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/medlinker/androidsocketchat/App.java: -------------------------------------------------------------------------------- 1 | package com.medlinker.androidsocketchat; 2 | 3 | import android.app.Application; 4 | 5 | import com.medlinker.socketclient.ImManager; 6 | import com.qpdstudio.logger.Logger; 7 | import com.qpdstudio.logger.Settings; 8 | 9 | /** 10 | * Created by jiantao on 2017/4/4. 11 | */ 12 | 13 | public class App extends Application { 14 | @Override 15 | public void onCreate() { 16 | super.onCreate(); 17 | Logger.init(new Settings().setShowMethodLink(true).setShowThreadInfo(false).setShowLog(BuildConfig.DEBUG)); 18 | ImManager.logEnable(BuildConfig.DEBUG); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/medlinker/androidsocketchat/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.medlinker.androidsocketchat; 2 | 3 | import android.support.v7.app.AppCompatActivity; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.EditText; 7 | import android.widget.TextView; 8 | 9 | import com.jiantao.socketlib.client.SocketHelper; 10 | import com.jiantao.socketlib.server.ServerSocketHelper; 11 | import com.medlinker.socketclient.ImManager; 12 | 13 | public class MainActivity extends AppCompatActivity { 14 | 15 | TextView textView; 16 | EditText hostName, port; 17 | 18 | SocketHelper socketHelper; 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_main); 24 | textView = (TextView) findViewById(R.id.textview); 25 | hostName = (EditText) findViewById(R.id.host_name); 26 | port = (EditText) findViewById(R.id.port); 27 | 28 | findViewById(R.id.client_btn) 29 | .setOnClickListener( 30 | new View.OnClickListener() { 31 | @Override 32 | public void onClick(View v) { 33 | new Thread( 34 | new Runnable() { 35 | @Override 36 | public void run() { 37 | String host = hostName.getText().toString(); 38 | int ePort = 39 | Integer.parseInt( 40 | port.getText().toString()); 41 | socketHelper = new SocketHelper(); 42 | socketHelper.connectServer(host, ePort); 43 | } 44 | }) 45 | .start(); 46 | } 47 | }); 48 | 49 | findViewById(R.id.server_btn) 50 | .setOnClickListener( 51 | new View.OnClickListener() { 52 | @Override 53 | public void onClick(View v) { 54 | new Thread( 55 | new Runnable() { 56 | @Override 57 | public void run() { 58 | ServerSocketHelper.startServive( 59 | hostName.getText().toString()); 60 | } 61 | }) 62 | .start(); 63 | } 64 | }); 65 | } 66 | 67 | @Override 68 | protected void onDestroy() { 69 | if (socketHelper != null) { 70 | socketHelper.close(); 71 | } 72 | 73 | ServerSocketHelper.closeLastHandler(); 74 | super.onDestroy(); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/com/medlinker/androidsocketchat/MedImReceiver.java: -------------------------------------------------------------------------------- 1 | package com.medlinker.androidsocketchat; 2 | 3 | import android.content.Context; 4 | 5 | import com.qpdstudio.logger.util.LogUtil; 6 | 7 | import java.nio.charset.Charset; 8 | import java.util.Random; 9 | 10 | import com.medlinker.socketclient.ImManager; 11 | import com.medlinker.socketclient.core.Constants; 12 | import com.medlinker.socketclient.core.ImBaseReceiver; 13 | 14 | /** 15 | * Created by jiantao on 2017/4/3. 16 | * test code 17 | */ 18 | 19 | public class MedImReceiver extends ImBaseReceiver { 20 | private static final String TAG = Constants.getIMCoreLogTag(MedImReceiver.class.getSimpleName()); 21 | 22 | static final Random randomTest = new Random(); 23 | 24 | @Override 25 | protected void onReceiveSocketLocalMsg(Context context, int msgWhat) { 26 | LogUtil.i(TAG, " onReceiveSocketLocalMsg msgWhat = %d", msgWhat); 27 | switch (msgWhat) { 28 | case Constants.LOCAL_MSG_CONNECT: 29 | // socket连接完成 30 | break; 31 | 32 | case Constants.LOCAL_MSG_DISCONNECTED: 33 | case Constants.LOCAL_MSG_CONNECT_FAILED: 34 | //内部连接失败,或者通知断开连接,这里统一重连 35 | //延迟5s重连 , 这里不判断网络状态,就不用监听网络变化。 36 | // Observable.timer(5, TimeUnit.SECONDS) 37 | // .observeOn(AndroidSchedulers.mainThread()) 38 | // .subscribe(new Action1() { 39 | // @Override 40 | // public void call(Long aLong) { 41 | // } 42 | // }); 43 | // ImManager.init(context,-1); 44 | break; 45 | } 46 | } 47 | 48 | @Override 49 | protected void onReceiveSocketRemoteMsg(Context context, int msgType, byte[] byteArrayExtra) { 50 | final String msg = new String(byteArrayExtra, Charset.defaultCharset()); 51 | LogUtil.i(TAG, "msgType = %d, msg = %s",msgType, msg); 52 | //消息回执 53 | System.out.println("client <<< 收到服务器消息: \""+msg+"\""); 54 | ImManager.sendMessage(context, (" client 发送de 消息回执 ").getBytes()); 55 | ImManager.sendMessage(context, (" client 发送新消息 id = "+ randomTest.nextInt(100)).getBytes()); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 19 | 20 | 25 | 26 | 31 | 32 |