| | |
| | | import io.netty.buffer.Unpooled; |
| | | import io.netty.channel.ChannelFuture; |
| | | import io.netty.channel.ChannelHandlerContext; |
| | | import io.netty.channel.ChannelId; |
| | | import org.springframework.http.HttpEntity; |
| | | import org.springframework.http.HttpHeaders; |
| | | import org.springframework.http.MediaType; |
| | |
| | | * @param msg |
| | | * @author TaoNingBo |
| | | */ |
| | | public void JudgeOperation(ChannelHandlerContext ctx, Object msg) { |
| | | public synchronized void JudgeOperation(ChannelHandlerContext ctx, Object msg) { |
| | | try { |
| | | // ByteBuf转String |
| | | ByteBuf byteBuf = (ByteBuf) msg; |
| | |
| | | } |
| | | JSONObject jsonCon = JSONObject.parseObject(jsonMsg.get("data").toString()); |
| | | |
| | | if(null != ctx && ctx.channel().isActive()){ |
| | | jsonMsg.put("method", Method.pong); |
| | | sendMsgToClient(ctx, jsonMsg.toJSONString()); |
| | | } |
| | | |
| | | //心跳 |
| | | if(method.equals(Method.ping)) { |
| | | Integer type = jsonCon.getInteger("type"); |
| | |
| | | if(StringUtil.isNotEmpty(token)){ |
| | | String token_ = redisUtil.getValue("USER_APP_"+ userId1);//获取缓存中最新的数据 |
| | | if(StringUtil.isNotEmpty(token_) && !token.equals(token_)){//不在同一设备上登录,向其他设备发送数据 |
| | | ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(0, 23)); |
| | | ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(token_.length() - 16)); |
| | | JSONObject msg_ = new JSONObject(); |
| | | msg_.put("code", 200); |
| | | msg_.put("msg", "SUCCESS"); |
| | | msg_.put("method", "OFFLINE"); |
| | | msg_.put("data", new Object()); |
| | | this.sendMsgToClient(data_, msg_.toJSONString());//给当前通道发送消息 |
| | | new Timer().schedule(new TimerTask() { |
| | | boolean b = this.sendMsgToClient(data_, msg_.toJSONString());//给当前通道发送消息 |
| | | if(b){ |
| | | NettyChannelMap.remove_(data_); |
| | | } |
| | | new Timer().schedule(new TimerTask() { |
| | | @Override |
| | | public void run() { |
| | | NettyChannelMap.remove_(data_); |
| | | } |
| | | }, 5000); |
| | | } |
| | | NettyChannelMap.update_(token.substring(0, 23), ctx); |
| | | NettyChannelMap.update_(token.substring(token.length() - 16), ctx); |
| | | NettyChannelMap.update("USER" + userId1, ctx); |
| | | redisUtil.setStrValue("USER_APP_" + userId1, token); |
| | | } |
| | |
| | | if(StringUtil.isNotEmpty(token)){//APP端登录的操作 |
| | | String token_ = redisUtil.getValue("DRIVER_" + userId1);//缓存中拿最新数据 |
| | | if(StringUtil.isNotEmpty(token_) && !token.equals(token_)){//不在同一设备上登录,向当前设备发送数据 |
| | | ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(0, 23)); |
| | | JSONObject msg_ = new JSONObject(); |
| | | msg_.put("code", 200); |
| | | msg_.put("msg", "SUCCESS"); |
| | | msg_.put("method", "OFFLINE"); |
| | | msg_.put("data", new Object()); |
| | | this.sendMsgToClient(data_, msg_.toJSONString());//给当前通道发送消息 |
| | | new Timer().schedule(new TimerTask() { |
| | | @Override |
| | | public void run() { |
| | | NettyChannelMap.remove_(data_); |
| | | } |
| | | }, 5000); |
| | | ChannelHandlerContext data_ = NettyChannelMap.getData_(token_.substring(token_.length() - 16)); |
| | | if(null != data_){ |
| | | JSONObject msg_ = new JSONObject(); |
| | | msg_.put("code", 200); |
| | | msg_.put("msg", "SUCCESS"); |
| | | msg_.put("method", "OFFLINE"); |
| | | msg_.put("data", new Object()); |
| | | boolean b = this.sendMsgToClient(data_, msg_.toJSONString());//给当前通道发送消息 |
| | | if(b){ |
| | | NettyChannelMap.remove_(data_); |
| | | } |
| | | } |
| | | } |
| | | NettyChannelMap.update("DRIVER" + userId1, ctx); |
| | | NettyChannelMap.update_(token.substring(0, 23), ctx); |
| | | NettyChannelMap.update_(token.substring(token.length() - 16), ctx); |
| | | redisUtil.setStrValue("DRIVER_" + userId1, token); |
| | | } |
| | | |
| | | //存储通讯通道 |
| | | //存储通讯通道 |
| | | if(null != ctx && ctx.channel().isActive()){ |
| | | NettyChannelMap.update("DRIVER" + userId1, ctx); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if(null != ctx && ctx.channel().isActive()){ |
| | | jsonMsg.put("method", Method.pong); |
| | | sendMsgToClient(ctx, jsonMsg.toJSONString()); |
| | | } |
| | | } |
| | | //司机上传位置 |
| | | if(method.equals(Method.location)){ |
| | |
| | | * @param msg |
| | | * @author TaoNingBo |
| | | */ |
| | | public static void sendMsgToClient(ChannelHandlerContext ctx, String msg) { |
| | | public static boolean sendMsgToClient(ChannelHandlerContext ctx, String msg) { |
| | | if (ctx != null && ctx.channel().isActive()) { |
| | | ByteBuf buffer = Unpooled.copiedBuffer((msg).getBytes()); |
| | | ChannelFuture sync; |
| | |
| | | if(b){ |
| | | NettyChannelMap.remove(ctx); |
| | | } |
| | | return true; |
| | | } |
| | | return sync.isSuccess(); |
| | | } catch (Exception e) { |
| | | System.err.println("推送发生异常,记录:"+msg); |
| | | NettyChannelMap.remove(ctx); |
| | |
| | | System.err.println("推送失败,长连接不存在"); |
| | | NettyChannelMap.remove(ctx); |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | // **链接断开 将推送消息记录 |