websocket 解析

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

参考: 关于socket长连接的心跳包
android设备休眠
RSA加密解密坑
Android 关于休眠的几个坑点

你可能感兴趣的:(websocket 解析)