@Override public void run() { InputStream inputStream = null; MsgResponseHandle msgResponseHandle = new MsgResponseHandle(); // 如果Socket连接实例不存在则退出 while (InitMsgSocketServer.getInstance() != null) { try { // 睡眠0.5秒 Thread.sleep(500); // TODO 检测Socket连接实例 if (InitMsgSocketServer.getInstance().isConnected()) { // TODO 读取IO输入流数据 if (inputStream == null) { inputStream = InitMsgSocketServer.getInputStream(); } // 响应数据流解析 if (msgResponseHandle == null) { msgResponseHandle = new MsgResponseHandle(); } msgResponseHandle.decode(inputStream); } else { // TODO 跳出循环,退出线程 IMLog.anlong("Socket处于断开状态,消息响应线程终止."); Utils.notifyMessage(3, HandleStaticValue.BCODE1000); break; } } catch (Exception e) { e.printStackTrace(); IMLog.anlong("读取IO流时,解析响应数据异常"); // TODO 通知页面更新提示 Utils.notifyMessage(3, HandleStaticValue.BCODE1000); break; } } IMLog.anlong( "===================================================(消息响应)线程终止========================================================="); }
/** * @Title: decode @Description: TODO 解码器 * * @author anlong * @throws */ @SuppressWarnings("static-access") public void decode(InputStream stream) throws Exception { try { // 输入IO流 inputStream = stream; if (inputStream == null) { IMLog.anlong("IO流中没有数据响应!"); throw new IOException(); } // 消息体字节大小,不包括表示大小的4个字节 int limit = 0; // 消息字节大小,包括表示大小的4个字节 int msgSize = 0; // 消息字节数组 byte[] data = null; // 保证IO流中可读字节数大于 4个字节 byte[] dataSize = new byte[HandleStaticValue.PROTOCOL_SIZE]; if (inputStream.read(dataSize) == HandleStaticValue.PROTOCOL_SIZE) { msgSize = ByteAndInt.byteArray2Int(dataSize); IMLog.anlong("响应报文字节大小:" + msgSize); // 标识从该处读取剩余字节数 limit = msgSize - HandleStaticValue.PROTOCOL_SIZE; IMLog.anlong("响应报文体字节数:" + limit + "=" + Utils.getFileSizeString((long) limit)); // TODO 大于10M丢弃 if (limit > 10000000) { IMLog.anlong("丢弃一个大小为 " + limit + "的数据包!"); throw new IOException(); } // 定义消息字节数组大小 data = new byte[limit]; } // 循环读取消息字节 int len = 0; while (len < limit) { len += inputStream.read(data, len, (limit - len)); IMLog.anlong("读取字节数:" + len); } if (data == null) throw new IOException(); IMLog.anlong("读取流完成,byte[]的长度:" + data.length); dataInputStream = new DataInputStream(new ByteArrayInputStream(data)); if (dataInputStream != null) { // 业务编码 short bCode = dataInputStream.readShort(); // 密钥 int key = dataInputStream.readInt(); // 用户ID int uid = dataInputStream.readInt(); // 返回编码 short rtCode = dataInputStream.readShort(); // 错误编码 String rtMsg = dataInputStream.readUTF(); // 消息流水号 int msgSerial = dataInputStream.readInt(); // 消息头打印 IMLog.anlong( "limit size:" + limit + " bCode:" + bCode + " key:" + key + " uid:" + uid + " rtCode:" + rtCode + " rtMsg:" + rtMsg + " msgSerial:" + msgSerial); if (bCode == 0) { IMLog.anlong("业务编码错误!"); throw new IOException(); } // 获取对象 String requestPath = HandleStaticValue.RESPONSE_PACKEAGE + ".Response" + bCode; Class requestClass = Class.forName(requestPath); // 解析消息体 Object obj = ReadValue(requestClass, dataInputStream); // 反射设置消息头 ReflectionUtil.invokeMethod( obj, "init", msgSize, bCode, key, uid, rtCode, rtMsg, msgSerial); // 分发事件 try { if (bCode != 0 && obj != null) { MessageEvent event = new MessageEvent(bCode, obj); new MessageEventSource().getSingleton().notifyMessageEvent(event); } } catch (Exception e) { IMLog.anlong("监听队列没有找到 " + bCode + "!"); IMLog.anlong("已丢弃一个没有注册监听的数据包:" + bCode + "!"); throw e; } } else { IMLog.anlong("没有数据响应!"); throw new Exception(); } } catch (Exception e) { throw e; } }