Skip to content

推聊使用与定制高级指南

good-life edited this page Dec 4, 2012 · 4 revisions

推聊从客户端到服务器端,开源了全部的源代码。所以理论上,本文的全部信息,你都可以直接解读源代码来得到。

本文的目的在于,减少开发人员熟悉推聊的时间,同时给些定制、改进的建议。

使用不同的极光推送 AppKey

推聊是基于极光推送来做下行的聊天消息推送的。

推聊开源项目代码里默认采用我注册的极光推送的一个 AppKey。只是用于测试目的是没有问题的,正如现在你所看到:安装 apk 就可以用了。跑起来一个你自己的服务器,在客户端指定连接到你自己的这个服务器,也可以正常地聊天。

但是,如果你想要把推聊用于你的团队、社区,作为正式的沟通工具,或者集成到你自己的应用里边去,则建议你,使用你自己注册的极光推送 AppKey。

注册极光推送,请登录其官方网站:http://jpush.cn,注册开发者帐号,创建一个应用,填写你自己要用的 Android应用包名,之后取得一个 AppKey。

之后,在 Android 客户端的 AndroidManifest.xml 配置文件里,在如下的这一行,填上你新取得的 AppKey。

还有需要特别提醒注意的是:上面你创建应用时使用的包名,需要确保就是当前 Android 应用程序的包名。

在服务器端,找到这个源文件:`/src/org/pushtalk/server/Config.java,里边有如下 3 个配置项:

public static final String JPUSH_USERNAME = "pushtalk";
public static final String JPUSH_PASSWORD = "654321";
public static final String JPUSH_APPKEY = "7d431e42dfa6a6d693ac2d04";

上面这 3 个配置项都需要改到你在极光推送注册得到的相应值。

客户端与服务器端都做好上面提及的变更后,基于你自己的极光推送帐户的定制版推聊就可以正常运行起来了。这样,你也可以自己的帐户登录极光推送开发者平台,看到些定制版推聊的统计信息了。

Android 客户端

Android 客户端体验改进

当前的 Android 客户端,主要的聊天界面是使用 WebView 的方式实现的。也就是说,界面信息都是从服务器端拉取过来的。所以,网络不好时,界面显示必然会慢,页面响应流畅度比 Native 方式实现的差很多。

如果你想要定制推聊,你完全可以考虑自己来创建一个 Native (本地化)版本的 Android 客户端,以提高客户端体验。需要的工作量不会很大,主要体现在:

  • 聊天相关的几个界面换成 Android Activity
  • 相关界面的数据,需要适当地修改服务器端 Servlet,把原来输出 HTML 改成输出 JSON。

测试模式

Android 客户端有一个 IS_TEST_MODE 配置项。如果为 true,则:

  • 所有的的消息都会显示到通知栏

如果 IS_TEST_MODE 为 false,即正常模式,则:

  • 自己发送的消息,不会显示到通知栏
  • 当前你正在某个聊天频道时,这个频道过来的消息,不会显示到通知栏。因为已经在当前的聊天窗口直接显示了。

代码里默认配置是 true。请根据需要改变。

推聊服务器端的性能

推聊服务器的性能,因其底层消息是基于极光推送的,而极光推送是专业的消息推送平台,所以消息流转方面肯定不会是问题。主要应该在两个部分:

  • 轻量级 Servlet容器 Jetty
  • 轻量级的 Java 内存/文件数据库 H2

以下分别从这两个方面描述。

Servle容器改进

Jetty 能够容纳万级同时在线么?

我还真答不出来。但是,当前的 Jetty 默认配置肯定是不行的。请参考 Jetty 相关文档,应该是可以在启动时指定一些参数,来配置 Java 内存,以提高负载。

如果发现不行,则一般的选择,就是切换到 Tomcat 了。主要的改动在于,要把 org.pushtalk.server.JettyServer 里配置的 Servlet 改到 Tomcat 里的 web.xml 里来。所有 Servlet 实现不需要改动可直接使用。

单机 Tomcat 还搞不定? 这就超出了本文的范围了,已经不是推聊本身要去解决的问题,是架构上的事情。

数据库改进

推聊的数据库使用 H2,一个轻量级的 Java 内存/文件数据库。当你把推聊 Java Server 启动时,就在当前用户主目录下去找 pushtalk.h2.db 的文件。如果不存在,则创建一个新的。

这个数据库保存的只有:注册用户列表,频道列表,频道与用户之间的关系表。

本人没有做过具体、深入的测试,但根据官网的说明,估计这个数据库支撑推聊 10 万级同时在线的用户量应该没有问题。

如果有需要,你可以改进推聊的数据库实现,使用自己的的数据库,比如 Mysql。代码层面具体一点就是,自己另外写一套 org.pushtalk.server.data.TalkService 的实现。

聊天历史记录定制

当前的聊天记录,是这样实现的:

  • 服务器端缓存,没有保存到数据库。缓存策略上,默认是:每个频道最近 7 天内的 100 条记录。
  • 客户端聊天界面是 WebView实现,每次进入界面时去拉取最近的缓存。

上面的实现也是为了简化。如果你有进一步的定制化需求,可以多做些事情:

  • 服务器端把聊天记录写到数据库。这对数据库的负载会提高很多。
  • 或者,甚至当前客户端 WebView 实现,把聊天记录写入客户端 Web 数据库。从而不必进入一个新的聊天界面,每次去拉取全部的聊天记录,只需要拉取最近的。这可一定程度上减少网络流量、提高体验
  • 或者,如果本地改成 Android Native 客户端实现,则直接在本地写 Android SQLite 数据库。这样也是需要聊天记录时,只需要拉取最新的。

增加图片与语音支持

推聊现在没有发送图片、语音的功能。

现有的技术架构上,是不需要做大的改变就可以新增支持的,但工作量则要增加不少。

图片、语音支持的基本原理是这样的(一般的聊天应用都是类似这样的):

  • 客户端本地拿到文件:照片或者语音文件(甚至其他附件)
  • 上传文件到服务器,得到唯一的文件ID
  • 把得到的文件ID,像发送文本聊天消息一样,发送到对端
  • 对端客户端收到这个消息后,解析得到文件ID,从文件服务器下载拿到文件
  • 客户端展示文件给用户

从上述原理来看,增加图片、语音功能,主要的工作量在两个地方:

  • 客户端对文件的处理、上传、下载
  • 文件服务器:更多的资源占用,更复杂的服务器逻辑

用户体系

现在的用户体系,是相对简单、直观的:依赖于每个手机(或者平板)的 UDID/IMEI,不记密码,只第一次访问时填写用户名。

也就是说:不同的手机,必定是不同的用户。也不允许同名。

对于 Android 手机,有部分是无法取得 IMEI 的。针对这个问题,有几个策略,最终目的还是尽可能保证每个手机的 UDID 是不同的。具体请看 Android 客户端代码 org/pushtalk/android/utils/AndroidUtilgetUdid 方法。

这个用户体系是简单的,但是,不够严密。如果你想要把推聊用于非常严密的交流场景,即模仿别人的用户名是会有很大的好处的,那么,这套没有登录密码的用户体系不满足要求。你需要改进,使用标准的用户名、密码机制。