用Java开发IOT离不开Netty框架

    Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。如果你的服务程序面对少量的客户端,那么用不用Netty都可以,阻塞方式的socket就足以完成任务,也谈不上资源浪费。而如果面对千级万级的客户端连接,用Netty是首先。网上很多文章讲Netty时都说性能如何如何高,其实并不是Netty的能力多么强,像多路复用是Linux内核的能力。DIRECT BUFFERS,这个本来就是JAVA的自身缺陷的一个弥补,你用C++写程序就没这一说。总之呢,个人观点,用Java写服务端涉及TCP/IP协议用Netty是正路,但不要认为Netty本身多么强大。基于Netty的代码示例网上很容易找到,以下只谈需要注意的几点。

1. 先确定单实例还是多实例 

.childHandler(new ChannelInitializer<SocketChannel>() {

  @Override

   protected void initChannel(SocketChannel ch) throws Exception {

    ChannelPipeline pipeline = ch.pipeline();

    pipeline.addLast(new AInboundHandler());

   }

 });

以上是Netty的初始化的代码。这个AInboundHandler用于实现具体的读写。在网上搜的示例大多数是这样的,这其实是单实例。就是说对于任何客户端的请求的处理,都只用AInboundHandler的一个实例。假如你的服务端程序保存了每个客户端的一些属性,那显然单实例不符合要求,就要用到多实例。多实例的写法是 pipeline.addLast(objFactory.getObject());

这样就可以把每个客户端的属性放到实例中,读写非常方便。  

2. 初始化要放在一个线程中

还是上面的初始化代码,接着会有这样一句,

ChannelFuture cf = bootstrap.bind(ip, port).sync();

cf.channel().closeFuture().sync();

建议把整个初始化代码放在一个线程中执行。

3. 加入事件用于处理客户端长期不发送数据的情况 

如果多个客户端连接后长期不发送数据,服务端应该主动关闭socket。

pipeline.addLast(new BInboundHandler());   

这个BInboundHandler的定义大致如下:

class BInboundHandler extends ChannelInboundHandlerAdapter{

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object event) throws Exception {
        //超时事件
        if (event instanceof IdleStateEvent) {
            IdleStateEvent idleEvent = (IdleStateEvent) event;
            //读超时。指定时间内没有读取到任何数据则主动关闭SOCKET
            if (idleEvent.state() == IdleState.READER_IDLE) {                
                ctx.channel().close();  //主动关闭
            }
            //写超时。
            else if (idleEvent.state() == IdleState.WRITER_IDLE) {                
            }
        }
        super.userEventTriggered(ctx, event);
    }
}

4.  请求数据量大的时候记得缓存

如果客户端发送过来的数据量比较大,别指望channelRead单次就能得到全部数据。最好的办法是通过协议来判断本次接收后是否是完整帧。如果不是则缓存当前数据继续等待下次接收,直到接收到完整帧或者缓冲区满。

public void channelRead(ChannelHandlerContext ctx, Object msg)

最后,用Netty开发IOT服务端程序确实感觉非常爽,如果没有ByteBuf,那用Java写自定义TCP/IP协议会非常痛苦。

“物联网透传工具”的服务端就是基于Netty开发的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值