只需五步,即可基于Netty框架实现Android内网推送功能。

一、先引入依赖,客户端和服务端用的都是同一个依赖netty-all。

  Android Studio中Gradle配置:

compile 'io.netty:netty-all:5.0.0.Alpha2'

  IDEA中Maven配置:

<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-all</artifactId>
    <version>5.0.0.Alpha2</version>
</dependency>

二、创建消息模块包。

  目前demo中消息包共如下6个类:

  1.BaseMsg

  BaseMsg

  2.Constants

  Constants

  3.LoginFailMsg

  LoginFailMsg

  4.LoginMsg

  LoginMsg

  5.MsgType

  MsgType

  6.PushMsg

  PushMsg

  但要注意,客户端包名和服务端包名必须一致,否则会报如下错误:

八月 11, 2016 10:37:57 上午 io.netty.channel.DefaultChannelPipeline$TailContext exceptionCaught
警告: An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.codec.DecoderException: java.io.InvalidClassException: failed to read class descriptor
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:347)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:230)
at io.netty.channel.ChannelHandlerInvokerUtil.invokeChannelReadNow(ChannelHandlerInvokerUtil.java:84)
at io.netty.channel.DefaultChannelHandlerInvoker.invokeChannelRead(DefaultChannelHandlerInvoker.java:153)
at io.netty.channel.PausableChannelEventExecutor.invokeChannelRead(PausableChannelEventExecutor.java:86)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:389)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:956)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:127)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:514)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:471)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:385)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:351)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
at io.netty.util.internal.chmv8.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1412)
at io.netty.util.internal.chmv8.ForkJoinTask.doExec(ForkJoinTask.java:280)
at io.netty.util.internal.chmv8.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:877)
at io.netty.util.internal.chmv8.ForkJoinPool.scan(ForkJoinPool.java:1706)
at io.netty.util.internal.chmv8.ForkJoinPool.runWorker(ForkJoinPool.java:1661)
at io.netty.util.internal.chmv8.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:126)
Caused by: java.io.InvalidClassException: failed to read class descriptor
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1604)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at io.netty.handler.codec.serialization.ObjectDecoder.decode(ObjectDecoder.java:75)
at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:343)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:316)
... 18 more
Caused by: java.lang.ClassNotFoundException: org.netty.module.LoginMsg
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at io.netty.handler.codec.serialization.ClassLoaderClassResolver.resolve(ClassLoaderClassResolver.java:31)
at io.netty.handler.codec.serialization.CompactObjectInputStream.readClassDescriptor(CompactObjectInputStream.java:55)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1602)
... 25 more

  我这里包名统一为org.netty.module。当然我也不百分百确定是不是这个原因,所以如果有了解的望能指点一下。。多谢了!

三、服务端添加Handler,Bootstrap,ChannelMap:

  1.NettyServerHandler,用于进行接收处理客户端消息、断线重连、异常处理等操作。

  NettyServerHandler

  2.NettyServerBootstrap引导程序,用于进行启动服务、推送消息、通道操作等操作。

  NettyServerBootstrap

  3.NettyChannelMap,用于进行存放、添加、删除通道等操作。

  NettyChannelMap

四、客户端添加Handler和Bootstrap:

  1.NettyClientHandler,用于进行接收处理服务端消息、断线重连、异常处理等操作。

  NettyClientHandler

  2.NettyClientBootstrap引导程序,用于进行通道创建、通道关闭、通道状态检测等操作。

  NettyClientBootstrap

  至于那个ServerInfoModel无视就好。。。那是我模型层中存取ip用的一个类,各位直接给host附上ip(如:192.168.1.123)即可。

  端口我这里写死为9999。

五、启动服务端和客户端相关程序完成推送。

  1.服务端调用引导程序中的create方法(端口不写9999的话需要把客户端端口改成一致)。

  2.客户端配好正确的ip后调用引导程序中的create方法,用户名和密码按服务端Handler中isLogin方法来即可。

  3.服务端调用引导程序中的pushAll方法,即可完成推送。

  但如果没有现成程序直接移植进去调用的话,可以用我这个JFrame暂时测试一下:

  TestFrame

  以及它的PushServer测试类:

  PushServer

 

最后:

Demo地址:

http://download.csdn.net/detail/chaoxiyouda/9455584

(注:这个demo是旧的,勉强能用,但上面的那些代码都是最新的,所以大家要用的话可以把上面的那些代码和这个旧demo结合起来进行参考使用。本人略懒就不再整理一份啦,蛤蛤蛤。)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netty是一个基于Java的异步事件驱动的网络应用框架,而小程序消息推送是指将消息实时推送给用户的通知服务。Netty可以通过以下步骤实现小程序消息推送: 1. 小程序客户端向服务器发起连接请求:首先,小程序客户端要与服务器建立连接,可以使用Netty的客户端模块来实现,在请求连接时可以携带所的信息和权限认证。 2. 服务器端接收连接并处理:服务器端要使用Netty的服务端模块来接收客户端的连接请求,并进行相应的处理。可以采用Netty的事件处理机制来监听连接事件,一旦有新的连接建立,就可以处理相关逻辑,如消息的推送和处理。 3. 消息推送:一旦建立了连接,服务器端就可以向客户端发送消息了。Netty的Channel模块提供了丰富的消息传输方式,可以通过ChannelHandler来定义消息的处理逻辑,然后将消息推送给客户端。可以根据业务求选择合适的消息传输方式,比如WebSocket、TCP等。 4. 异常处理:在消息推送过程中可能会出现各种异常情况,比如网络波动、连接断开等,Netty提供了丰富的异步事件处理机制和异常处理逻辑,可以及时处理这些异常,保证消息推送的可靠性和稳定性。 总的来说,Netty提供了灵活且高效的网络通信能力,可以很好地支持小程序消息推送实现。通过合理的使用Netty的各种模块和功能,可以实现小程序消息推送的即时性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值