`
knight_black_bob
  • 浏览: 842246 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ios apns netty java codec 防止粘包

阅读更多

 

ios apns java codec 防止粘包

 

 public Bootstrap newBootstrap(Bootstrap bootstrap,
            final PushHandler phandler) {
        bootstrap.handler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {
                ChannelPipeline pipeline = ch.pipeline();
                if (isSsl) {
                    SSLContext sslContext = SSLUtil.initSSLContext(credentials.getCertification(), credentials.getPassword());
                    SSLEngine sslEngine = sslContext.createSSLEngine();
                    sslEngine.setUseClientMode(true);
                    pipeline.addLast("ssl", new SslHandler(sslEngine));
                }
                if (Constant.debug) {
                    pipeline.addLast("log", new LoggingHandler(LogLevel.DEBUG));
                }

                pipeline.addLast("encoder", new Encoder());
                pipeline.addLast("decoder", new Decoder());
                pipeline.addLast("pushHandler", phandler);
            }
        });
        return bootstrap;
    }

 

 

 

package com.couriusby.apns.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.curiousby.apns.message.ErrorResponse;


public class Decoder extends ByteToMessageDecoder
{
	static final Logger logger = LoggerFactory.getLogger(Decoder.class);

	// 据文档: command + status + identifier = 1 + 1 + 4
	static final int responseSize = 6;

	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception
	{
		// logger.debug("readableBytes:" + in.readableBytes());
		if (in.readableBytes() >= responseSize)
		{
			ErrorResponse errorResponse = new ErrorResponse();
			errorResponse.setCommond(in.readByte());
			errorResponse.setStatus(in.readByte());
			errorResponse.setIdentifier(in.readInt());
			errorResponse.setErrorMsg(ErrorResponse.getErrorMsgByStatus(errorResponse.getStatus()));
			out.add(errorResponse);
		}
		logger.debug("decoder:" + out);
	}
}

 

package com.curiousby.apns.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

import java.nio.charset.Charset;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.curiousby.apns.message.Item;
import com.curiousby.apns.message.Notification;


/**
 * <pre>
 * 1 byte      4 byte 
 * command + frameLength + item + item + ... + item
 * 
 *         1 byte     2 byte 
 * item = itemId + itemLength + itemData
 * 
 * itemData据不同的类型有不同的长度:
 * 
 * </pre>
 * 
 * 采用组发送的方式,一次发送一系列的消息,然后每个消息的notificationIdentifier都是连续的,
 * 这样,如果apple的服务器返回错误,那么可以从错误里的Identifier知道是哪个出错了,然后重发下面的消息。
 */
public class Encoder extends MessageToByteEncoder<Notification>
{
	static final Logger logger = LoggerFactory.getLogger(Encoder.class);

	// TODO 这个到底要不要做成static的,static的可能容易调试点,不然每个线程都有一个计数的话,可能会比较乱
	// TODO 处理超出int范围,再重新从0开始的逻辑
	int identifier = 0;

	static final Charset utf8 = Charset.forName("UTF-8");

	// 据apple的文档,这个值就是2,据其它地方看到的资料,有0和1的版本。
	static final int COMMAND = 2;

	static final int defaultExpirationDate = 0;

	@Override
	protected void encode(ChannelHandlerContext ctx, Notification notification, ByteBuf out) throws Exception
	{
		// logger.debug("NotificationEncoder:" + notification);

		// String data =
		// "02000000770100205CA6A718250E1868A8EB7D8964D3E8A051B009268A3D710D0D8CC6591572890802003F7B22617073223A7B22736F756E64223A2264656661756C74222C22616C657274223A2252696E672072696E672C204E656F2E222C226261646765223A317D7D030004000000650400047FFFFFFF0500010A";
		// out.writeBytes(Hex.decodeHex(data.toCharArray()));

		out.writeByte(COMMAND);
		out.writeInt(0); // 预先写入frameLen

		int frameLenIndex = out.writerIndex();

		// 这里不检验数据格式的正确性,上层要检查

		// 开始写入items
		// 开始写入Device token
		out.writeByte(Item.DEVICE_TOKEN);
		out.writeShort(32);
		out.writeBytes(notification.getToken());

		// 写入Payload
		out.writeByte(Item.PAYLOAD);
		out.writeShort(notification.getPayload().length);
		out.writeBytes(notification.getPayload());

		// 写入Notification identifier
		out.writeByte(Item.NOTIFICATION_IDENTIFIER);
		out.writeShort(4);
		out.writeInt(notification.getId());

		// 写入Expiration date
		out.writeByte(Item.EXPIRATION_DATE);
		out.writeShort(4);
		Date expirationDate = notification.getExpirationDate();
		if (expirationDate == null)
		{
			out.writeInt(0);
		}
		else
		{
			out.writeInt((int) (expirationDate.getTime() / 1000));
		}

		// 写入Priority
		out.writeByte(Item.PRIORITY);
		out.writeShort(1);
		out.writeByte(notification.getPriority());

		// 回退到该写入frameLen的位置,写入frameLen,再重新设置write index
		int currentWriteIndex = out.writerIndex();
		out.writerIndex(1); // 因为command后面就是len,而command是1 byte。
		out.writeInt(currentWriteIndex - frameLenIndex);
		out.writerIndex(currentWriteIndex);
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信捐助,加入it技术扣扣群),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

0
0
分享到:
评论

相关推荐

    Java向苹果服务器推送消息(Java实现HTTP/2协议发送APNS)

    Java向苹果服务器推送消息是iOS应用开发者经常遇到的需求,用于实时通知用户新的信息或系统状态。APNs(Apple Push Notification service)是苹果公司提供的推送服务,允许开发者将消息推送到用户的iOS设备上。本...

    notnoop-java-apns.zip_com.notnoop.apns_java apns_notnoop apns_no

    总之,`notnoop-java-apns`是一个强大的Java库,它简化了与苹果APNS服务器交互的过程,使得开发者能快速实现iOS和Apple Watch应用的推送通知功能。使用这个库,开发者可以专注于通知内容的构建,而无需关心底层网络...

    关于IOS_APNS推送消息(iphone端+服务端)

    在iOS应用开发中,Apple Push Notification service (APNs) 是苹果公司提供的一个关键服务,用于向用户的iPhone设备发送远程通知。这些通知可以是系统级别的消息,也可以是应用程序自定义的内容,比如新消息提醒或者...

    最新java整合APNS推送服务

    Java整合APNS推送服务是将Java应用程序与Apple Push Notification Service(APNS)相结合,以便能够向iOS和tvOS设备发送即时消息。APNS是苹果公司提供的一个服务,它允许开发者在用户不打开应用的情况下,向他们的...

    ios APNS推送服务器代码pushMe

    ios APNS推送服务器php核心代码pushMe

    IOS APNS 官方开发文档

    ### IOS APNS 官方开发文档关键知识点解析 #### 关于本地通知与推送通知 - **本地通知与推送通知概述**:本地通知和推送通知在iOS应用开发中扮演着重要的角色,它们帮助开发者向用户传递信息,提升用户体验。这两...

    [其他文档] ios APNS推送服务器代码pushTest

    在iOS应用开发中,Apple Push Notification service(APNS)是一项重要的服务,允许开发者向用户的设备发送远程通知。本文将深入探讨APNS的工作原理、PHP服务器端实现以及如何使用`pushTest.php`进行推送。 首先,...

    iOS创建EMM_APNS证书流程.docx

    在iOS开发过程中,为了实现设备间的消息推送服务,开发者需要创建EMM_APNS(Enterprise Mobility Management Apple Push Notification service)证书。这个过程涉及到一系列步骤,确保应用程序能够安全地接收来自...

    Apple推送服务(APNs)Java客户端zpush.zip

    Apple APNs java client, based on netty4. 基于netty4实现的苹果通知推送服务Java客户端。 特点: 支持第三版通知推送,即command = 2。目前的绝大部分Java客户端都只支持command = 1,即第二版。 ...

    ios 开发制作push证书(apns)

    而制作APNs(Apple Push Notification service)证书是实现iOS推送通知的前提。本知识点将详细介绍如何制作APNs证书,包括创建证书、备份、以及将证书转换为PEM格式的详细步骤。 首先,制作APNs证书需要准备以下几...

    java调用apns推送的实现

    Java调用APNs(Apple Push Notification service)推送是iOS应用开发者在进行远程通知服务时常见的需求。APNs是苹果提供的一项服务,允许开发者将实时消息推送到用户的iOS设备上,如应用更新、消息提醒等。在Java...

    APNs推送Demo,适配iOS8.0+

    Apple Push Notification Service(APNs)是苹果公司提供的一项服务,允许开发者向运行iOS、iPadOS、watchOS、macOS以及tvOS的应用程序发送实时的通知。这个"APNs推送Demo,适配iOS8.0+"是一个示例项目,帮助开发者...

    ios推送java服务端

    在iOS应用开发中,为了实现实时的消息推送功能,通常会使用Apple Push Notification Service (APNS)。在Java服务端实现iOS消息推送涉及到以下几个关键步骤和技术: 1. **应用程序注册消息推送**: 当用户首次启动iOS...

    ios推送java写的后台

    总结,使用Java编写iOS推送后台涉及到证书管理、APNs连接、推送消息构建和发送、错误处理等多个环节。理解这些知识点并熟练应用,可以帮助你构建稳定、高效的推送系统。在实际开发中,还需要根据项目需求和服务器...

    java(后台) ios 推送(APNS) 源码+支持jar包

    java(后台) ios 推送(APNS) 源码+支持jar包,代码经测试没问题,包含4个jar包:javaAPNS2.2、log4j、org.bouncycastle.jce1.39.0、apache.common.lang所属包

    ios 消息推送 java后端demo(包括jar包)

    这个“ios 消息推送 java后端demo”是为开发者提供的一个示例,帮助理解如何使用Java后端实现对iOS设备的消息推送。下面将详细介绍iOS消息推送的原理、Java后端实现以及压缩包中可能包含的内容。 一、iOS消息推送...

    Java_APNS:Java APNS 服务器

    Java APNS,全称为Apple Push Notification service,是苹果公司提供的一项服务,允许应用程序开发者向iOS、iPadOS、watchOS和macOS设备发送实时通知。在Java中实现APNS服务器,可以让我们利用Java强大的编程能力来...

    iOS苹果推送apns测试工具.zip

    在iOS应用开发中,苹果推送服务(Apple Push Notification service,简称APNs)是苹果公司提供的一项功能,允许开发者向已安装其应用的iOS设备发送消息、通知和其他数据。`iOS苹果推送apns测试工具.zip`文件包含的...

    IOS推送APNS必须的三个包

    综上所述,"IOS推送APNS必须的三个包"可能包括APNS证书、Java APNS库(或类似的库文件“pns”)以及其他必要的配置文件,这些都是在iOS应用中实现推送通知所不可或缺的组件。通过理解和运用这些知识点,开发者可以为...

    java进行苹果APNS消息推送

    Java进行苹果APNS(Apple Push Notification Service)消息推送是一项在iOS和macOS应用程序中实现远程通知功能的关键技术。本文将详细介绍如何使用Java实现这一过程,同时关注`javapns`库和`bcprov-jdk`加密组件的...

Global site tag (gtag.js) - Google Analytics