mirror of
https://gitee.com/farsunset/cim.git
synced 2025-07-19 06:26:15 +08:00
修改targetVersion为26时发送广播可能接受不到的问题
This commit is contained in:
parent
ec2dec5a0a
commit
3f3d7e95e9
@ -5,6 +5,6 @@
|
|||||||
<classpathentry kind="lib" path="libs/log4j-1.2.17.jar"/>
|
<classpathentry kind="lib" path="libs/log4j-1.2.17.jar"/>
|
||||||
<classpathentry kind="lib" path="libs/mina-core-2.0.16.jar"/>
|
<classpathentry kind="lib" path="libs/mina-core-2.0.16.jar"/>
|
||||||
<classpathentry kind="lib" path="libs/protobuf-java-3.2.0.jar"/>
|
<classpathentry kind="lib" path="libs/protobuf-java-3.2.0.jar"/>
|
||||||
<classpathentry kind="lib" path="D:/dev/Android-SDK-Windows/platforms/android-25/android.jar"/>
|
<classpathentry kind="lib" path="C:/Program Files/Android/android-sdk-windows/platforms/android-24/android.jar"/>
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -71,16 +71,18 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
private final String KEY_LAST_HEART_TIME = "KEY_LAST_HEART_TIME";
|
private final String KEY_LAST_HEART_TIME = "KEY_LAST_HEART_TIME";
|
||||||
|
|
||||||
private NioSocketConnector connector;
|
private NioSocketConnector connector;
|
||||||
private ExecutorService executor = Executors.newFixedThreadPool(1);
|
|
||||||
private Semaphore semaphore = new Semaphore(1,true);
|
|
||||||
|
|
||||||
private Context context;
|
private Context context;
|
||||||
|
|
||||||
private static CIMConnectorManager manager;
|
private static CIMConnectorManager manager;
|
||||||
|
|
||||||
|
|
||||||
|
private ExecutorService executor = Executors.newFixedThreadPool(1);
|
||||||
|
private Semaphore semaphore = new Semaphore(1,true);
|
||||||
private CIMConnectorManager(Context ctx) {
|
private CIMConnectorManager(Context ctx) {
|
||||||
context = ctx;
|
context = ctx;
|
||||||
|
makeNioConnector();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makeNioConnector() {
|
||||||
connector = new NioSocketConnector();
|
connector = new NioSocketConnector();
|
||||||
connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);
|
connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);
|
||||||
connector.getSessionConfig().setTcpNoDelay(true);
|
connector.getSessionConfig().setTcpNoDelay(true);
|
||||||
@ -95,37 +97,30 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ClientMessageCodecFactory()));
|
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ClientMessageCodecFactory()));
|
||||||
connector.getFilterChain().addLast("heartbeat", keepAliveaHandler);
|
connector.getFilterChain().addLast("heartbeat", keepAliveaHandler);
|
||||||
connector.getFilterChain().addLast("logger",CIMLoggingFilter.getLogger());
|
connector.getFilterChain().addLast("logger",CIMLoggingFilter.getLogger());
|
||||||
connector.setHandler(this);
|
|
||||||
|
|
||||||
|
connector.setHandler(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public synchronized static CIMConnectorManager getManager(Context context) {
|
public synchronized static CIMConnectorManager getManager(Context context) {
|
||||||
|
|
||||||
if (manager == null) {
|
if (manager == null) {
|
||||||
manager = new CIMConnectorManager(context);
|
manager = new CIMConnectorManager(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
return manager;
|
return manager;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleConnectFailure(Throwable error,InetSocketAddress remoteAddress) {
|
|
||||||
long interval = CIMConstant.RECONN_INTERVAL_TIME - (5 * 1000 - new Random().nextInt(15 * 1000));
|
|
||||||
|
|
||||||
CIMLoggingFilter.getLogger().connectFailure(remoteAddress, interval);
|
|
||||||
|
|
||||||
|
|
||||||
Intent intent = new Intent();
|
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
|
|
||||||
intent.putExtra(Exception.class.getName(), error.getClass().getSimpleName());
|
|
||||||
intent.putExtra("interval", interval);
|
|
||||||
context.sendBroadcast(intent);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void connect(final String host, final int port) {
|
public void connect(final String host, final int port) {
|
||||||
|
|
||||||
if (!isNetworkConnected(context)) {
|
if (!isNetworkConnected(context)) {
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
|
intent.setPackage(context.getPackageName());
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
|
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
|
||||||
intent.putExtra(Exception.class.getName(), NetworkDisabledException.class.getSimpleName());
|
intent.putExtra(Exception.class.getName(), NetworkDisabledException.class.getSimpleName());
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
@ -137,15 +132,20 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(connector == null || connector.isDisposed()) {
|
||||||
|
makeNioConnector();
|
||||||
|
}
|
||||||
|
|
||||||
executor.execute(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_CONNECTION_STATE, false);
|
|
||||||
final InetSocketAddress remoteAddress = new InetSocketAddress(host, port);
|
final InetSocketAddress remoteAddress = new InetSocketAddress(host, port);
|
||||||
|
|
||||||
CIMLoggingFilter.getLogger().startConnect(remoteAddress);
|
CIMLoggingFilter.getLogger().startConnect(remoteAddress);
|
||||||
|
|
||||||
|
CIMCacheManager.putBoolean(context, CIMCacheManager.KEY_CIM_CONNECTION_STATE, false);
|
||||||
|
|
||||||
connector.connect(remoteAddress).addListener(new IoFutureListener<ConnectFuture>() {
|
connector.connect(remoteAddress).addListener(new IoFutureListener<ConnectFuture>() {
|
||||||
@Override
|
@Override
|
||||||
public void operationComplete(ConnectFuture future) {
|
public void operationComplete(ConnectFuture future) {
|
||||||
@ -161,6 +161,24 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void handleConnectFailure(Throwable error,InetSocketAddress remoteAddress) {
|
||||||
|
|
||||||
|
long interval = CIMConstant.RECONN_INTERVAL_TIME - (5 * 1000 - new Random().nextInt(15 * 1000));
|
||||||
|
|
||||||
|
CIMLoggingFilter.getLogger().connectFailure(remoteAddress, interval);
|
||||||
|
|
||||||
|
|
||||||
|
Intent intent = new Intent();
|
||||||
|
intent.setPackage(context.getPackageName());
|
||||||
|
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
|
||||||
|
intent.putExtra(Exception.class.getName(), error.getClass().getSimpleName());
|
||||||
|
intent.putExtra("interval", interval);
|
||||||
|
context.sendBroadcast(intent);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public void send(SentBody body) {
|
public void send(SentBody body) {
|
||||||
|
|
||||||
boolean isSuccessed = false;
|
boolean isSuccessed = false;
|
||||||
@ -180,6 +198,7 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
|
|
||||||
if (!isSuccessed) {
|
if (!isSuccessed) {
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
|
intent.setPackage(context.getPackageName());
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_SENT_FAILED);
|
intent.setAction(CIMConstant.IntentAction.ACTION_SENT_FAILED);
|
||||||
intent.putExtra(Exception.class.getName(), exceptionName);
|
intent.putExtra(Exception.class.getName(), exceptionName);
|
||||||
intent.putExtra(SentBody.class.getName(), body);
|
intent.putExtra(SentBody.class.getName(), body);
|
||||||
@ -196,9 +215,9 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
|
|
||||||
if (connector != null && !connector.isDisposed()) {
|
if (connector != null && !connector.isDisposed()) {
|
||||||
connector.dispose();
|
connector.dispose();
|
||||||
|
connector = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
manager = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isConnected() {
|
public boolean isConnected() {
|
||||||
@ -214,6 +233,11 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
}
|
}
|
||||||
|
|
||||||
public IoSession getCurrentSession() {
|
public IoSession getCurrentSession() {
|
||||||
|
|
||||||
|
if(connector == null || connector.isDisposed()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Map<Long, IoSession> sessions = connector.getManagedSessions();
|
Map<Long, IoSession> sessions = connector.getManagedSessions();
|
||||||
for (Long key : sessions.keySet()) {
|
for (Long key : sessions.keySet()) {
|
||||||
IoSession session = sessions.get(key);
|
IoSession session = sessions.get(key);
|
||||||
@ -230,6 +254,7 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
setLastHeartbeatTime(session);
|
setLastHeartbeatTime(session);
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
|
intent.setPackage(context.getPackageName());
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_SUCCESSED);
|
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_SUCCESSED);
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
|
|
||||||
@ -239,6 +264,7 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
public void sessionClosed(IoSession session) {
|
public void sessionClosed(IoSession session) {
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
|
intent.setPackage(context.getPackageName());
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_CLOSED);
|
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_CLOSED);
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
|
|
||||||
@ -246,22 +272,25 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sessionIdle(IoSession session, IdleStatus status) {
|
public void sessionIdle(IoSession session, IdleStatus status) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用于解决,wifi情况下。偶而路由器与服务器断开连接时,客户端并没及时收到关闭事件 导致这样的情况下当前连接无效也不会重连的问题
|
* 用于解决,wifi情况下。偶而路由器与服务器断开连接时,客户端并没及时收到关闭事件 导致这样的情况下当前连接无效也不会重连的问题
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
long lastHeartbeatTime = getLastHeartbeatTime(session);
|
long lastHeartbeatTime = getLastHeartbeatTime(session);
|
||||||
if (System.currentTimeMillis() - lastHeartbeatTime >= HEARBEAT_TIME_OUT) {
|
if (System.currentTimeMillis() - lastHeartbeatTime >= HEARBEAT_TIME_OUT) {
|
||||||
session.closeNow();
|
session.closeOnFlush();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void messageReceived(IoSession session, Object obj) {
|
public void messageReceived(IoSession session, Object obj) {
|
||||||
|
|
||||||
if (obj instanceof Message) {
|
if (obj instanceof Message) {
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
|
intent.setPackage(context.getPackageName());
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_MESSAGE_RECEIVED);
|
intent.setAction(CIMConstant.IntentAction.ACTION_MESSAGE_RECEIVED);
|
||||||
intent.putExtra(Message.class.getName(), (Message) obj);
|
intent.putExtra(Message.class.getName(), (Message) obj);
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
@ -270,6 +299,7 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
if (obj instanceof ReplyBody) {
|
if (obj instanceof ReplyBody) {
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
|
intent.setPackage(context.getPackageName());
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_REPLY_RECEIVED);
|
intent.setAction(CIMConstant.IntentAction.ACTION_REPLY_RECEIVED);
|
||||||
intent.putExtra(ReplyBody.class.getName(), (ReplyBody) obj);
|
intent.putExtra(ReplyBody.class.getName(), (ReplyBody) obj);
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
@ -280,6 +310,7 @@ class CIMConnectorManager extends IoHandlerAdapter implements KeepAliveMessageFa
|
|||||||
public void messageSent(IoSession session, Object message) {
|
public void messageSent(IoSession session, Object message) {
|
||||||
if (message instanceof SentBody) {
|
if (message instanceof SentBody) {
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
|
intent.setPackage(context.getPackageName());
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_SENT_SUCCESSED);
|
intent.setAction(CIMConstant.IntentAction.ACTION_SENT_SUCCESSED);
|
||||||
intent.putExtra(SentBody.class.getName(), (SentBody) message);
|
intent.putExtra(SentBody.class.getName(), (SentBody) message);
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2033 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
Binary file not shown.
@ -210,7 +210,6 @@ public class WebMessageDecoder extends MessageDecoderAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleClose(IoSession iosession, IoBuffer in) {
|
private void handleClose(IoSession iosession, IoBuffer in) {
|
||||||
|
|
||||||
in.get(new byte[in.remaining()]);
|
in.get(new byte[in.remaining()]);
|
||||||
iosession.closeOnFlush();
|
iosession.closeOnFlush();
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,6 @@
|
|||||||
<classpathentry kind="lib" path="libs/netty-transport-4.1.9.Final.jar"/>
|
<classpathentry kind="lib" path="libs/netty-transport-4.1.9.Final.jar"/>
|
||||||
<classpathentry kind="lib" path="libs/netty-common-4.1.9.Final.jar"/>
|
<classpathentry kind="lib" path="libs/netty-common-4.1.9.Final.jar"/>
|
||||||
<classpathentry kind="lib" path="libs/netty-handler-4.1.9.Final.jar"/>
|
<classpathentry kind="lib" path="libs/netty-handler-4.1.9.Final.jar"/>
|
||||||
<classpathentry kind="lib" path="D:/dev/Android-SDK-Windows/platforms/android-25/android.jar"/>
|
<classpathentry kind="lib" path="C:/Program Files/Android/android-sdk-windows/platforms/android-24/android.jar"/>
|
||||||
<classpathentry kind="output" path="bin"/>
|
<classpathentry kind="output" path="bin"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -83,7 +83,11 @@ class CIMConnectorManager extends SimpleChannelInboundHandler<Object> {
|
|||||||
|
|
||||||
private CIMConnectorManager(Context ctx) {
|
private CIMConnectorManager(Context ctx) {
|
||||||
context = ctx;
|
context = ctx;
|
||||||
|
makeNioBootstrap();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makeNioBootstrap() {
|
||||||
bootstrap = new Bootstrap();
|
bootstrap = new Bootstrap();
|
||||||
loopGroup = new NioEventLoopGroup(1);
|
loopGroup = new NioEventLoopGroup(1);
|
||||||
bootstrap.group(loopGroup);
|
bootstrap.group(loopGroup);
|
||||||
@ -101,7 +105,6 @@ class CIMConnectorManager extends SimpleChannelInboundHandler<Object> {
|
|||||||
ch.pipeline().addLast(CIMConnectorManager.this);
|
ch.pipeline().addLast(CIMConnectorManager.this);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized static CIMConnectorManager getManager(Context context) {
|
public synchronized static CIMConnectorManager getManager(Context context) {
|
||||||
@ -118,8 +121,8 @@ class CIMConnectorManager extends SimpleChannelInboundHandler<Object> {
|
|||||||
|
|
||||||
CIMLoggingHandler.getLogger().connectFailure(remoteAddress, interval);
|
CIMLoggingHandler.getLogger().connectFailure(remoteAddress, interval);
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
|
intent.setPackage(context.getPackageName());
|
||||||
intent.putExtra(Exception.class.getName(), error.getClass().getSimpleName());
|
intent.putExtra(Exception.class.getName(), error.getClass().getSimpleName());
|
||||||
intent.putExtra("interval", interval);
|
intent.putExtra("interval", interval);
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
@ -133,8 +136,8 @@ class CIMConnectorManager extends SimpleChannelInboundHandler<Object> {
|
|||||||
|
|
||||||
if (!isNetworkConnected(context)) {
|
if (!isNetworkConnected(context)) {
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_FAILED);
|
intent.setPackage(context.getPackageName());
|
||||||
intent.putExtra(Exception.class.getName(), NetworkDisabledException.class.getSimpleName());
|
intent.putExtra(Exception.class.getName(), NetworkDisabledException.class.getSimpleName());
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
|
|
||||||
@ -145,6 +148,10 @@ class CIMConnectorManager extends SimpleChannelInboundHandler<Object> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bootstrap == null || loopGroup.isShutdown()) {
|
||||||
|
makeNioBootstrap();
|
||||||
|
}
|
||||||
|
|
||||||
executor.execute(new Runnable() {
|
executor.execute(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -187,14 +194,14 @@ class CIMConnectorManager extends SimpleChannelInboundHandler<Object> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!isSuccessed) {
|
if (!isSuccessed) {
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent(CIMConstant.IntentAction.ACTION_SENT_FAILED);
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_SENT_FAILED);
|
intent.setPackage(context.getPackageName());
|
||||||
intent.putExtra(Exception.class.getName(), exceptionName);
|
intent.putExtra(Exception.class.getName(), exceptionName);
|
||||||
intent.putExtra(SentBody.class.getName(), body);
|
intent.putExtra(SentBody.class.getName(), body);
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
} else {
|
} else {
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent(CIMConstant.IntentAction.ACTION_SENT_SUCCESSED);
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_SENT_SUCCESSED);
|
intent.setPackage(context.getPackageName());
|
||||||
intent.putExtra(SentBody.class.getName(), (SentBody) body);
|
intent.putExtra(SentBody.class.getName(), (SentBody) body);
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
}
|
}
|
||||||
@ -210,7 +217,6 @@ class CIMConnectorManager extends SimpleChannelInboundHandler<Object> {
|
|||||||
loopGroup.shutdownGracefully();
|
loopGroup.shutdownGracefully();
|
||||||
}
|
}
|
||||||
|
|
||||||
manager = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isConnected() {
|
public boolean isConnected() {
|
||||||
@ -229,8 +235,8 @@ class CIMConnectorManager extends SimpleChannelInboundHandler<Object> {
|
|||||||
|
|
||||||
setLastHeartbeatTime(ctx.channel());
|
setLastHeartbeatTime(ctx.channel());
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent(CIMConstant.IntentAction.ACTION_CONNECTION_SUCCESSED);
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_SUCCESSED);
|
intent.setPackage(context.getPackageName());
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -238,8 +244,8 @@ class CIMConnectorManager extends SimpleChannelInboundHandler<Object> {
|
|||||||
@Override
|
@Override
|
||||||
public void channelInactive(ChannelHandlerContext ctx) {
|
public void channelInactive(ChannelHandlerContext ctx) {
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent(CIMConstant.IntentAction.ACTION_CONNECTION_CLOSED);
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_CONNECTION_CLOSED);
|
intent.setPackage(context.getPackageName());
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -264,16 +270,16 @@ class CIMConnectorManager extends SimpleChannelInboundHandler<Object> {
|
|||||||
public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
|
public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
|
||||||
if (msg instanceof Message) {
|
if (msg instanceof Message) {
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent(CIMConstant.IntentAction.ACTION_MESSAGE_RECEIVED);
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_MESSAGE_RECEIVED);
|
intent.setPackage(context.getPackageName());
|
||||||
intent.putExtra(Message.class.getName(), (Message) msg);
|
intent.putExtra(Message.class.getName(), (Message) msg);
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
|
|
||||||
}
|
}
|
||||||
if (msg instanceof ReplyBody) {
|
if (msg instanceof ReplyBody) {
|
||||||
|
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent(CIMConstant.IntentAction.ACTION_REPLY_RECEIVED);
|
||||||
intent.setAction(CIMConstant.IntentAction.ACTION_REPLY_RECEIVED);
|
intent.setPackage(context.getPackageName());
|
||||||
intent.putExtra(ReplyBody.class.getName(), (ReplyBody) msg);
|
intent.putExtra(ReplyBody.class.getName(), (ReplyBody) msg);
|
||||||
context.sendBroadcast(intent);
|
context.sendBroadcast(intent);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
Binary file not shown.
@ -3,7 +3,7 @@
|
|||||||
<classpathentry kind="src" path="src"/>
|
<classpathentry kind="src" path="src"/>
|
||||||
<classpathentry kind="lib" path="libs/protobuf-java-3.2.0.jar"/>
|
<classpathentry kind="lib" path="libs/protobuf-java-3.2.0.jar"/>
|
||||||
<classpathentry kind="lib" path="libs/slf4j-api-1.7.25.jar"/>
|
<classpathentry kind="lib" path="libs/slf4j-api-1.7.25.jar"/>
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
|
||||||
<attributes>
|
<attributes>
|
||||||
<attribute name="owner.project.facets" value="java"/>
|
<attribute name="owner.project.facets" value="java"/>
|
||||||
</attributes>
|
</attributes>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
org.eclipse.jdt.core.compiler.compliance=1.6
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
org.eclipse.jdt.core.compiler.source=1.6
|
org.eclipse.jdt.core.compiler.source=1.8
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -34,10 +34,12 @@ import com.farsunset.cim.sdk.server.session.CIMSession;
|
|||||||
|
|
||||||
import io.netty.bootstrap.ServerBootstrap;
|
import io.netty.bootstrap.ServerBootstrap;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
|
import io.netty.channel.ChannelFuture;
|
||||||
import io.netty.channel.ChannelHandler.Sharable;
|
import io.netty.channel.ChannelHandler.Sharable;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.ChannelInitializer;
|
import io.netty.channel.ChannelInitializer;
|
||||||
import io.netty.channel.ChannelOption;
|
import io.netty.channel.ChannelOption;
|
||||||
|
import io.netty.channel.EventLoopGroup;
|
||||||
import io.netty.channel.SimpleChannelInboundHandler;
|
import io.netty.channel.SimpleChannelInboundHandler;
|
||||||
import io.netty.channel.nio.NioEventLoopGroup;
|
import io.netty.channel.nio.NioEventLoopGroup;
|
||||||
import io.netty.channel.socket.SocketChannel;
|
import io.netty.channel.socket.SocketChannel;
|
||||||
@ -82,7 +84,9 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler<SentBody>
|
|||||||
innerHandlerMap.put(WEBSOCKET_HANDLER_KEY, new WebsocketHandler());
|
innerHandlerMap.put(WEBSOCKET_HANDLER_KEY, new WebsocketHandler());
|
||||||
|
|
||||||
ServerBootstrap bootstrap = new ServerBootstrap();
|
ServerBootstrap bootstrap = new ServerBootstrap();
|
||||||
bootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup());
|
EventLoopGroup bossGroup = new NioEventLoopGroup();
|
||||||
|
EventLoopGroup workerGroup = new NioEventLoopGroup();
|
||||||
|
bootstrap.group(bossGroup, workerGroup);
|
||||||
bootstrap.childOption(ChannelOption.TCP_NODELAY, true);
|
bootstrap.childOption(ChannelOption.TCP_NODELAY, true);
|
||||||
bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
|
bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true);
|
||||||
bootstrap.channel(NioServerSocketChannel.class);
|
bootstrap.channel(NioServerSocketChannel.class);
|
||||||
@ -99,6 +103,14 @@ public class CIMNioSocketAcceptor extends SimpleChannelInboundHandler<SentBody>
|
|||||||
});
|
});
|
||||||
|
|
||||||
bootstrap.bind(port);
|
bootstrap.bind(port);
|
||||||
|
|
||||||
|
ChannelFuture channelFuture = bootstrap.bind(port).syncUninterruptibly();
|
||||||
|
|
||||||
|
channelFuture.channel().closeFuture().addListener(future -> {
|
||||||
|
bossGroup.shutdownGracefully();
|
||||||
|
workerGroup.shutdownGracefully();
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
* Copyright 2013-2023 Xia Jun(3979434@qq.com).
|
* Copyright 2013-2019 Xia Jun(3979434@qq.com).
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user