Netty框架的学习经历开始篇--一点工作经历

之前遇到一客户需要做硬件联网,类似于售卖机的东西,于是有了用socket来搞的想法,结果真的可行。

以下的想法我想可以迁移到大多数类似的项目中。

该项目需求:客户需要让他的售卖机能够互联,由统一后台管理,而且在售卖机买东西的客人直接扫描机器上的二维码就可以转到商城,在商城中选择商品,比如热饮,那么售卖机就会自动制作热饮,客户用微信或支付宝支付即可,不需要再由人工在售卖机旁边守候,且如果售卖机有故障,或者缺水之类的,可直接发送短信给最近的维护人员进行处理。

解决方法:商城:在二维码中包含设备信息,以区分哪台设备。用户通过支付宝或微信支付时连接中包含商品信息,在发起支付时存储设备和商品信息,得到支付成功信息后回写支付成功标志。

如何告知售卖机应该出那种产品?

商城中建立一个socket服务端,售卖机上由一个可联网的硬件设备充当socket客户端,主要是用来透传设备数据。

首先,售卖机发送一个设备id或者说socket的id到服务端,服务端记录该id并与事先编制好的编号匹配,并记录该socket的信息,如登录时间

其次,售卖机会每隔3分钟发送一次心跳(间隔时间可调),以维持连接以免服务端下发信息时连接不上客户端。

然后,售卖机会发送当前状态到服务端,服务端接受到后就会进行判断处理,无论是否正常都会发送一个已收到的标识码到客户端,告诉客户端我知道了,那么客户端就停止发送状态

那么,如果售卖机时空闲正常的,那么服务端就检查数据库中的订单表是否有订单,如果有,服务端推送消息告诉客户端要出售什么东西,如果没有,服务端静默等待订单。当有订单时,且售卖机空闲那么发送订单信息到售卖机。当售卖机由忙碌转为空闲状态时,服务端就去检查订单表,以此循环。如果服务端发生重启,那么向售卖机发送重置状态指令,使其重新发送当前状态。

问题:

该socket通讯使用的时java自带的socket,属于bio通信模式,也就是说阻塞式的,问题多多。

1、等待客户端连接accept()就需要一个线程去维护,不然就会导致线程堵塞,整个程序都要等待,所以需要专门一个线程来处理accept。

2、每次有客户端连接过来就要new一个线程出来,用来专门处理该客户端的io。

3、因为各个售卖机时同样的处理模式,也就是客户端的线程里的处理程序是一样的,所以不需要多个不同的实例来面向不同的设备,每次new线程时,new一个相同的实例出来就行了,但问题在于,所有的实例都是一样的内容,那么io如何区分呢,那就要map去绑定socket与io的关系,通过socket第一次发送的id来区分不同的socket,虽然程序本身也没有将不同的socket混在一块但是你要知道当所有的设备socket客户端都连接到了服务器时,当有订单触发时到底发送给那个设备,而该设备的io流是哪个。

4、商城是二次开发的一个php商城,最为头疼的地方其实在这,于是用php写了个socket客户端,当有订单时通过socket客户端与server通讯,告知server有订单,让server去服务端查询。一开始也想用php写一个serversocket,但是技术有限,而且php是解释性语言,边解释边执行,没有很好的简便的方法做到让其一直在后台静默执行,php是事件驱动的无法自发运行。

目前java serversocket已经运行半年多了,但是问题多多,首先,当设备增加到50台的时候就行了服务器扩容升级,线程太多,对于java来说线程就是他的生命。稀缺资源。而且日志输出上,需要定期处理,而且有时会卡硬盘,那么有什么办法解决呢?

最后选定了两个框架,netty与mina。

不再论述它俩的区别。通过一阵的研究,感觉netty要比mina配置起来简单,而且稳定性要好,但是效率要比mina低。

所以从netty入手开始搞起,如果有时间再研究mina

得休息了,明天继续


爱编程,爱学习,爱挑战。

程序猿就是我,我就是程序猿。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值