技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统架构 --> 手机应用/服务器开发的一些总结(一)

手机应用/服务器开发的一些总结(一)

浏览:3416次  出处信息

   经过这么久在android客户端和服务器端的开发,感觉还是积累了不少东西想要和大家分享一下,但是好想单独拎一个点出来又不太值得,所以就汇集到一起写成系列吧。

   一. 关于用户数据存储

   首先在注册的协议里,定义如下公共传输字段:

   version: 这个其实是xml中配置的versionCode。versionName个人认为没有什么必要,所以就不传了。

   channel:  用户渠道,这个和xml中的UMENG_CHANNEL 是共用的,因为一直在使用umeng,所以这样定义反而清楚一些。

   device_id: 设备ID

   os: 操作系统类型,这里默认传入android

   os_version: 操作系统版本

   对于小数据量,用户数据存储在mysql中是相对较好的选择,这里直接以django的model为例:

from django.db import models
class User(models.Model):
    device_id = models.CharField(max_length=255, null=True, blank=True)
    version = models.IntegerField()
    channel = models.CharField(max_length=64, null=True, blank=True)
    os = models.CharField(max_length=64, null=True, blank=True)
    os_version = models.CharField(max_length, null=True, blank=True)
    create_time = models.DateTimeField(default=get_cur_time)
    login_time = models.DateTimeField(default=get_cur_time)

   如果需要用到如facebook之类的联合登录,对于小规模的服务,我个人倾向于不破坏User的定义,因为毕竟这种联合登录什么时候会加入很难预知:

class FBUser(models.Model):
    # facebook 用户ID
    userid = models.CharField(max_length=32, unique=True)
    # User.id,这里不用外键,是为了以后拆分表或者换数据存储留下后路
    native_id = models.IntegerField(default=0)

    def __unicode__(self):
        return '%s->%s' % (self.userid, self.native_id)

   其他的业务相关的字段定义就由业务自己决定了。

   我不是很建议在未来可能数据量很大的表里使用 外键,因为很可能以后要设计到分库分表、或者迁移数据到redis、mongodb之类的,这在我之前的博文里面就有提到过,大家有兴趣可以看一下。

   

   二. 关于通信协议的选择

   其实这块还真的有不少东西可以说的。

   HTTP

   最简单的肯定是用http协议,但是http协议在手机应用上其实只能满足传统一收一发的需求,即使是使用long poll之类技术,经过我测试,当在3G网络下时,运营商经常会强制返回http请求为502错误。

   WebSocket

   当然,如果对http还是心有所属,可以使用 websocket,经过测试 websocket还是比较好用的,cocos2d-x 有专门提供websocket的封装,android下也有专门的websocket的库: AndroidAsync

   python也提供了很多websocket的server和client。比如server端有 gevent-websocket、以及在其基础上开发的flask plugin: flask-sockets。当然django也是可以直接使用gevent-websocket的,django还有一个不基于gevent的版本:django-websocket。client端有 websocket-client

   基于gevent的server之前测试过,可以正常的收到断掉链接的消息,逻辑处理也都比较正常。最终要的一点是,他可以和现有http服务器无缝结合,不需要做跨进程在两个server间通讯。

   SocketIO

   这个我也测试过,但是实在不建议大家在项目中使用,他做了太多的兼容的事情了,而我们客户端又不是浏览器,根本不需要考虑那么多事情,只要用一种协议就可以了。

   还有一点就是,我试了下python的socketio server似乎有点问题,在客户端主动close链接时,服务器端并没有收到事件,而只有客户端发送disconnect命令才会触发服务器端的相关事件。这个事情在网上查了一下,貌似是官方故意做的处理,防止浏览器在刷新时触发一些奇怪的事情,但是这样处理对于我是无法忍受的。

   不过还是把相关的链接发给大家,大家可以试一下。android客户端:还是  AndroidAsync。 python server端:Flask-SocketIOdjango-socketio,python client端:socketIO-client

   原生socket+自定义协议

   这种方式灵活度肯定是最高的,但是相应的开发难度肯定也会增大。协议可以使用json或者google 的 protobuf。这个可能一两句话还说不清楚,下一篇我们专门花篇幅聊一下。

   

建议继续学习:

  1. 实时监控Android设备网络封包    (阅读:5018)
  2. 手机应用/服务器开发的一些总结(二)    (阅读:3049)
  3. iOS设备唯一标识获取策略    (阅读:2552)
  4. Android桌面应用的设计探讨    (阅读:1939)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1