(先讲一个题外话 使用预订单技术可以减小服务器压力)
假如我们点外卖,这之间会有一系列的步骤,假如商家接单了,状态肯定会更新,我们的UI也会同步的转换到下一个状态。那么我们是怎么获知这个状态呢?
1.伪推送,用户每10秒向服务器请求一次。但是其缺点:因为请求由间隔,所以延迟了;网络请求零散,电量消耗巨大(当然了,如果时间间隔久,这么做也许是一个不错的选择)
2.服务端主动push,我们可以集成sdk,也可以自己实现一套
开源方案
XMPP耗流量
MQTT很棒(一个不错的实现https://blog.youkuaiyun.com/github_33304260/article/details/73692589)
开源sdk
友盟,小米,百度,极光
本文讲述下怎么自己实现,主要目的是了解下Socket编程和推送的一些原理,真正开发的时候还是集成为主
如何实现?
Java提供了Socket类,封装了许多TCP的操作(Socket相当于快递员,也是TCP/IP的封装者)
我们这里需要几个功能
1.和服务器建立连接
2.发送数据给服务器
3.接受来自服务器的数据
4.心跳包的实现
建立TCP连接的核心代码
3个参数
1.server_url
2.tcp_port
3.connect_timeout
mSocket = new Socket();
mSocket.connect(new InetSocketAddress(server_url,tcp_port),connect_timeout);
mSocket.setKeepAlive(true);
发送消息
发送的是字节数据,需要3块内容
1.协议头
2.协议主体内容
3.校验码
接受消息
类似于发送,用DataInputStream读取数据
心跳包的实现
为什么要用心跳包?
因为客户端使用的是代理网络,我们会把客户端的ip改成公网ip后再传输给服务端,而公网的端口是有限的,所以5分钟内没有消息传输,这个端口就可能会被占用了。
接下来的任务就是写个线程每隔一段时间发送消息给服务端了。也可以用AlarmManager。
注意事项
HTTP1.x,服务端是不可以主动推送的,客户端发个试探请求后,服务端会阻塞,知道有新消息到来,然后写消息回去。所以客户端需要在收到消息后,继续推送一个试探消息,以便于服务端的信息的返回。