websocket:WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——可以通俗的解释为服务器主动发送信息给客户端。
- 首先需要知道:websocket 底下也是socket 比如okhttp httpURLconnection 都是socket ;屏幕熄灭一段时间后,Socket就被断开。屏幕开启的时候需进行重连,但每次看Log的时候又发现网络是链接的,后来才发现是cpu休眠导致链接被断开,当你插上数据线看log的时候,网络cpu恢复,一看网络确实是链接的,网上有使用:PARTIAL_WAKE_LOCK,保持CPU不休眠。
PowerManager pm = (PowerManager) context.getSystemService(POWER_SERVICE);// init powerManager
// mWakelock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.SCREEN_DIM_WAKE_LOCK,"target");
mWakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, "pollingservice");
mWakelock.acquire();
这里是用了AlarmManager 进行启动service ,但是在5.0以上的系统闹钟为1分钟一次,不可控,所以是用了service 开启线程处理
- 其中有遇到过RSA 加密的问题,发现Android端这边总是不能跟Java那边匹配,最后发现是Android这边跟Java那边的标准是不一样的,android系统的RSA实现是"RSA/None/NoPadding",而标准JDK实现是"RSA/None/PKCS1Padding"
public static String encryptByPrivateKey(String data) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, BadPaddingException, IllegalBlockSizeException {
int keyIndex = Calendar.getInstance().get(Calendar.YEAR) - 2017;
keyIndex = keyIndex >= keyPrivateArray.size()?keyPrivateArray.size()-1:keyIndex;
byte[] bytes = Base64.decode(keyPrivateArray.get(keyIndex),Base64.DEFAULT);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(bytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPrivateKey privateK = (RSAPrivateKey)keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding"); //这里要跟java的RSA 标准一致
cipher.init(Cipher.ENCRYPT_MODE, privateK);
// 加密数据长度 <= 模长-11
String[] datas = splitString(data,privateK.getModulus().bitLength()/8-11);
String mi = "";
//如果明文长度大于模长-11则要分组加密
for (String s : datas) {
mi += bcd2Str(cipher.doFinal(s.getBytes()));
}
return mi;
}
ELAPSED_REALTIME:表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始)。
ELAPSED_REALTIME_WAKEUP: 表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间。
RTC:表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用绝对时间(即系统时间)。当系统调用System.currentTimeMillis()方法的返回值与triggerAtTime相等时启动operation所对应的组件。
RTC_WAKEUP:表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用绝对时间。
- 心跳包的时间可以改为2 3 5 7 这种增时发送的方式
开启两个端口进行轮询启动,一个断开,链接另一个。
源码链接:WebSocketDemo