├── .gitignore
├── README.md
├── app
├── .gitignore
├── build.gradle
├── libs
│ ├── mina-core-2.0.16.jar
│ └── slf4j-android-1.6.1-RC1.jar
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── hhf
│ │ └── activity
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── hhf
│ │ │ ├── activity
│ │ │ └── MainActivity.java
│ │ │ ├── client
│ │ │ ├── ConnectUtils.java
│ │ │ ├── FrameCodecFactory.java
│ │ │ ├── FrameDecoder.java
│ │ │ ├── FrameEncoder.java
│ │ │ ├── HeartBeatHandler.java
│ │ │ ├── HeartBeatListener.java
│ │ │ └── HeartBeatMessageFactory.java
│ │ │ ├── manager
│ │ │ ├── ClientConnectManager.java
│ │ │ └── SessionManager.java
│ │ │ └── service
│ │ │ ├── LongConnectService.java
│ │ │ └── ServiceHandler.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
│ └── hhf
│ └── activity
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /build
5 | /*/build/
6 | /captures
7 | .externalNativeBuild
8 | # User-specific configurations
9 | /.idea/
10 | # OS-specific files
11 | .DS_Store
12 | .DS_Store?
13 | ._*
14 | .Spotlight-V100
15 | .Trashes
16 | ehthumbs.db
17 | Thumbs.db
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 本文档介绍:
2 | 1. 记录项目相关的资料,方便以后阅读查看
3 | 2. 本文档为markdown语法
4 | # MINA框架简介:
5 | 1. Mina是什么东西?
6 | Apache MINA 是一个网络应用框架,有助于用户非常方便地开发高性能、高伸缩性的网络应用。它通过Java NIO提供了一个抽象的、事件驱动的、异步的位于各种传输协议(如TCP/IP和UDP/IP)之上的API,Apache MINA 通常可被称之为:
7 | ```
8 | NIO 框架库;
9 | 客户端/服务器框架库;
10 | 或者一个网络socket库。
11 | ```
12 | 2. MINA框架的特点有:
13 | 基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。
14 | 3. Mina的框架
15 | 当远程客户首次访问采用MINA编写的程序时,IoAcceptor作为线程运行,负责接受来自客户的请求。当有客户请求连接时,创建一个IoSession,该IoSession与IoProcessor、SocketChannel以及IOService联系起来。IoProcessor也作为另外一个线程运行,定时检查客户是否有数据到来,并对客户请求进行处理,依次调用在IOService注册的各个IoFilter,最后调用IoHandler进行最终的逻辑处理,再将处理后的结果Filter后返回给客户端。
16 | 4. Mina的现有应用
17 | MINA框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、ApacheQpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架当前稳定版本是1.1.6,最新的2.0版本目前已经发布了M1版本。
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 26
5 | buildToolsVersion "26.0.1"
6 | defaultConfig {
7 | applicationId "com.hhf.activity"
8 | minSdkVersion 15
9 | targetSdkVersion 26
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:26.0.0-alpha1'
28 | testCompile 'junit:junit:4.12'
29 | compile files('libs/mina-core-2.0.16.jar')
30 | compile files('libs/slf4j-android-1.6.1-RC1.jar')
31 | compile 'io.reactivex.rxjava2:rxjava:2.1.0'
32 | compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
33 | }
34 |
--------------------------------------------------------------------------------
/app/libs/mina-core-2.0.16.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kevinStrange/MinaClient/9d8676bfbdc47ecfb538306219679946616b05ae/app/libs/mina-core-2.0.16.jar
--------------------------------------------------------------------------------
/app/libs/slf4j-android-1.6.1-RC1.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kevinStrange/MinaClient/9d8676bfbdc47ecfb538306219679946616b05ae/app/libs/slf4j-android-1.6.1-RC1.jar
--------------------------------------------------------------------------------
/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/huanghongfa/Library/Android/sdk/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/hhf/activity/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.hhf.activity;
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.hhf.activity", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/hhf/activity/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.hhf.activity;
2 |
3 | import android.content.Context;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.util.Log;
8 |
9 | import com.hhf.client.ConnectUtils;
10 | import com.hhf.client.FrameCodecFactory;
11 | import com.hhf.client.HeartBeatHandler;
12 | import com.hhf.client.HeartBeatListener;
13 | import com.hhf.client.HeartBeatMessageFactory;
14 | import com.hhf.manager.ClientConnectManager;
15 | import com.hhf.manager.SessionManager;
16 | import com.hhf.service.LongConnectService;
17 |
18 | import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
19 | import org.apache.mina.core.future.ConnectFuture;
20 | import org.apache.mina.core.session.IoSession;
21 | import org.apache.mina.filter.codec.ProtocolCodecFilter;
22 | import org.apache.mina.filter.keepalive.KeepAliveFilter;
23 | import org.apache.mina.transport.socket.nio.NioSocketConnector;
24 |
25 | import java.net.InetSocketAddress;
26 |
27 | import io.reactivex.Observable;
28 | import io.reactivex.ObservableEmitter;
29 | import io.reactivex.ObservableOnSubscribe;
30 | import io.reactivex.Observer;
31 | import io.reactivex.android.schedulers.AndroidSchedulers;
32 | import io.reactivex.annotations.NonNull;
33 | import io.reactivex.disposables.Disposable;
34 | import io.reactivex.schedulers.Schedulers;
35 |
36 | public class MainActivity extends AppCompatActivity implements LongConnectService.IStartConnectService {
37 |
38 | private final String TAG = "MainActivity";
39 |
40 | @Override
41 | protected void onCreate(Bundle savedInstanceState) {
42 | super.onCreate(savedInstanceState);
43 | setContentView(R.layout.activity_main);
44 | ClientConnectManager.getInstance().init(this);
45 | LongConnectService.setIStartConnectService(this);
46 | Intent intent = new Intent(this, LongConnectService.class);
47 | startService(intent);
48 | }
49 |
50 |
51 | private void connect2(final Context context) {
52 | ObservableOnSubscribe