IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

Vimer 2014-11-30 23:13:54 累计浏览 4,679 次
本机暂存

   经过这么久在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. 「置顶」我做了什么 (2026-05-05 12:13:28)
  2. 万字长文推演:手机不再从 App 开始,Agent OS 如何接管任务入口 (2026-04-28 14:57:22)
  3. Android Perfetto 系列 10 - Binder 调度与锁竞争 (2025-11-16 15:33:30)

查看更多 移动开发 文章 →

建议继续学习

  1. 情绪版(Mood board)操作流程的新思考 (累计阅读 41,753)
  2. android 开发入门 (累计阅读 19,528)
  3. 介绍几个QQ开源项目及协议下载 (累计阅读 10,220)
  4. Android 连接SSID隐藏网络以及 LEAP 认证的方法 (累计阅读 9,539)
  5. 让安卓手机通过代理翻墙的方法 (累计阅读 9,116)
  6. 手机产品设计方向 (累计阅读 7,953)
  7. 实时监控Android设备网络封包 (累计阅读 6,557)
  8. Eclipse开发Android应用程序入门:重装上阵 (累计阅读 6,460)
  9. 基于 PhoneGap 与 Java 开发的 Android 应用的性能对比 (累计阅读 6,409)
  10. Android用户界面设计:表格布局 (累计阅读 6,186)