文痞

人不是向外奔走才是旅行,静静坐着思维也是旅行,凡是探索、追寻、触及那些不可知的情境,不论是风土的,心灵的,还是科技的,都是一种旅行

推聊使用与定制高级指南

推聊是一个基于极光推送的Android手机聊天系统。支持群聊与点对点聊天。当前包括Android客户端与Java服务器端。3分钟就可以整套系统跑起来。

开源项目官方网站 http://github.com/good-life/pushtalk

功能与特点 功能列表 频道里群聊 与其他用户点对点聊天 聊天支持文字、表情、URL等 创建频道、加入频道 注册用户(不需要密码) 我的频道 我的最近聊天 聊天记录缓存 客户端选择聊天服务器、添加聊天服务器 特点 简单到极致的 http 聊天服务器:一个 jar 包跑起来 轻量级客户端:聊天界面使用 Webview 的方式 下行消息推送基于 JPush(一个免费的第三方 Android Push 服务),上行消息采用 http 请求的方式实现 聊天服务器 推聊的服务器端使用 Java 语言编写,基于最简单实用的开源框架。

http 服务器使用 Jetty:轻量级的 Java Servlet 容器。 数据库使用 H2: 轻量级的 Java 内存/文件数据库。 页面模板使用 Freemarker:轻量级的 Java 页面模板引擎。 打包时集成为一个整体 jar 包(包含所有的依赖包) 要运行推聊服务器端,请在 github 文件下载页 https://github.com/good-life/PushTalk/downloads/ 下载推聊服务器 jar 文件。

使用如下命令运行服务器:

java -Dfile.encoding=UTF-8 -jar pushtalk-server-with-dependencies.jar 注:实际的文件名后边一般会加上一个版本号。

上述命令运行后:

一个 http server 启动了,监听端口为 10010 浏览器里输入 http://localhost:10010 则可以访问到界面 要正确地运行服务器,需要通过客户端访问 推聊服务器默认使用 10010 端口。可以在上述命令后指定使用另外的端口。比如以下命令指定使用 10011 来启动推聊聊天服务器:

java -jar pushtalk-server-with-dependencies.jar 10011 Android 客户端 客户端运行,请在 github 文件下载页 https://github.com/good-life/PushTalk/downloads/ 下载 Android apk 安装到 Android 手机即可。

你也可以自己编译 /client-android 项目之后安装到手机。

客户端默认内置官方聊天服务器地址。也可以直接在客户端添加新的服务器,选择新的聊天服务器。

如果你有服务器资源,可以长期运行,欢迎你架设推聊聊天服务器,请添加到以下的页面。经过测试没有问题,会被选择预置到客户端代码里:

https://github.com/good-life/PushTalk/wiki/PushTalk-Third-Party-Servers

推聊使用与定制高级指南

上篇推聊首发的文章,简单地描述了怎么样使用、跑起来推聊。本文不会重复这些内容。如果你对推聊没有基础的了解,请参考前文:首发:推聊 - 3分钟可运行起来的开源 Android手机聊天系统。

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

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

使用不同的极光推送 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 JPUSHUSERNAME = “pushtalk”; public static final String JPUSHPASSWORD = “654321”; public static final String JPUSH_APPKEY = “7d431e42dfa6a6d693ac2d04”;

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

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

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

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

聊天相关的几个界面换成 Android Activity 相关界面的数据,需要适当地修改服务器端 Servlet,把原来输出 HTML 改成输出 JSON。 测试模式 Android 客户端有一个 ISTESTMODE 配置项。如果为 true,则:

所有的的消息都会显示到通知栏 如果 ISTESTMODE 为 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/AndroidUtil 里 getUdid 方法。

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

分享到: 返回主页