您的位置:首页 > 移动开发

基于Google AppEngine的XMPP和Channel Service的机器人+Web群聊的一些实现思路和简介

2011-01-18 04:50 405 查看
Google AppEngine提供了很好的服务,最近在AppEngine上做了一个机器人+Web群聊的东西,今天主要简单介绍一下Service中的XMPP Python API和The Channel API(Python)以及群聊实现的一些思路。

XMPP是全称Extensible Messaging and Presence Protocol,是一种以XML为基础的开放式实时通信协议,XMPP Python API封装了XMPP协议,提供了非常简单实用的API。API一共提供了三个方法,分别是get_presence(获取用户是否在线),send_invite(给某个用户发送邀请),send_message(给用户发送信息,这个方法提供了群发功能)。细节参见这里

API还提供了一个封装了消息的类Message,提供了发送者,接收者,信息主体等信息,还提供了一个实例方法reply(回复信息)。细节参见这里

群聊的情景是,一方是用户,一方是服务器机器人,当一名用户发送消息后,机器人转发该信息给所有群用户。

当用户给机器人发送消息时,其实就是POST信息到/_ah/xmpp/message/chat/,可以利用上面说到了Message类将POST过来的数据进行封装,然后获得相关信息,再通过send_message方法转发给所有的群用户。

这个机器人版本的群就好了,很简单。如果你有兴趣了解XMPP协议的具体内容,GIYF(Google Is Your Friend)。关于XMPP协议上面涉及到比较重要的概念有jid,和信息格式。

题外话Google Talk就是基于XMPP协议的聊天软件。

对于Web网页版聊天,发消息实现起来简单,只要POST一条数据给服务器,然后Ajax刷新刚才发送出去的东西就好了。而对于Web客户端接收消息,存在一个技术方面的难点。我们都知道HTTP是无连接的,也就是浏览器请求服务器后,Web客户端和服务器就失去了链接,而且是Web客户端主动请求服务器,服务器才会给你返回相应的内容,而服务器是不会(可能由于安全原因)请求你接受什么的。

原始的方法是可以使用轮询Poll,轮询方法就是每隔一段时间,Web客户端自动请求服务器,检查一下是否有新的消息,如果有新消息,则Ajax更新这段时间产生的消息。但大家都知道轮询的代价很大,所以希望找到一个替代方法。

最近在网上看到Comet模型,Wiki上如是说:

Comet is a web application model in which a long-held HTTP request allows a web server to push data to a browser, without the browser explicitly requesting it.

是说Commet模型是在长期持有HTTP请求中,允许web服务器推送数据到浏览器。

Google AppEngine的Channel API就是实现了Comet模型的一个服务,用起来也是简单实用。对于服务端提供了create_channel(创建channel)和send_message(给某个channel发送消息)方法。细节参见这里

Web客户端提供了一个Channel类,需要由服务器端的create_channel方法产生的token进行实例化,然后调用open方法,打开和服务器沟通的channel。这个类提供了一个重要的属性onmessage,可以通过给onmessage赋值一个回调函数,来响应Web客户端收到的消息。Channel还提供了响应的onopen,onerror,onclose属性,细节参见这里

这样Web网页版的聊天也就简单多了。思路就是当Web用户发送消息时,遍历所有存在的Channel进行消息转发。

然后在将机器人和Web网页版进行相关整合,机器人+Web群聊就诞生了。

最后总结一句话:发送消息时,由机器人转发所有登录桌面客户端的用户,再通过遍历所有Channel将消息转发给所有在Web网页上聊天的用户。

注:本人才疏学浅,不敢保证一些细节上的问题,这时GIYF。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: